diff --git a/Data/Scripts/001_Settings.rb b/Data/Scripts/001_Settings.rb index a81c938d7..02de22a00 100644 --- a/Data/Scripts/001_Settings.rb +++ b/Data/Scripts/001_Settings.rb @@ -372,12 +372,14 @@ module Settings #============================================================================= - # An array of available languages in the game, and their corresponding message - # file in the Data folder. Edit only if you have 2 or more languages to choose - # from. + # An array of available languages in the game, and their corresponding + # filename. Text files for a language are extracted to a folder called + # "Text_filename_core" or "Text_filename_game", and are recompiled into files + # in the Data folder called "messages_filename_core.dat" or + # "messages_filename_game.dat". LANGUAGES = [ - # ["English", "english.dat"], - # ["Deutsch", "deutsch.dat"] +# ["English", "english"], +# ["Deutsch", "deutsch"] ] #============================================================================= diff --git a/Data/Scripts/001_Technical/003_Intl_Messages.rb b/Data/Scripts/001_Technical/003_Intl_Messages.rb index 8fcfc2244..3bffc7ba5 100644 --- a/Data/Scripts/001_Technical/003_Intl_Messages.rb +++ b/Data/Scripts/001_Technical/003_Intl_Messages.rb @@ -1,171 +1,101 @@ -def pbAddScriptTexts(items, script) - script.scan(/(?:_I)\s*\(\s*\"((?:[^\\\"]*\\\"?)*[^\"]*)\"/) { |s| - string = s[0] - string.gsub!(/\\\"/, "\"") - string.gsub!(/\\\\/, "\\") - items.push(string) - } -end +#=============================================================================== +# +#=============================================================================== +module Translator + module_function -def pbAddRgssScriptTexts(items, script) - script.scan(/(?:_INTL|_ISPRINTF)\s*\(\s*\"((?:[^\\\"]*\\\"?)*[^\"]*)\"/) { |s| - string = s[0] - string.gsub!(/\\r/, "\r") - string.gsub!(/\\n/, "\n") - string.gsub!(/\\1/, "\1") - string.gsub!(/\\\"/, "\"") - string.gsub!(/\\\\/, "\\") - items.push(string) - } -end - -def pbSetTextMessages - Graphics.update - begin - t = Time.now.to_i - texts = [] - $RGSS_SCRIPTS.each do |script| - if Time.now.to_i - t >= 5 - t = Time.now.to_i - Graphics.update + def gather_script_and_event_texts + Graphics.update + begin + t = Time.now.to_i + texts = [] + # Get script texts from Scripts.rxdata + $RGSS_SCRIPTS.each do |script| + if Time.now.to_i - t >= 5 + t = Time.now.to_i + Graphics.update + end + scr = Zlib::Inflate.inflate(script[2]) + find_translatable_text_from_RGSS_script(texts, scr) end - scr = Zlib::Inflate.inflate(script[2]) - pbAddRgssScriptTexts(texts, scr) - end - if safeExists?("Data/PluginScripts.rxdata") - plugin_scripts = load_data("Data/PluginScripts.rxdata") - plugin_scripts.each do |plugin| - plugin[2].each do |script| + # If Scripts.rxdata only has 1 section, scripts have been extracted. Get + # script texts from .rb files in Data/Scripts + if $RGSS_SCRIPTS.length == 1 + Dir.all("Data/Scripts").each do |script_file| if Time.now.to_i - t >= 5 t = Time.now.to_i Graphics.update end - scr = Zlib::Inflate.inflate(script[1]).force_encoding(Encoding::UTF_8) - pbAddRgssScriptTexts(texts, scr) - end - end - end - # Must add messages because this code is used by both game system and Editor - MessageTypes.addMessagesAsHash(MessageTypes::ScriptTexts, texts) - commonevents = load_data("Data/CommonEvents.rxdata") - items = [] - choices = [] - commonevents.compact.each do |event| - if Time.now.to_i - t >= 5 - t = Time.now.to_i - Graphics.update - end - begin - neednewline = false - lastitem = "" - event.list.size.times do |j| - list = event.list[j] - if neednewline && list.code != 401 - if lastitem != "" - lastitem.gsub!(/([^\.\!\?])\s\s+/) { |m| $1 + " " } - items.push(lastitem) - lastitem = "" - end - neednewline = false - end - if list.code == 101 - lastitem += list.parameters[0].to_s - neednewline = true - elsif list.code == 102 - list.parameters[0].length.times do |k| - choices.push(list.parameters[0][k]) - end - neednewline = false - elsif list.code == 401 - lastitem += " " if lastitem != "" - lastitem += list.parameters[0].to_s - neednewline = true - elsif list.code == 355 || list.code == 655 - pbAddScriptTexts(items, list.parameters[0]) - elsif list.code == 111 && list.parameters[0] == 12 - pbAddScriptTexts(items, list.parameters[1]) - elsif list.code == 209 - route = list.parameters[1] - route.list.size.times do |k| - if route.list[k].code == 45 - pbAddScriptTexts(items, route.list[k].parameters[0]) - end - end + File.open(script_file, "rb") do |f| + find_translatable_text_from_RGSS_script(texts, f.read) end end - if neednewline && lastitem != "" - items.push(lastitem) - lastitem = "" + end + # Get script texts from plugin script files + if safeExists?("Data/PluginScripts.rxdata") + plugin_scripts = load_data("Data/PluginScripts.rxdata") + plugin_scripts.each do |plugin| + plugin[2].each do |script| + if Time.now.to_i - t >= 5 + t = Time.now.to_i + Graphics.update + end + scr = Zlib::Inflate.inflate(script[1]).force_encoding(Encoding::UTF_8) + find_translatable_text_from_RGSS_script(texts, scr) + end end end - end - if Time.now.to_i - t >= 5 - t = Time.now.to_i - Graphics.update - end - items |= [] - choices |= [] - items.concat(choices) - MessageTypes.setMapMessagesAsHash(0, items) - mapinfos = pbLoadMapInfos - mapinfos.each_key do |id| - if Time.now.to_i - t >= 5 - t = Time.now.to_i - Graphics.update - end - filename = sprintf("Data/Map%03d.rxdata", id) - next if !pbRgssExists?(filename) - map = load_data(filename) + MessageTypes.addMessagesAsHash(MessageTypes::ScriptTexts, texts) + # Find all text in common events and add them to messages + commonevents = load_data("Data/CommonEvents.rxdata") items = [] choices = [] - map.events.each_value do |event| + commonevents.compact.each do |event| if Time.now.to_i - t >= 5 t = Time.now.to_i Graphics.update end begin - event.pages.size.times do |i| - neednewline = false + neednewline = false + lastitem = "" + event.list.size.times do |j| + list = event.list[j] + if neednewline && list.code != 401 # Continuation of 101 Show Text + if lastitem != "" + lastitem.gsub!(/([^\.\!\?])\s\s+/) { |m| $1 + " " } + items.push(lastitem) + lastitem = "" + end + neednewline = false + end + if list.code == 101 # Show Text + lastitem += list.parameters[0].to_s + neednewline = true + elsif list.code == 102 # Show Choices + list.parameters[0].length.times do |k| + choices.push(list.parameters[0][k]) + end + neednewline = false + elsif list.code == 401 # Continuation of 101 Show Text + lastitem += " " if lastitem != "" + lastitem += list.parameters[0].to_s + neednewline = true + elsif list.code == 355 || list.code == 655 # Script or script continuation line + find_translatable_text_from_event_script(items, list.parameters[0]) + elsif list.code == 111 && list.parameters[0] == 12 # Conditional Branch + find_translatable_text_from_event_script(items, list.parameters[1]) + elsif list.code == 209 # Set Move Route + route = list.parameters[1] + route.list.size.times do |k| + if route.list[k].code == PBMoveRoute::Script + find_translatable_text_from_event_script(items, route.list[k].parameters[0]) + end + end + end + end + if neednewline && lastitem != "" + items.push(lastitem) lastitem = "" - event.pages[i].list.size.times do |j| - list = event.pages[i].list[j] - if neednewline && list.code != 401 - if lastitem != "" - lastitem.gsub!(/([^\.\!\?])\s\s+/) { |m| $1 + " " } - items.push(lastitem) - lastitem = "" - end - neednewline = false - end - if list.code == 101 - lastitem += list.parameters[0].to_s - neednewline = true - elsif list.code == 102 - list.parameters[0].length.times do |k| - choices.push(list.parameters[0][k]) - end - neednewline = false - elsif list.code == 401 - lastitem += " " if lastitem != "" - lastitem += list.parameters[0].to_s - neednewline = true - elsif list.code == 355 || list.code == 655 - pbAddScriptTexts(items, list.parameters[0]) - elsif list.code == 111 && list.parameters[0] == 12 - pbAddScriptTexts(items, list.parameters[1]) - elsif list.code == 209 - route = list.parameters[1] - route.list.size.times do |k| - if route.list[k].code == 45 - pbAddScriptTexts(items, route.list[k].parameters[0]) - end - end - end - end - if neednewline && lastitem != "" - items.push(lastitem) - lastitem = "" - end end end end @@ -176,196 +106,374 @@ def pbSetTextMessages items |= [] choices |= [] items.concat(choices) - MessageTypes.setMapMessagesAsHash(id, items) - if Time.now.to_i - t >= 5 - t = Time.now.to_i - Graphics.update - end - end - rescue Hangup - end - Graphics.update -end - -def pbEachIntlSection(file) - lineno = 1 - re = /^\s*\[\s*([^\]]+)\s*\]\s*$/ - havesection = false - sectionname = nil - lastsection = [] - file.each_line { |line| - if lineno == 1 && line[0].ord == 0xEF && line[1].ord == 0xBB && line[2].ord == 0xBF - line = line[3, line.length - 3] - end - if !line[/^\#/] && !line[/^\s*$/] - if line[re] - if havesection - yield lastsection, sectionname + MessageTypes.setMapMessagesAsHash(0, items) + # Find all text in map events and add them to messages + mapinfos = pbLoadMapInfos + mapinfos.each_key do |id| + if Time.now.to_i - t >= 5 + t = Time.now.to_i + Graphics.update end - lastsection.clear - sectionname = $~[1] - havesection = true - else - if sectionname.nil? - raise _INTL("Expected a section at the beginning of the file (line {1})", lineno) - end - lastsection.push(line.gsub(/\s+$/, "")) - end - end - lineno += 1 - if lineno % 500 == 0 - Graphics.update - end - } - if havesection - yield lastsection, sectionname - end -end - -def pbGetText(infile) - begin - file = File.open(infile, "rb") - rescue - raise _INTL("Can't find {1}", infile) - end - intldat = [] - begin - pbEachIntlSection(file) { |section, name| - next if section.length == 0 - if !name[/^([Mm][Aa][Pp])?(\d+)$/] - raise _INTL("Invalid section name {1}", name) - end - ismap = $~[1] && $~[1] != "" - id = $~[2].to_i - itemlength = 0 - if section[0][/^\d+$/] - intlhash = [] - itemlength = 3 - if ismap - raise _INTL("Section {1} can't be an ordered list (section was recognized as an ordered list because its first line is a number)", name) - end - if section.length % 3 != 0 - raise _INTL("Section {1}'s line count is not divisible by 3 (section was recognized as an ordered list because its first line is a number)", name) - end - else - intlhash = OrderedHash.new - itemlength = 2 - if section.length.odd? - raise _INTL("Section {1} has an odd number of entries (section was recognized as a hash because its first line is not a number)", name) - end - end - i = 0 - loop do - break unless i < section.length - if itemlength == 3 - if !section[i][/^\d+$/] - raise _INTL("Expected a number in section {1}, got {2} instead", name, section[i]) + filename = sprintf("Data/Map%03d.rxdata", id) + next if !pbRgssExists?(filename) + map = load_data(filename) + items = [] + choices = [] + map.events.each_value do |event| + if Time.now.to_i - t >= 5 + t = Time.now.to_i + Graphics.update + end + begin + event.pages.size.times do |i| + neednewline = false + lastitem = "" + event.pages[i].list.size.times do |j| + list = event.pages[i].list[j] + if neednewline && list.code != 401 # Continuation of 101 Show Text + if lastitem != "" + lastitem.gsub!(/([^\.\!\?])\s\s+/) { |m| $1 + " " } + items.push(lastitem) + lastitem = "" + end + neednewline = false + end + if list.code == 101 # Show Text + lastitem += list.parameters[0].to_s + neednewline = true + elsif list.code == 102 # Show Choices + list.parameters[0].length.times do |k| + choices.push(list.parameters[0][k]) + end + neednewline = false + elsif list.code == 401 # Continuation of 101 Show Text + lastitem += " " if lastitem != "" + lastitem += list.parameters[0].to_s + neednewline = true + elsif list.code == 355 || list.code == 655 # Script or script continuation line + find_translatable_text_from_event_script(items, list.parameters[0]) + elsif list.code == 111 && list.parameters[0] == 12 # Conditional Branch + find_translatable_text_from_event_script(items, list.parameters[1]) + elsif list.code == 209 # Set Move Route + route = list.parameters[1] + route.list.size.times do |k| + if route.list[k].code == PBMoveRoute::Script + find_translatable_text_from_event_script(items, route.list[k].parameters[0]) + end + end + end + end + if neednewline && lastitem != "" + items.push(lastitem) + lastitem = "" + end + end end - key = section[i].to_i - i += 1 - else - key = MessageTypes.denormalizeValue(section[i]) end - intlhash[key] = MessageTypes.denormalizeValue(section[i + 1]) - i += 2 - end - if ismap - intldat[0] = [] if !intldat[0] - intldat[0][id] = intlhash - else - intldat[id] = intlhash + if Time.now.to_i - t >= 5 + t = Time.now.to_i + Graphics.update + end + items |= [] + choices |= [] + items.concat(choices) + MessageTypes.setMapMessagesAsHash(id, items) if items.length > 0 + if Time.now.to_i - t >= 5 + t = Time.now.to_i + Graphics.update + end end + rescue Hangup + end + Graphics.update + end + + def find_translatable_text_from_RGSS_script(items, script) + script.force_encoding(Encoding::UTF_8) + script.scan(/(?:_INTL|_ISPRINTF)\s*\(\s*\"((?:[^\\\"]*\\\"?)*[^\"]*)\"/) { |s| + string = s[0] + string.gsub!(/\\r/, "\r") + string.gsub!(/\\n/, "\n") + string.gsub!(/\\1/, "\1") + string.gsub!(/\\\"/, "\"") + string.gsub!(/\\\\/, "\\") + items.push(string) } - ensure - file.close end - return intldat -end -def pbCompileText - outfile = File.open("intl.dat", "wb") - begin - intldat = pbGetText("intl.txt") - Marshal.dump(intldat, outfile) - rescue - raise - ensure - outfile.close + def find_translatable_text_from_event_script(items, script) + script.force_encoding(Encoding::UTF_8) + script.scan(/(?:_I)\s*\(\s*\"((?:[^\\\"]*\\\"?)*[^\"]*)\"/) { |s| + string = s[0] + string.gsub!(/\\\"/, "\"") + string.gsub!(/\\\\/, "\\") + items.push(string) + } + end + + def normalize_value(value) + if value[/[\r\n\t\x01]|^[\[\]]/] + ret = value.dup + ret.gsub!(/\r/, "<>") + ret.gsub!(/\n/, "<>") + ret.gsub!(/\t/, "<>") + ret.gsub!(/\[/, "<<[>>") + ret.gsub!(/\]/, "<<]>>") + ret.gsub!(/\x01/, "<<1>>") + return ret + end + return value + end + + def denormalize_value(value) + if value[/<<[rnt1\[\]]>>/] + ret = value.dup + ret.gsub!(/<<1>>/, "\1") + ret.gsub!(/<>/, "\r") + ret.gsub!(/<>/, "\n") + ret.gsub!(/<<\[>>/, "[") + ret.gsub!(/<<\]>>/, "]") + ret.gsub!(/<>/, "\t") + return ret + end + return value + end + + #============================================================================= + + def extract_text(language_name = "default", core_text = false, separate_map_files = false) + dir_name = sprintf("Text_%s_%s", language_name, (core_text) ? "core" : "game") + msg_window = pbCreateMessageWindow + # Get text for extraction + orig_messages = Translation.new(language_name) + if core_text + language_messages = orig_messages.core_messages + default_messages = orig_messages.default_core_messages + if !default_messages || default_messages.length == 0 + pbMessageDisplay(msg_window, _INTL("The default core messages file \"messages_core.dat\" was not found.")) + pbDisposeMessageWindow(msg_window) + return + end + else + language_messages = orig_messages.game_messages + default_messages = orig_messages.default_game_messages + if !default_messages || default_messages.length == 0 + pbMessageDisplay(msg_window, _INTL("The default game messages file \"messages_game.dat\" was not found.")) + pbDisposeMessageWindow(msg_window) + return + end + end + # Create folder for extracted text files, or delete existing text files from + # existing destination folder + if Dir.safe?(dir_name) + has_files = false + Dir.all(dir_name).each { |f| has_files = true; break } + if has_files && !pbConfirmMessageSerious(_INTL("Replace all text files in folder '{1}'?", dir_name)) + pbDisposeMessageWindow(msg_window) + return + end + Dir.all(dir_name).each { |f| File.delete(f) } + else + Dir.create(dir_name) + end + # Create a lambda function that helps to write text files + write_header = lambda do |f, with_line| + f.write(0xEF.chr) + f.write(0xBB.chr) + f.write(0xBF.chr) + f.write("# To localize this text for a particular language, please\r\n") + f.write("# translate every second line of this file.\r\n") + f.write("\#-------------------------------\r\n") if with_line + end + # Extract the text + pbMessageDisplay(msg_window, "\\ts[]" + _INTL("Extracting text, please wait.") + "\\wtnp[0]") + # Get all the section IDs to cycle through + max_section_id = default_messages.length + max_section_id = language_messages.length if language_messages && language_messages.length > max_section_id + max_section_id.times do |i| + section_name = getConstantName(MessageTypes, i, false) + next if !section_name + if i == MessageTypes::EventTexts + if separate_map_files + map_infos = pbLoadMapInfos + default_messages[i].each_with_index do |map_msgs, map_id| + next if !map_msgs || map_msgs.length == 0 + filename = sprintf("Map%03d", map_id) + filename += " " + map_infos[map_id].name if map_infos[map_id] + File.open(dir_name + "/" + filename + ".txt", "wb") { |f| + write_header.call(f, true) + translated_msgs = language_messages[i][map_id] if language_messages && language_messages[i] + write_section_texts_to_file(f, sprintf("Map%03d", map_id), translated_msgs, map_msgs) + } + end + else + next if !default_messages[i] || default_messages[i].length == 0 + no_difference = true + default_messages[i].each do |map_msgs| + no_difference = false if map_msgs && map_msgs.length > 0 + break if !map_msgs + end + next if no_difference + File.open(dir_name + "/" + section_name + ".txt", "wb") { |f| + write_header.call(f, false) + default_messages[i].each_with_index do |map_msgs, map_id| + next if !map_msgs || map_msgs.length == 0 + f.write("\#-------------------------------\r\n") + translated_msgs = (language_messages && language_messages[i]) ? language_messages[i][map_id] : nil + write_section_texts_to_file(f, sprintf("Map%03d", map_id), translated_msgs, map_msgs) + end + } + end + else # MessageTypes sections + next if !default_messages[i] || default_messages[i].length == 0 + File.open(dir_name + "/" + section_name + ".txt", "wb") { |f| + write_header.call(f, true) + translated_msgs = (language_messages) ? language_messages[i] : nil + write_section_texts_to_file(f, section_name, translated_msgs, default_messages[i]) + } + end + end + msg_window.textspeed = MessageConfig.pbSettingToTextSpeed($PokemonSystem.textspeed) + if core_text + pbMessageDisplay(msg_window, _INTL("All core text was extracted to files in the folder \"{1}\".\1", dir_name)) + else + pbMessageDisplay(msg_window, _INTL("All game text was extracted to files in the folder \"{1}\".\1", dir_name)) + end + pbMessageDisplay(msg_window, _INTL("To localize this text, translate every second line in those files.\1")) + pbMessageDisplay(msg_window, _INTL("After translating, choose \"Compile Translated Text\" in the Debug menu.")) + pbDisposeMessageWindow(msg_window) + end + + def write_section_texts_to_file(f, section_name, language_msgs, original_msgs = nil) + return if !original_msgs + case original_msgs + when Array + f.write("[#{section_name}]\r\n") + original_msgs.length.times do |j| + next if nil_or_empty?(original_msgs[j]) + f.write("#{j}\r\n") + f.write(normalize_value(original_msgs[j]) + "\r\n") + text = (language_msgs && language_msgs[j]) ? language_msgs[j] : original_msgs[j] + f.write(normalize_value(text) + "\r\n") + end + when Hash + f.write("[#{section_name}]\r\n") + keys = original_msgs.keys + keys.each do |key| + next if nil_or_empty?(original_msgs[key]) + f.write(normalize_value(key) + "\r\n") + text = (language_msgs && language_msgs[key]) ? language_msgs[key] : original_msgs[key] + f.write(normalize_value(text) + "\r\n") + end + end + end + + #============================================================================= + + def compile_text(dir_name, dat_filename) + msg_window = pbCreateMessageWindow + pbMessageDisplay(msg_window, "\\ts[]" + _INTL("Compiling text, please wait.") + "\\wtnp[0]") + outfile = File.open("Data/messages_" + dat_filename + ".dat", "wb") + all_text = [] + begin + text_files = Dir.get("Text_" + dir_name, "*.txt") + text_files.each { |file| compile_text_from_file(file, all_text) } + Marshal.dump(all_text, outfile) + rescue + raise + ensure + outfile.close + end + msg_window.textspeed = MessageConfig.pbSettingToTextSpeed($PokemonSystem.textspeed) + pbMessageDisplay(msg_window, + _INTL("Text files in the folder \"Text_{1}\" were successfully compiled into file \"Data/messages_{2}.dat\".", dir_name, dat_filename)) + pbMessageDisplay(msg_window, _INTL("You may need to close the game to see any changes to messages.")) + pbDisposeMessageWindow(msg_window) + end + + def compile_text_from_file(text_file, all_text) + begin + file = File.open(text_file, "rb") + rescue + raise _INTL("Can't find or open '{1}'.", text_file) + end + begin + Compiler.pbEachSection(file) do |contents, section_name| + next if contents.length == 0 + # Get the section number and whether the section contains a map's event text + section_id = -1 + is_map = false + if section_name.to_i != 0 # Section name is a number + section_id = section_name.to_i + elsif hasConst?(MessageTypes, section_name) # Section name is a constant from MessageTypes + section_id = getConst(MessageTypes, section_name) + elsif section_name[/^Map(\d+)$/i] # Section name is a map number (event text) + is_map = true + section_id = $~[1].to_i + end + raise _INTL("Invalid section name {1}", section_name) if section_id < 0 + # Decide whether the section contains text stored in an ordered list (an + # array) or an ordered hash + item_length = 0 + if contents[0][/^\d+$/] # If first line is a number, text is stored in an array + text_hash = [] + item_length = 3 + if is_map + raise _INTL("Section {1} can't be an ordered list (section was recognized as an ordered list because its first line is a number).", section_name) + end + if contents.length % 3 != 0 + raise _INTL("Section {1}'s line count is not divisible by 3 (section was recognized as an ordered list because its first line is a number).", section_name) + end + else # Text is stored in a hash + text_hash = {} + item_length = 2 + if contents.length.odd? + raise _INTL("Section {1} has an odd number of entries (section was recognized as a hash because its first line is not a number).", section_name) + end + end + # Add text in section to ordered list/hash + i = 0 + loop do + if item_length == 3 + if !contents[i][/^\d+$/] + raise _INTL("Expected a number in section {1}, got {2} instead", section_name, contents[i]) + end + key = contents[i].to_i + i += 1 + else + key = denormalize_value(contents[i]) + key = Translation.stringToKey(key) + end + text_hash[key] = denormalize_value(contents[i + 1]) + i += 2 + break if i >= contents.length + end + # Add ordered list/hash (text_hash) to array of all text (all_text) + all_text[MessageTypes::EventTexts] = [] if is_map && !all_text[MessageTypes::EventTexts] + target_section = (is_map) ? all_text[MessageTypes::EventTexts][section_id] : all_text[section_id] + if target_section + if text_hash.is_a?(Hash) + text_hash.keys.each { |key| target_section[key] = text_hash[key] if text_hash[key] } + else # text_hash is an array + text_hash.each_with_index { |line, i| target_section[i] = line if line } + end + elsif is_map + all_text[MessageTypes::EventTexts][section_id] = text_hash + else + all_text[section_id] = text_hash + end + end + ensure + file.close + end end end - - -class OrderedHash < Hash - def initialize - @keys = [] - super - end - - def keys - return @keys.clone - end - - def inspect - str = "{" - @keys.length.times do |i| - str += ", " if i > 0 - str += @keys[i].inspect + "=>" + self[@keys[i]].inspect - end - str += "}" - return str - end - - alias to_s inspect - - def []=(key, value) - oldvalue = self[key] - if !oldvalue && value - @keys.push(key) - elsif !value - @keys |= [] - @keys -= [key] - end - super(key, value) - end - - def self._load(string) - ret = self.new - keysvalues = Marshal.load(string) - keys = keysvalues[0] - values = keysvalues[1] - keys.length.times do |i| - ret[keys[i]] = values[i] - end - return ret - end - - def _dump(_depth = 100) - values = [] - @keys.each do |key| - values.push(self[key]) - end - return Marshal.dump([@keys, values]) - end -end - - - -class Messages - def initialize(filename = nil, delayLoad = false) - @messages = nil - @filename = filename - if @filename && !delayLoad - loadMessageFile(@filename) - end - end - - def delayedLoad - if @filename && !@messages - loadMessageFile(@filename) - @filename = nil - end - end +#=============================================================================== +# +#=============================================================================== +class Translation + attr_reader :core_messages, :game_messages def self.stringToKey(str) if str && str[/[\r\n\t\1]|^\s+|\s+$|\s{2,}/] @@ -378,270 +486,228 @@ class Messages return str end - def self.normalizeValue(value) - if value[/[\r\n\t\x01]|^[\[\]]/] - ret = value.clone - ret.gsub!(/\r/, "<>") - ret.gsub!(/\n/, "<>") - ret.gsub!(/\t/, "<>") - ret.gsub!(/\[/, "<<[>>") - ret.gsub!(/\]/, "<<]>>") - ret.gsub!(/\x01/, "<<1>>") - return ret - end - return value + def initialize(filename = nil, delay_load = false) + @default_core_messages = nil + @default_game_messages = nil + @core_messages = nil # A translation file + @game_messages = nil # A translation file + @filename = filename + load_message_files(@filename) if @filename && !delay_load end - def self.denormalizeValue(value) - if value[/<<[rnt1\[\]]>>/] - ret = value.clone - ret.gsub!(/<<1>>/, "\1") - ret.gsub!(/<>/, "\r") - ret.gsub!(/<>/, "\n") - ret.gsub!(/<<\[>>/, "[") - ret.gsub!(/<<\]>>/, "]") - ret.gsub!(/<>/, "\t") - return ret - end - return value + def default_core_messages + load_default_messages + return @default_core_messages end - def self.writeObject(f, msgs, secname, origMessages = nil) - return if !msgs - case msgs - when Array - f.write("[#{secname}]\r\n") - msgs.length.times do |j| - next if nil_or_empty?(msgs[j]) - value = Messages.normalizeValue(msgs[j]) - origValue = "" - if origMessages - origValue = Messages.normalizeValue(origMessages.get(secname, j)) - else - origValue = Messages.normalizeValue(MessageTypes.get(secname, j)) - end - f.write("#{j}\r\n") - f.write(origValue + "\r\n") - f.write(value + "\r\n") + def default_game_messages + load_default_messages + return @default_game_messages + end + + def load_message_files(filename) + begin + core_filename = sprintf("Data/messages_%s_core.dat", filename) + if safeExists?(core_filename) + pbRgssOpen(core_filename, "rb") { |f| @core_messages = Marshal.load(f) } end - when OrderedHash - f.write("[#{secname}]\r\n") - keys = msgs.keys - keys.each do |key| - next if nil_or_empty?(msgs[key]) - value = Messages.normalizeValue(msgs[key]) - valkey = Messages.normalizeValue(key) - # key is already serialized - f.write(valkey + "\r\n") - f.write(value + "\r\n") + @core_messages = nil if !@core_messages.is_a?(Array) + game_filename = sprintf("Data/messages_%s_game.dat", filename) + if safeExists?(game_filename) + pbRgssOpen(game_filename, "rb") { |f| @game_messages = Marshal.load(f) } end + @game_messages = nil if !@game_messages.is_a?(Array) + rescue + @core_messages = nil + @game_messages = nil end end - def messages - return @messages || [] + def load_default_messages + return if @default_core_messages + begin + if safeExists?("Data/messages_core.dat") + pbRgssOpen("Data/messages_core.dat", "rb") { |f| @default_core_messages = Marshal.load(f) } + end + @default_core_messages = [] if !@default_core_messages.is_a?(Array) + if safeExists?("Data/messages_game.dat") + pbRgssOpen("Data/messages_game.dat", "rb") { |f| @default_game_messages = Marshal.load(f) } + end + @default_game_messages = [] if !@default_game_messages.is_a?(Array) + rescue + @default_core_messages = [] + @default_game_messages = [] + end end - def extract(outfile) -# return if !@messages - origMessages = Messages.new("Data/messages.dat") - File.open(outfile, "wb") { |f| - f.write(0xef.chr) - f.write(0xbb.chr) - f.write(0xbf.chr) - f.write("# To localize this text for a particular language, please\r\n") - f.write("# translate every second line of this file.\r\n") - if origMessages.messages[0] - origMessages.messages[0].length.times do |i| - msgs = origMessages.messages[0][i] - Messages.writeObject(f, msgs, "Map#{i}", origMessages) - end - end - (1...origMessages.messages.length).each do |i| - msgs = origMessages.messages[i] - Messages.writeObject(f, msgs, i, origMessages) - end - } + def save_default_messages + File.open("Data/messages_core.dat", "wb") { |f| Marshal.dump(@default_core_messages, f) } + File.open("Data/messages_game.dat", "wb") { |f| Marshal.dump(@default_game_messages, f) } end def setMessages(type, array) - @messages = [] if !@messages - arr = [] - array.length.times do |i| - arr[i] = (array[i]) ? array[i] : "" - end - @messages[type] = arr + load_default_messages + @default_game_messages[type] = priv_add_to_array(type, array, nil) end def addMessages(type, array) - @messages = [] if !@messages - arr = (@messages[type]) ? @messages[type] : [] - array.length.times do |i| - arr[i] = (array[i]) ? array[i] : (arr[i]) ? arr[i] : "" - end - @messages[type] = arr - end - - def self.createHash(_type, array) - arr = OrderedHash.new - array.length.times do |i| - if array[i] - key = Messages.stringToKey(array[i]) - arr[key] = array[i] - end - end - return arr - end - - def self.addToHash(_type, array, hash) - hash = OrderedHash.new if !hash - array.length.times do |i| - if array[i] - key = Messages.stringToKey(array[i]) - hash[key] = array[i] - end - end - return hash - end - - def setMapMessagesAsHash(type, array) - @messages = [] if !@messages - @messages[0] = [] if !@messages[0] - @messages[0][type] = Messages.createHash(type, array) - end - - def addMapMessagesAsHash(type, array) - @messages = [] if !@messages - @messages[0] = [] if !@messages[0] - @messages[0][type] = Messages.addToHash(type, array, @messages[0][type]) + load_default_messages + @default_game_messages[type] = priv_add_to_array(type, array, @default_game_messages[type]) end def setMessagesAsHash(type, array) - @messages = [] if !@messages - @messages[type] = Messages.createHash(type, array) + load_default_messages + @default_game_messages[type] = priv_add_to_hash(type, array, nil) end def addMessagesAsHash(type, array) - @messages = [] if !@messages - @messages[type] = Messages.addToHash(type, array, @messages[type]) + load_default_messages + @default_game_messages[type] = priv_add_to_hash(type, array, @default_game_messages[type]) end - def saveMessages(filename = nil) - filename = "Data/messages.dat" if !filename - File.open(filename, "wb") { |f| Marshal.dump(@messages, f) } + def setMapMessagesAsHash(map_id, array) + load_default_messages + @default_game_messages[MessageTypes::EventTexts] ||= [] + @default_game_messages[MessageTypes::EventTexts][map_id] = priv_add_to_hash(MessageTypes::EventTexts, array, nil, map_id) end - def loadMessageFile(filename) - begin - pbRgssOpen(filename, "rb") { |f| @messages = Marshal.load(f) } - if !@messages.is_a?(Array) - @messages = nil - raise "Corrupted data" - end - return @messages - rescue - @messages = nil - return nil - end - end - - def set(type, id, value) - delayedLoad - return if !@messages - return if !@messages[type] - @messages[type][id] = value - end - - def getCount(type) - delayedLoad - return 0 if !@messages - return 0 if !@messages[type] - return @messages[type].length + def addMapMessagesAsHash(map_id, array) + load_default_messages + @default_game_messages[MessageTypes::EventTexts] ||= [] + @default_game_messages[MessageTypes::EventTexts][map_id] = priv_add_to_hash( + MessageTypes::EventTexts, array, @default_game_messages[MessageTypes::EventTexts][map_id], map_id) end def get(type, id) - delayedLoad - return "" if !@messages - return "" if !@messages[type] - return "" if !@messages[type][id] - return @messages[type][id] - end - - def getFromHash(type, key) - delayedLoad - return key if !@messages || !@messages[type] || !key - id = Messages.stringToKey(key) - return key if !@messages[type][id] - return @messages[type][id] - end - - def getFromMapHash(type, key) - delayedLoad - return key if !@messages - return key if !@messages[0] - return key if !@messages[0][type] && !@messages[0][0] - id = Messages.stringToKey(key) - if @messages[0][type] && @messages[0][type][id] - return @messages[0][type][id] - elsif @messages[0][0] && @messages[0][0][id] - return @messages[0][0][id] + delayed_load_message_files + if @game_messages && @game_messages[type] && @game_messages[type][id] + return @game_messages[type][id] end - return key + if @core_messages && @core_messages[type] && @core_messages[type][id] + return @core_messages[type][id] + end + return "" + end + + def getFromHash(type, text) + delayed_load_message_files + key = Translation.stringToKey(text) + return text if nil_or_empty?(key) + if @game_messages && @game_messages[type] && @game_messages[type][key] + return @game_messages[type][key] + end + if @core_messages && @core_messages[type] && @core_messages[type][key] + return @core_messages[type][key] + end + return text + end + + def getFromMapHash(map_id, text) + delayed_load_message_files + key = Translation.stringToKey(text) + return text if nil_or_empty?(key) + if @game_messages && @game_messages[MessageTypes::EventTexts] + if @game_messages[MessageTypes::EventTexts][map_id] && @game_messages[MessageTypes::EventTexts][map_id][key] + return @game_messages[MessageTypes::EventTexts][map_id][key] + elsif @game_messages[MessageTypes::EventTexts][0] && @game_messages[MessageTypes::EventTexts][0][key] + return @game_messages[MessageTypes::EventTexts][0][key] + end + end + if @core_messages && @core_messages[MessageTypes::EventTexts] + if @core_messages[MessageTypes::EventTexts][map_id] && @core_messages[MessageTypes::EventTexts][map_id][key] + return @core_messages[MessageTypes::EventTexts][map_id][key] + elsif @core_messages[MessageTypes::EventTexts][0] && @core_messages[MessageTypes::EventTexts][0][key] + return @core_messages[MessageTypes::EventTexts][0][key] + end + end + return text + end + + private + + def delayed_load_message_files + return if !@filename || @core_messages + load_message_files(@filename) + @filename = nil + end + + def priv_add_to_array(type, array, ret) + @default_core_messages[type] ||= [] + ret = [] if !ret + array.each_with_index do |text, i| + ret[i] = text if !nil_or_empty?(text) && @default_core_messages[type][i] != text + end + return ret + end + + def priv_add_to_hash(type, array, ret, map_id = 0) + if type == MessageTypes::EventTexts + @default_core_messages[type] ||= [] + @default_core_messages[type][map_id] ||= {} + default_keys = @default_core_messages[type][map_id].keys + else + @default_core_messages[type] ||= {} + default_keys = @default_core_messages[type].keys + end + ret = {} if !ret + array.each do |text| + next if !text + key = Translation.stringToKey(text) + ret[key] = text if !default_keys.include?(key) + end + return ret end end - - +#=============================================================================== +# +#=============================================================================== module MessageTypes - # Value 0 is used for common event and map event text - Species = 1 - Kinds = 2 - Entries = 3 - FormNames = 4 - Moves = 5 - MoveDescriptions = 6 - Items = 7 - ItemPlurals = 8 - ItemDescriptions = 9 - Abilities = 10 - AbilityDescs = 11 - Types = 12 - TrainerTypes = 13 - TrainerNames = 14 - BeginSpeech = 15 - EndSpeechWin = 16 - EndSpeechLose = 17 - RegionNames = 18 - PlaceNames = 19 - PlaceDescriptions = 20 - MapNames = 21 - PhoneMessages = 22 - TrainerLoseText = 23 - ScriptTexts = 24 - RibbonNames = 25 - RibbonDescriptions = 26 - StorageCreator = 27 - @@messages = Messages.new - @@messagesFallback = Messages.new("Data/messages.dat", true) + # NOTE: These constants aren't numbered in any particular order, but these + # numbers are retained for backwards compatibility with older extracted + # text files. + EventTexts = 0 # Used for text in both common events and map events + Species = 1 + SpeciesCategories = 2 + PokedexEntries = 3 + SpeciesForms = 4 + Moves = 5 + MoveDescriptions = 6 + Items = 7 + ItemPlurals = 8 + ItemDescriptions = 9 + Abilities = 10 + AbilityDescriptions = 11 + Types = 12 + TrainerTypes = 13 + TrainerNames = 14 + FrontierIntroSpeeches = 15 + FrontierEndSpeechesWin = 16 + FrontierEndSpeechesLose = 17 + Regions = 18 + RegionLocations = 19 + RegionDescriptions = 20 + MapNames = 21 + PhoneMessages = 22 + TrainerLoseTexts = 23 + ScriptTexts = 24 + RibbonNames = 25 + RibbonDescriptions = 26 + StorageCreator = 27 + ItemPortions = 28 + ItemPortionPlurals = 29 + @@messages = Translation.new - def self.stringToKey(str) - return Messages.stringToKey(str) + def self.load_default_messages + @@messages.load_default_messages end - def self.normalizeValue(value) - return Messages.normalizeValue(value) + def self.load_message_files(filename) + @@messages.load_message_files(filename) end - def self.denormalizeValue(value) - Messages.denormalizeValue(value) - end - - def self.writeObject(f, msgs, secname) - Messages.denormalizeValue(str) - end - - def self.extract(outfile) - @@messages.extract(outfile) + def self.save_default_messages + @@messages.save_default_messages end def self.setMessages(type, array) @@ -652,71 +718,38 @@ module MessageTypes @@messages.addMessages(type, array) end - def self.createHash(type, array) - Messages.createHash(type, array) - end - - def self.addMapMessagesAsHash(type, array) - @@messages.addMapMessagesAsHash(type, array) - end - - def self.setMapMessagesAsHash(type, array) - @@messages.setMapMessagesAsHash(type, array) + def self.setMessagesAsHash(type, array) + @@messages.setMessagesAsHash(type, array) end def self.addMessagesAsHash(type, array) @@messages.addMessagesAsHash(type, array) end - def self.setMessagesAsHash(type, array) - @@messages.setMessagesAsHash(type, array) + def self.setMapMessagesAsHash(type, array) + @@messages.setMapMessagesAsHash(type, array) end - def self.saveMessages(filename = nil) - @@messages.saveMessages(filename) - end - - def self.loadMessageFile(filename) - @@messages.loadMessageFile(filename) + def self.addMapMessagesAsHash(type, array) + @@messages.addMapMessagesAsHash(type, array) end def self.get(type, id) - ret = @@messages.get(type, id) - if ret == "" - ret = @@messagesFallback.get(type, id) - end - return ret - end - - def self.getCount(type) - c1 = @@messages.getCount(type) - c2 = @@messagesFallback.getCount(type) - return c1 > c2 ? c1 : c2 - end - - def self.getOriginal(type, id) - return @@messagesFallback.get(type, id) + return @@messages.get(type, id) end def self.getFromHash(type, key) - @@messages.getFromHash(type, key) + return @@messages.getFromHash(type, key) end def self.getFromMapHash(type, key) - @@messages.getFromMapHash(type, key) + return @@messages.getFromMapHash(type, key) end end - - -def pbLoadMessages(file) - return MessageTypes.loadMessageFile(file) -end - -def pbGetMessageCount(type) - return MessageTypes.getCount(type) -end - +#=============================================================================== +# +#=============================================================================== def pbGetMessage(type, id) return MessageTypes.get(type, id) end diff --git a/Data/Scripts/003_Game processing/001_StartGame.rb b/Data/Scripts/003_Game processing/001_StartGame.rb index 10d86b247..05f51a011 100644 --- a/Data/Scripts/003_Game processing/001_StartGame.rb +++ b/Data/Scripts/003_Game processing/001_StartGame.rb @@ -30,7 +30,7 @@ module Game # Set language (and choose language if there is no save file) if Settings::LANGUAGES.length >= 2 $PokemonSystem.language = pbChooseLanguage if save_data.empty? - pbLoadMessages("Data/" + Settings::LANGUAGES[$PokemonSystem.language][1]) + MessageTypes.load_message_files(Settings::LANGUAGES[$PokemonSystem.language][1]) end end diff --git a/Data/Scripts/003_Game processing/002_Scene_Map.rb b/Data/Scripts/003_Game processing/002_Scene_Map.rb index 7309669fb..ad261d02e 100644 --- a/Data/Scripts/003_Game processing/002_Scene_Map.rb +++ b/Data/Scripts/003_Game processing/002_Scene_Map.rb @@ -188,7 +188,7 @@ class Scene_Map end end return if $game_temp.message_window_showing - if !pbMapInterpreterRunning? + if !pbMapInterpreterRunning? && !$PokemonGlobal.ice_sliding if Input.trigger?(Input::USE) $game_temp.interact_calling = true elsif Input.trigger?(Input::ACTION) diff --git a/Data/Scripts/004_Game classes/001_Game_Screen.rb b/Data/Scripts/004_Game classes/001_Game_Screen.rb index 62d7c69b3..e93cc76ce 100644 --- a/Data/Scripts/004_Game classes/001_Game_Screen.rb +++ b/Data/Scripts/004_Game classes/001_Game_Screen.rb @@ -4,7 +4,6 @@ # This class handles screen maintenance data, such as change in color tone, # flashing, etc. Refer to "$game_screen" for the instance of this class. #=============================================================================== - class Game_Screen #----------------------------------------------------------------------------- # * Public Instance Variables diff --git a/Data/Scripts/004_Game classes/004_Game_Map.rb b/Data/Scripts/004_Game classes/004_Game_Map.rb index 983fc952e..dc99b8bf8 100644 --- a/Data/Scripts/004_Game classes/004_Game_Map.rb +++ b/Data/Scripts/004_Game classes/004_Game_Map.rb @@ -234,7 +234,7 @@ class Game_Map # Make water tiles passable if player is surfing return true if $PokemonGlobal.surfing && terrain.can_surf && !terrain.waterfall # Prevent cycling in really tall grass/on ice - return false if $PokemonGlobal.bicycle && terrain.must_walk + return false if $PokemonGlobal.bicycle && (terrain.must_walk || terrain.must_walk_or_run) # Depend on passability of bridge tile if on bridge if terrain.bridge && $PokemonGlobal.bridge > 0 return (passage & bit == 0 && passage & 0x0f != 0x0f) diff --git a/Data/Scripts/004_Game classes/009_Game_Player.rb b/Data/Scripts/004_Game classes/009_Game_Player.rb index 7ed090440..c38be6037 100644 --- a/Data/Scripts/004_Game classes/009_Game_Player.rb +++ b/Data/Scripts/004_Game classes/009_Game_Player.rb @@ -135,7 +135,7 @@ class Game_Player < Game_Character else $stats.distance_walked += 1 end - $stats.distance_slid_on_ice += 1 if $PokemonGlobal.sliding + $stats.distance_slid_on_ice += 1 if $PokemonGlobal.ice_sliding increase_steps end elsif !check_event_trigger_touch(dir) @@ -423,12 +423,12 @@ class Game_Player < Game_Character def update last_real_x = @real_x last_real_y = @real_y + @last_terrain_tag = pbTerrainTag super update_stop if $game_temp.in_menu && @stopped_last_frame update_screen_position(last_real_x, last_real_y) # Update dependent events - if (!@moved_last_frame || @stopped_last_frame || - (@stopped_this_frame && $PokemonGlobal.sliding)) && (moving? || jumping?) + if (!@moved_last_frame || @stopped_last_frame) && (moving? || jumping?) $game_temp.followers.move_followers end $game_temp.followers.update @@ -445,8 +445,10 @@ class Game_Player < Game_Character def update_command_new dir = Input.dir4 - unless pbMapInterpreterRunning? || $game_temp.message_window_showing || - $game_temp.in_mini_update || $game_temp.in_menu + if $PokemonGlobal.ice_sliding + move_forward + elsif !pbMapInterpreterRunning? && !$game_temp.message_window_showing && + !$game_temp.in_mini_update && !$game_temp.in_menu # Move player in the direction the directional button is being pressed if @moved_last_frame || (dir > 0 && dir == @lastdir && Graphics.frame_count - @lastdirframe > Graphics.frame_rate / 20) @@ -472,7 +474,7 @@ class Game_Player < Game_Character def update_move if !@moved_last_frame || @stopped_last_frame # Started a new step - if pbTerrainTag.ice + if $PokemonGlobal.ice_sliding || @last_terrain_tag.ice set_movement_type(:ice_sliding) else faster = can_run? @@ -543,7 +545,7 @@ class Game_Player < Game_Character end def update_event_triggering - return if moving? + return if moving? || $PokemonGlobal.ice_sliding # Try triggering events upon walking into them/in front of them if @moved_this_frame $game_temp.followers.turn_followers diff --git a/Data/Scripts/004_Game classes/012_Game_FollowerFactory.rb b/Data/Scripts/004_Game classes/012_Game_FollowerFactory.rb index 1619f3db5..5d76476d7 100644 --- a/Data/Scripts/004_Game classes/012_Game_FollowerFactory.rb +++ b/Data/Scripts/004_Game classes/012_Game_FollowerFactory.rb @@ -254,7 +254,7 @@ class Game_FollowerFactory end event.move_speed = leader.move_speed event.transparent = !follower.visible? - if $PokemonGlobal.sliding + if $PokemonGlobal.ice_sliding event.straighten event.walk_anime = false else diff --git a/Data/Scripts/007_Objects and windows/011_Messages.rb b/Data/Scripts/007_Objects and windows/011_Messages.rb index 0f1153a43..f73d438e9 100644 --- a/Data/Scripts/007_Objects and windows/011_Messages.rb +++ b/Data/Scripts/007_Objects and windows/011_Messages.rb @@ -260,9 +260,11 @@ def pbGetBasicMapNameFromId(id) end def pbGetMapNameFromId(id) - name = pbGetMessage(MessageTypes::MapNames, id) - name = pbGetBasicMapNameFromId(id) if nil_or_empty?(name) - name.gsub!(/\\PN/, $player.name) if $player + name = GameData::MapMetadata.get(id)&.name + if nil_or_empty?(name) + name = pbGetBasicMapNameFromId(id) + name.gsub!(/\\PN/, $player.name) if $player + end return name end diff --git a/Data/Scripts/010_Data/001_Hardcoded data/011_TerrainTag.rb b/Data/Scripts/010_Data/001_Hardcoded data/011_TerrainTag.rb index 4c188fa98..16a3c4c9f 100644 --- a/Data/Scripts/010_Data/001_Hardcoded data/011_TerrainTag.rb +++ b/Data/Scripts/010_Data/001_Hardcoded data/011_TerrainTag.rb @@ -57,6 +57,7 @@ module GameData @bridge = hash[:bridge] || false @shows_reflections = hash[:shows_reflections] || false @must_walk = hash[:must_walk] || false + @must_walk_or_run = hash[:must_walk_or_run] || false @ignore_passability = hash[:ignore_passability] || false end @@ -163,7 +164,7 @@ GameData::TerrainTag.register({ :id_number => 12, :battle_environment => :Ice, :ice => true, - :must_walk => true + :must_walk_or_run => true }) GameData::TerrainTag.register({ diff --git a/Data/Scripts/010_Data/002_PBS data/002_TownMap.rb b/Data/Scripts/010_Data/002_PBS data/002_TownMap.rb index 53b1996ae..bf161e340 100644 --- a/Data/Scripts/010_Data/002_PBS data/002_TownMap.rb +++ b/Data/Scripts/010_Data/002_PBS data/002_TownMap.rb @@ -15,7 +15,7 @@ module GameData "SectionName" => [:id, "u"], "Name" => [:real_name, "s"], "Filename" => [:filename, "s"], - "Point" => [:point, "^uussUUUU"], + "Point" => [:point, "^uusSUUUU"], "Flags" => [:flags, "*s"] } @@ -33,7 +33,7 @@ module GameData # @return [String] the translated name of this region def name - return pbGetMessage(MessageTypes::RegionNames, @id) + return pbGetMessageFromHash(MessageTypes::Regions, @real_name) end def has_flag?(flag) diff --git a/Data/Scripts/010_Data/002_PBS data/004_Ability.rb b/Data/Scripts/010_Data/002_PBS data/004_Ability.rb index 3ac438a41..c3d59d7b4 100644 --- a/Data/Scripts/010_Data/002_PBS data/004_Ability.rb +++ b/Data/Scripts/010_Data/002_PBS data/004_Ability.rb @@ -35,7 +35,7 @@ module GameData # @return [String] the translated description of this ability def description - return pbGetMessageFromHash(MessageTypes::AbilityDescs, @real_description) + return pbGetMessageFromHash(MessageTypes::AbilityDescriptions, @real_description) end def has_flag?(flag) 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 6ccc702c6..af01994b7 100644 --- a/Data/Scripts/010_Data/002_PBS data/006_Item.rb +++ b/Data/Scripts/010_Data/002_PBS data/006_Item.rb @@ -3,6 +3,8 @@ module GameData attr_reader :id attr_reader :real_name attr_reader :real_name_plural + attr_reader :real_portion_name + attr_reader :real_portion_name_plural attr_reader :pocket attr_reader :price attr_reader :sell_price @@ -20,21 +22,23 @@ module GameData PBS_BASE_FILENAME = "items" SCHEMA = { - "SectionName" => [:id, "m"], - "Name" => [:real_name, "s"], - "NamePlural" => [:real_name_plural, "s"], - "Pocket" => [:pocket, "v"], - "Price" => [:price, "u"], - "SellPrice" => [:sell_price, "u"], - "BPPrice" => [:bp_price, "u"], - "FieldUse" => [:field_use, "e", { "OnPokemon" => 1, "Direct" => 2, "TM" => 3, - "HM" => 4, "TR" => 5 }], - "BattleUse" => [:battle_use, "e", { "OnPokemon" => 1, "OnMove" => 2, "OnBattler" => 3, - "OnFoe" => 4, "Direct" => 5 }], - "Flags" => [:flags, "*s"], - "Consumable" => [:consumable, "b"], - "Move" => [:move, "e", :Move], - "Description" => [:real_description, "q"] + "SectionName" => [:id, "m"], + "Name" => [:real_name, "s"], + "NamePlural" => [:real_name_plural, "s"], + "PortionName" => [:real_portion_name, "s"], + "PortionNamePlural" => [:real_portion_name_plural, "s"], + "Pocket" => [:pocket, "v"], + "Price" => [:price, "u"], + "SellPrice" => [:sell_price, "u"], + "BPPrice" => [:bp_price, "u"], + "FieldUse" => [:field_use, "e", { "OnPokemon" => 1, "Direct" => 2, + "TM" => 3, "HM" => 4, "TR" => 5 }], + "BattleUse" => [:battle_use, "e", { "OnPokemon" => 1, "OnMove" => 2, + "OnBattler" => 3, "OnFoe" => 4, "Direct" => 5 }], + "Flags" => [:flags, "*s"], + "Consumable" => [:consumable, "b"], + "Move" => [:move, "e", :Move], + "Description" => [:real_description, "q"] } extend ClassMethodsSymbols @@ -108,21 +112,23 @@ module GameData end def initialize(hash) - @id = hash[:id] - @real_name = hash[:real_name] || "Unnamed" - @real_name_plural = hash[:real_name_plural] || "Unnamed" - @pocket = hash[:pocket] || 1 - @price = hash[:price] || 0 - @sell_price = hash[:sell_price] || (@price / 2) - @bp_price = hash[:bp_price] || 1 - @field_use = hash[:field_use] || 0 - @battle_use = hash[:battle_use] || 0 - @flags = hash[:flags] || [] - @consumable = hash[:consumable] - @consumable = !is_important? if @consumable.nil? - @move = hash[:move] - @real_description = hash[:real_description] || "???" - @pbs_file_suffix = hash[:pbs_file_suffix] || "" + @id = hash[:id] + @real_name = hash[:real_name] || "Unnamed" + @real_name_plural = hash[:real_name_plural] || "Unnamed" + @real_portion_name = hash[:real_portion_name] + @real_portion_name_plural = hash[:real_portion_name_plural] + @pocket = hash[:pocket] || 1 + @price = hash[:price] || 0 + @sell_price = hash[:sell_price] || (@price / 2) + @bp_price = hash[:bp_price] || 1 + @field_use = hash[:field_use] || 0 + @battle_use = hash[:battle_use] || 0 + @flags = hash[:flags] || [] + @consumable = hash[:consumable] + @consumable = !is_important? if @consumable.nil? + @move = hash[:move] + @real_description = hash[:real_description] || "???" + @pbs_file_suffix = hash[:pbs_file_suffix] || "" end # @return [String] the translated name of this item @@ -135,6 +141,18 @@ module GameData return pbGetMessageFromHash(MessageTypes::ItemPlurals, @real_name_plural) end + # @return [String] the translated portion name of this item + def portion_name + return pbGetMessageFromHash(MessageTypes::ItemPortions, @real_portion_name) if @real_portion_name + return name + end + + # @return [String] the translated plural version of the portion name of this item + def portion_name_plural + return pbGetMessageFromHash(MessageTypes::ItemPortionPlurals, @real_portion_name_plural) if @real_portion_name_plural + return name_plural + end + # @return [String] the translated description of this item def description return pbGetMessageFromHash(MessageTypes::ItemDescriptions, @real_description) diff --git a/Data/Scripts/010_Data/002_PBS data/008_Species.rb b/Data/Scripts/010_Data/002_PBS data/008_Species.rb index 202ad0257..8e5aacef5 100644 --- a/Data/Scripts/010_Data/002_PBS data/008_Species.rb +++ b/Data/Scripts/010_Data/002_PBS data/008_Species.rb @@ -225,17 +225,17 @@ module GameData # @return [String] the translated name of this form of this species def form_name - return pbGetMessageFromHash(MessageTypes::FormNames, @real_form_name) + return pbGetMessageFromHash(MessageTypes::SpeciesForms, @real_form_name) end # @return [String] the translated Pokédex category of this species def category - return pbGetMessageFromHash(MessageTypes::Kinds, @real_category) + return pbGetMessageFromHash(MessageTypes::SpeciesCategories, @real_category) end # @return [String] the translated Pokédex entry of this species def pokedex_entry - return pbGetMessageFromHash(MessageTypes::Entries, @real_pokedex_entry) + return pbGetMessageFromHash(MessageTypes::PokedexEntries, @real_pokedex_entry) end def default_form diff --git a/Data/Scripts/010_Data/002_PBS data/015_Trainer.rb b/Data/Scripts/010_Data/002_PBS data/015_Trainer.rb index 7192b96ff..0d206b36f 100644 --- a/Data/Scripts/010_Data/002_PBS data/015_Trainer.rb +++ b/Data/Scripts/010_Data/002_PBS data/015_Trainer.rb @@ -107,7 +107,7 @@ module GameData # @return [String] the translated in-battle lose message of this trainer def lose_text - return pbGetMessageFromHash(MessageTypes::TrainerLoseText, @real_lose_text) + return pbGetMessageFromHash(MessageTypes::TrainerLoseTexts, @real_lose_text) end # Creates a battle-ready version of a trainer's data. diff --git a/Data/Scripts/010_Data/002_PBS data/018_MapMetadata.rb b/Data/Scripts/010_Data/002_PBS data/018_MapMetadata.rb index 06f57c58a..8068d96ad 100644 --- a/Data/Scripts/010_Data/002_PBS data/018_MapMetadata.rb +++ b/Data/Scripts/010_Data/002_PBS data/018_MapMetadata.rb @@ -115,7 +115,10 @@ module GameData # @return [String] the translated name of this map def name - return pbGetMapNameFromId(@id) + ret = pbGetMessageFromHash(MessageTypes::MapNames, @real_name) + ret = pbGetBasicMapNameFromId(@id) if nil_or_empty?(ret) + ret.gsub!(/\\PN/, $player.name) if $player + return ret end def has_flag?(flag) 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 0731e4915..71bf57184 100644 --- a/Data/Scripts/011_Battle/001_Battle/006_Battle_ActionUseItem.rb +++ b/Data/Scripts/011_Battle/001_Battle/006_Battle_ActionUseItem.rb @@ -75,7 +75,7 @@ class Battle end def pbUseItemMessage(item, trainerName) - itemName = GameData::Item.get(item).name + itemName = GameData::Item.get(item).portion_name if itemName.starts_with_vowel? pbDisplayBrief(_INTL("{1} used an {2}.", trainerName, itemName)) else diff --git a/Data/Scripts/011_Battle/006_Other battle code/010_Battle_PokeBallEffects.rb b/Data/Scripts/011_Battle/006_Other battle code/010_Battle_PokeBallEffects.rb index 755aa4d4c..29ccd76cc 100644 --- a/Data/Scripts/011_Battle/006_Other battle code/010_Battle_PokeBallEffects.rb +++ b/Data/Scripts/011_Battle/006_Other battle code/010_Battle_PokeBallEffects.rb @@ -191,5 +191,5 @@ Battle::PokeBallEffects::OnCatch.add(:HEALBALL, proc { |ball, battle, pkmn| }) Battle::PokeBallEffects::OnCatch.add(:FRIENDBALL, proc { |ball, battle, pkmn| - pkmn.happiness = 200 + pkmn.happiness = (Settings::APPLY_HAPPINESS_SOFT_CAP) ? 150 : 200 }) diff --git a/Data/Scripts/012_Overworld/001_Overworld.rb b/Data/Scripts/012_Overworld/001_Overworld.rb index 0fab28480..5276e750c 100644 --- a/Data/Scripts/012_Overworld/001_Overworld.rb +++ b/Data/Scripts/012_Overworld/001_Overworld.rb @@ -166,7 +166,7 @@ EventHandlers.add(:on_step_taken, :auto_move_player, currentTag = $game_player.pbTerrainTag if currentTag.waterfall_crest pbDescendWaterfall - elsif currentTag.ice && !$PokemonGlobal.sliding + elsif currentTag.ice || $PokemonGlobal.ice_sliding pbSlideOnIce end } @@ -573,30 +573,14 @@ def pbLedge(_xOffset, _yOffset) end def pbSlideOnIce - return if !$game_player.pbTerrainTag.ice - $game_temp.followers.update - $PokemonGlobal.sliding = true - direction = $game_player.direction - oldwalkanime = $game_player.walk_anime - $game_player.straighten - $game_player.walk_anime = false - first_loop = true - loop do - break if !$game_player.can_move_in_direction?(direction) - break if !$game_player.pbTerrainTag.ice - $game_player.move_forward - $game_temp.followers.move_followers if first_loop - while $game_player.moving? - pbUpdateSceneMap - Graphics.update - Input.update - end - first_loop = false + if $game_player.pbTerrainTag.ice && $game_player.can_move_in_direction?($game_player.direction) + $PokemonGlobal.ice_sliding = true + $game_player.straighten + $game_player.walk_anime = false + return end - $game_player.center($game_player.x, $game_player.y) - $game_player.straighten - $game_player.walk_anime = oldwalkanime - $PokemonGlobal.sliding = false + $PokemonGlobal.ice_sliding = false + $game_player.walk_anime = true end def pbTurnTowardEvent(event, otherEvent) @@ -734,14 +718,12 @@ end def pbItemBall(item, quantity = 1) item = GameData::Item.get(item) return false if !item || quantity < 1 - itemname = (quantity > 1) ? item.name_plural : item.name + itemname = (quantity > 1) ? item.portion_name_plural : item.portion_name pocket = item.pocket move = item.move if $bag.add(item, quantity) # If item can be picked up meName = (item.is_key_item?) ? "Key item get" : "Item get" - if item == :LEFTOVERS - pbMessage(_INTL("\\me[{1}]You found some \\c[1]{2}\\c[0]!\\wtnp[30]", meName, itemname)) - elsif item == :DNASPLICERS + if item == :DNASPLICERS pbMessage(_INTL("\\me[{1}]You found \\c[1]{2}\\c[0]!\\wtnp[30]", meName, itemname)) elsif item.is_machine? # TM or HM pbMessage(_INTL("\\me[{1}]You found \\c[1]{2} {3}\\c[0]!\\wtnp[30]", meName, itemname, GameData::Move.get(move).name)) @@ -757,9 +739,7 @@ def pbItemBall(item, quantity = 1) return true end # Can't add the item - if item == :LEFTOVERS - pbMessage(_INTL("You found some \\c[1]{1}\\c[0]!\\wtnp[30]", itemname)) - elsif item.is_machine? # TM or HM + if item.is_machine? # TM or HM pbMessage(_INTL("You found \\c[1]{1} {2}\\c[0]!\\wtnp[30]", itemname, GameData::Move.get(move).name)) elsif quantity > 1 pbMessage(_INTL("You found {1} \\c[1]{2}\\c[0]!\\wtnp[30]", quantity, itemname)) @@ -780,13 +760,11 @@ end def pbReceiveItem(item, quantity = 1) item = GameData::Item.get(item) return false if !item || quantity < 1 - itemname = (quantity > 1) ? item.name_plural : item.name + itemname = (quantity > 1) ? item.portion_name_plural : item.portion_name pocket = item.pocket move = item.move meName = (item.is_key_item?) ? "Key item get" : "Item get" - if item == :LEFTOVERS - pbMessage(_INTL("\\me[{1}]You obtained some \\c[1]{2}\\c[0]!\\wtnp[30]", meName, itemname)) - elsif item == :DNASPLICERS + if item == :DNASPLICERS pbMessage(_INTL("\\me[{1}]You obtained \\c[1]{2}\\c[0]!\\wtnp[30]", meName, itemname)) elsif item.is_machine? # TM or HM pbMessage(_INTL("\\me[{1}]You obtained \\c[1]{2} {3}\\c[0]!\\wtnp[30]", meName, itemname, GameData::Move.get(move).name)) @@ -811,7 +789,7 @@ end def pbBuyPrize(item, quantity = 1) item = GameData::Item.get(item) return false if !item || quantity < 1 - item_name = (quantity > 1) ? item.name_plural : item.name + item_name = (quantity > 1) ? item.portion_name_plural : item.portion_name pocket = item.pocket return false if !$bag.add(item, quantity) pbMessage(_INTL("\\CNYou put the {1} in\\nyour Bag's \\c[1]{3}\\c[0] pocket.", diff --git a/Data/Scripts/012_Overworld/002_Overworld_Metadata.rb b/Data/Scripts/012_Overworld/002_Overworld_Metadata.rb index 69d64f050..a72190551 100644 --- a/Data/Scripts/012_Overworld/002_Overworld_Metadata.rb +++ b/Data/Scripts/012_Overworld/002_Overworld_Metadata.rb @@ -7,7 +7,7 @@ class PokemonGlobalMetadata attr_accessor :bicycle attr_accessor :surfing attr_accessor :diving - attr_accessor :sliding + attr_accessor :ice_sliding attr_accessor :fishing # Player data attr_accessor :startTime @@ -58,7 +58,7 @@ class PokemonGlobalMetadata @bicycle = false @surfing = false @diving = false - @sliding = false + @ice_sliding = false @fishing = false # Player data @startTime = Time.now diff --git a/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb b/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb index 1271ab429..a5e9570df 100644 --- a/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb +++ b/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb @@ -436,7 +436,7 @@ end #=============================================================================== def pbPickBerry(berry, qty = 1) berry = GameData::Item.get(berry) - berry_name = (qty > 1) ? berry.name_plural : berry.name + berry_name = (qty > 1) ? berry.portion_name_plural : berry.portion_name if qty > 1 message = _INTL("There are {1} \\c[1]{2}\\c[0]!\nWant to pick them?", qty, berry_name) else diff --git a/Data/Scripts/013_Items/001_Item_Utilities.rb b/Data/Scripts/013_Items/001_Item_Utilities.rb index 7e0b9ad1f..6bfc67e50 100644 --- a/Data/Scripts/013_Items/001_Item_Utilities.rb +++ b/Data/Scripts/013_Items/001_Item_Utilities.rb @@ -522,7 +522,8 @@ end #=============================================================================== def pbBikeCheck if $PokemonGlobal.surfing || $PokemonGlobal.diving || - (!$PokemonGlobal.bicycle && $game_player.pbTerrainTag.must_walk) + (!$PokemonGlobal.bicycle && + ($game_player.pbTerrainTag.must_walk || $game_player.pbTerrainTag.must_walk_or_run)) pbMessage(_INTL("Can't use that here.")) return false end @@ -671,7 +672,7 @@ def pbUseItem(bag, item, bagscene = nil) max_at_once = [max_at_once, $bag.quantity(item)].min if max_at_once > 1 qty = screen.scene.pbChooseNumber( - _INTL("How many {1} do you want to use?", GameData::Item.get(item).name), max_at_once + _INTL("How many {1} do you want to use?", GameData::Item.get(item).portion_name_plural), max_at_once ) screen.scene.pbSetHelpText("") if screen.is_a?(PokemonPartyScreen) end @@ -680,7 +681,7 @@ def pbUseItem(bag, item, bagscene = nil) next unless ret && itm.consumed_after_use? bag.remove(item, qty) next if bag.has?(item) - pbMessage(_INTL("You used your last {1}.", itm.name)) { screen.pbUpdate } + pbMessage(_INTL("You used your last {1}.", itm.portion_name)) { screen.pbUpdate } break end screen.pbEndScene @@ -714,7 +715,7 @@ def pbUseItemOnPokemon(item, pkmn, scene) elsif !pkmn.compatible_with_move?(machine) pbMessage(_INTL("{1} can't learn {2}.", pkmn.name, movename)) { scene.pbUpdate } else - pbMessage(_INTL("\\se[PC access]You booted up {1}.\1", itm.name)) { scene.pbUpdate } + pbMessage(_INTL("\\se[PC access]You booted up the {1}.\1", itm.portion_name)) { 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 } $bag.remove(item) if itm.consumed_after_use? @@ -730,7 +731,7 @@ def pbUseItemOnPokemon(item, pkmn, scene) max_at_once = [max_at_once, $bag.quantity(item)].min if max_at_once > 1 qty = scene.scene.pbChooseNumber( - _INTL("How many {1} do you want to use?", itm.name), max_at_once + _INTL("How many {1} do you want to use?", itm.portion_name_plural), max_at_once ) scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) end @@ -741,7 +742,7 @@ def pbUseItemOnPokemon(item, pkmn, scene) if ret && itm.consumed_after_use? $bag.remove(item, qty) if !$bag.has?(item) - pbMessage(_INTL("You used your last {1}.", itm.name)) { scene.pbUpdate } + pbMessage(_INTL("You used your last {1}.", itm.portion_name)) { scene.pbUpdate } end end return ret @@ -758,7 +759,7 @@ def pbUseKeyItemInField(item) end def pbUseItemMessage(item) - itemname = GameData::Item.get(item).name + itemname = GameData::Item.get(item).portion_name if itemname.starts_with_vowel? pbMessage(_INTL("You used an {1}.", itemname)) else @@ -774,7 +775,7 @@ end # Give an item to a Pokémon to hold, and take a held item from a Pokémon #=============================================================================== def pbGiveItemToPokemon(item, pkmn, scene, pkmnid = 0) - newitemname = GameData::Item.get(item).name + newitemname = GameData::Item.get(item).portion_name if pkmn.egg? scene.pbDisplay(_INTL("Eggs can't hold items.")) return false @@ -783,10 +784,8 @@ def pbGiveItemToPokemon(item, pkmn, scene, pkmnid = 0) return false if !pbTakeItemFromPokemon(pkmn, scene) end if pkmn.hasItem? - olditemname = pkmn.item.name - if pkmn.hasItem?(:LEFTOVERS) - scene.pbDisplay(_INTL("{1} is already holding some {2}.\1", pkmn.name, olditemname)) - elsif newitemname.starts_with_vowel? + olditemname = pkmn.item.portion_name + if newitemname.starts_with_vowel? scene.pbDisplay(_INTL("{1} is already holding an {2}.\1", pkmn.name, olditemname)) else scene.pbDisplay(_INTL("{1} is already holding a {2}.\1", pkmn.name, olditemname)) @@ -836,14 +835,14 @@ def pbTakeItemFromPokemon(pkmn, scene) end elsif scene.pbConfirm(_INTL("If the mail is removed, its message will be lost. OK?")) $bag.add(pkmn.item) - scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.name, pkmn.name)) + scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.portion_name, pkmn.name)) pkmn.item = nil pkmn.mail = nil ret = true end else $bag.add(pkmn.item) - scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.name, pkmn.name)) + scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.portion_name, pkmn.name)) pkmn.item = nil ret = true end diff --git a/Data/Scripts/014_Pokemon/001_Pokemon.rb b/Data/Scripts/014_Pokemon/001_Pokemon.rb index e40038d5b..992a78189 100644 --- a/Data/Scripts/014_Pokemon/001_Pokemon.rb +++ b/Data/Scripts/014_Pokemon/001_Pokemon.rb @@ -962,7 +962,7 @@ class Pokemon gain += 1 if @poke_ball == :LUXURYBALL gain = (gain * 1.5).floor if hasItem?(:SOOTHEBELL) if Settings::APPLY_HAPPINESS_SOFT_CAP && method != "evberry" - gain = gain.clamp(0, 179 - @happiness) + gain = (@happiness >= 179) ? 0 : gain.clamp(0, 179 - @happiness) end end @happiness = (@happiness + gain).clamp(0, 255) diff --git a/Data/Scripts/016_UI/005_UI_Party.rb b/Data/Scripts/016_UI/005_UI_Party.rb index 6110ca77d..25b4fe661 100644 --- a/Data/Scripts/016_UI/005_UI_Party.rb +++ b/Data/Scripts/016_UI/005_UI_Party.rb @@ -1429,6 +1429,7 @@ MenuHandlers.add(:party_menu_item, :move, { pkmn = party[party_idx] item = pkmn.item itemname = item.name + portionitemname = item.portion_name screen.scene.pbSetHelpText(_INTL("Move {1} to where?", itemname)) old_party_idx = party_idx moved = false @@ -1446,7 +1447,7 @@ MenuHandlers.add(:party_menu_item, :move, { pkmn.item = nil screen.scene.pbClearSwitching screen.pbRefresh - screen.pbDisplay(_INTL("{1} was given the {2} to hold.", newpkmn.name, itemname)) + screen.pbDisplay(_INTL("{1} was given the {2} to hold.", newpkmn.name, portionitemname)) moved = true break elsif newpkmn.item.is_mail? @@ -1455,10 +1456,8 @@ MenuHandlers.add(:party_menu_item, :move, { end # New Pokémon is also holding an item; ask what to do with it newitem = newpkmn.item - newitemname = newitem.name - if newitem == :LEFTOVERS - screen.pbDisplay(_INTL("{1} is already holding some {2}.\1", newpkmn.name, newitemname)) - elsif newitemname.starts_with_vowel? + newitemname = newitem.portion_name + if newitemname.starts_with_vowel? screen.pbDisplay(_INTL("{1} is already holding an {2}.\1", newpkmn.name, newitemname)) else screen.pbDisplay(_INTL("{1} is already holding a {2}.\1", newpkmn.name, newitemname)) @@ -1468,7 +1467,7 @@ MenuHandlers.add(:party_menu_item, :move, { pkmn.item = newitem screen.scene.pbClearSwitching screen.pbRefresh - screen.pbDisplay(_INTL("{1} was given the {2} to hold.", newpkmn.name, itemname)) + screen.pbDisplay(_INTL("{1} was given the {2} to hold.", newpkmn.name, portionitemname)) screen.pbDisplay(_INTL("{1} was given the {2} to hold.", pkmn.name, newitemname)) moved = true break diff --git a/Data/Scripts/016_UI/007_UI_Bag.rb b/Data/Scripts/016_UI/007_UI_Bag.rb index 4a0ac1cbe..ab8c5196b 100644 --- a/Data/Scripts/016_UI/007_UI_Bag.rb +++ b/Data/Scripts/016_UI/007_UI_Bag.rb @@ -505,7 +505,7 @@ class PokemonBagScreen if $player.pokemon_count == 0 @scene.pbDisplay(_INTL("There is no Pokémon.")) elsif itm.is_important? - @scene.pbDisplay(_INTL("The {1} can't be held.", itemname)) + @scene.pbDisplay(_INTL("The {1} can't be held.", itm.portion_name)) else pbFadeOutIn { sscene = PokemonParty_Scene.new @@ -517,11 +517,11 @@ class PokemonBagScreen elsif cmdToss >= 0 && command == cmdToss # Toss item qty = @bag.quantity(item) if qty > 1 - helptext = _INTL("Toss out how many {1}?", itm.name_plural) + helptext = _INTL("Toss out how many {1}?", itm.portion_name_plural) qty = @scene.pbChooseNumber(helptext, qty) end if qty > 0 - itemname = itm.name_plural if qty > 1 + itemname = (qty > 1) ? itm.portion_name_plural : itm.portion_name if pbConfirm(_INTL("Is it OK to throw away {1} {2}?", qty, itemname)) pbDisplay(_INTL("Threw away {1} {2}.", qty, itemname)) qty.times { @bag.remove(item) } @@ -620,7 +620,7 @@ class PokemonBagScreen end @scene.pbRefresh dispqty = (itm.is_important?) ? 1 : qty - itemname = (dispqty > 1) ? itm.name_plural : itm.name + itemname = (dispqty > 1) ? itm.portion_name_plural : itm.portion_name pbDisplay(_INTL("Withdrew {1} {2}.", dispqty, itemname)) else pbDisplay(_INTL("There's no more room in the Bag.")) @@ -654,7 +654,7 @@ class PokemonBagScreen end @scene.pbRefresh dispqty = (itm.is_important?) ? 1 : qty - itemname = (dispqty > 1) ? itm.name_plural : itm.name + itemname = (dispqty > 1) ? itm.portion_name_plural : itm.portion_name pbDisplay(_INTL("Deposited {1} {2}.", dispqty, itemname)) else pbDisplay(_INTL("There's no room to store items.")) @@ -680,8 +680,8 @@ class PokemonBagScreen next end qty = storage.quantity(item) - itemname = itm.name - itemnameplural = itm.name_plural + itemname = itm.portion_name + itemnameplural = itm.portion_name_plural if qty > 1 qty = @scene.pbChooseNumber(_INTL("Toss out how many {1}?", itemnameplural), qty) end diff --git a/Data/Scripts/016_UI/009_UI_RegionMap.rb b/Data/Scripts/016_UI/009_UI_RegionMap.rb index bd902a26e..5303936a6 100644 --- a/Data/Scripts/016_UI/009_UI_RegionMap.rb +++ b/Data/Scripts/016_UI/009_UI_RegionMap.rb @@ -185,7 +185,7 @@ class PokemonRegionMap_Scene @map.point.each do |point| next if point[0] != x || point[1] != y return "" if point[7] && (@wallmap || point[7] <= 0 || !$game_switches[point[7]]) - name = pbGetMessageFromHash(MessageTypes::PlaceNames, point[2]) + name = pbGetMessageFromHash(MessageTypes::RegionLocations, point[2]) return (@editor) ? point[2] : name end return "" @@ -213,7 +213,8 @@ class PokemonRegionMap_Scene @map.point.each do |point| next if point[0] != x || point[1] != y return "" if point[7] && (@wallmap || point[7] <= 0 || !$game_switches[point[7]]) - mapdesc = pbGetMessageFromHash(MessageTypes::PlaceDescriptions, point[3]) + return "" if !point[3] + mapdesc = pbGetMessageFromHash(MessageTypes::RegionDescriptions, point[3]) return (@editor) ? point[3] : mapdesc end return "" diff --git a/Data/Scripts/016_UI/010_UI_Phone.rb b/Data/Scripts/016_UI/010_UI_Phone.rb index 43f657c3e..a229361a8 100644 --- a/Data/Scripts/016_UI/010_UI_Phone.rb +++ b/Data/Scripts/016_UI/010_UI_Phone.rb @@ -95,7 +95,7 @@ class PokemonPhone_Scene end # Set info text infotext = _INTL("Registered
") - infotext += _INTL(" {1}
", @sprites["list"].commands.length) + infotext += _INTL("{1}
", @sprites["list"].commands.length) infotext += _INTL("Waiting for a rematch{1}", rematch_count) @sprites["info"].text = infotext pbRefreshScreen diff --git a/Data/Scripts/016_UI/013_UI_Load.rb b/Data/Scripts/016_UI/013_UI_Load.rb index d58b84d38..2d7235909 100644 --- a/Data/Scripts/016_UI/013_UI_Load.rb +++ b/Data/Scripts/016_UI/013_UI_Load.rb @@ -325,7 +325,7 @@ class PokemonLoadScreen when cmd_language @scene.pbEndScene $PokemonSystem.language = pbChooseLanguage - pbLoadMessages("Data/" + Settings::LANGUAGES[$PokemonSystem.language][1]) + MessageTypes.load_message_files(Settings::LANGUAGES[$PokemonSystem.language][1]) if show_continue @save_data[:pokemon_system] = $PokemonSystem File.open(SaveData::FILE_PATH, "wb") { |file| Marshal.dump(@save_data, file) } diff --git a/Data/Scripts/016_UI/017_UI_PokemonStorage.rb b/Data/Scripts/016_UI/017_UI_PokemonStorage.rb index 1e2de25a0..311b83003 100644 --- a/Data/Scripts/016_UI/017_UI_PokemonStorage.rb +++ b/Data/Scripts/016_UI/017_UI_PokemonStorage.rb @@ -608,8 +608,10 @@ class PokemonStorageScene @markingbitmap = AnimatedBitmap.new("Graphics/UI/Storage/markings") @sprites["markingbg"] = IconSprite.new(292, 68, @boxsidesviewport) @sprites["markingbg"].setBitmap("Graphics/UI/Storage/overlay_marking") + @sprites["markingbg"].z = 10 @sprites["markingbg"].visible = false @sprites["markingoverlay"] = BitmapSprite.new(Graphics.width, Graphics.height, @boxsidesviewport) + @sprites["markingoverlay"].z = 11 @sprites["markingoverlay"].visible = false pbSetSystemFont(@sprites["markingoverlay"].bitmap) @sprites["arrow"] = PokemonBoxArrow.new(@arrowviewport) @@ -1894,8 +1896,8 @@ class PokemonStorageScreen return end if pokemon.item - itemname = pokemon.item.name - if pbConfirm(_INTL("Take this {1}?", itemname)) + itemname = pokemon.item.portion_name + if pbConfirm(_INTL("Take the {1}?", itemname)) if $bag.add(pokemon.item) pbDisplay(_INTL("Took the {1}.", itemname)) pokemon.item = nil diff --git a/Data/Scripts/016_UI/020_UI_PokeMart.rb b/Data/Scripts/016_UI/020_UI_PokeMart.rb index 901bdb160..e33d6a75b 100644 --- a/Data/Scripts/016_UI/020_UI_PokeMart.rb +++ b/Data/Scripts/016_UI/020_UI_PokeMart.rb @@ -19,15 +19,15 @@ class PokemonMartAdapter end def getName(item) - return GameData::Item.get(item).name + return GameData::Item.get(item).portion_name end def getNamePlural(item) - return GameData::Item.get(item).name_plural + return GameData::Item.get(item).portion_name_plural end def getDisplayName(item) - item_name = getName(item) + item_name = GameData::Item.get(item).name if GameData::Item.get(item).is_machine? machine = GameData::Item.get(item).move item_name = _INTL("{1} {2}", item_name, GameData::Move.get(machine).name) @@ -36,7 +36,7 @@ class PokemonMartAdapter end def getDisplayNamePlural(item) - item_name_plural = getNamePlural(item) + item_name_plural = GameData::Item.get(item).name_plural if GameData::Item.get(item).is_machine? machine = GameData::Item.get(item).move item_name_plural = _INTL("{1} {2}", item_name_plural, GameData::Move.get(machine).name) @@ -103,10 +103,22 @@ class BuyAdapter @adapter = adapter end + # For showing in messages + def getName(item) + @adapter.getName(item) + end + + # For showing in messages + def getNamePlural(item) + @adapter.getNamePlural(item) + end + + # For showing in the list of items def getDisplayName(item) @adapter.getDisplayName(item) end + # For showing in the list of items def getDisplayNamePlural(item) @adapter.getDisplayNamePlural(item) end @@ -128,10 +140,22 @@ class SellAdapter @adapter = adapter end + # For showing in messages + def getName(item) + @adapter.getName(item) + end + + # For showing in messages + def getNamePlural(item) + @adapter.getNamePlural(item) + end + + # For showing in the list of items def getDisplayName(item) @adapter.getDisplayName(item) end + # For showing in the list of items def getDisplayNamePlural(item) @adapter.getDisplayNamePlural(item) end @@ -583,15 +607,15 @@ class PokemonMartScreen item = @scene.pbChooseBuyItem break if !item quantity = 0 - itemname = @adapter.getDisplayName(item) - itemnameplural = @adapter.getDisplayNamePlural(item) + itemname = @adapter.getName(item) + itemnameplural = @adapter.getNamePlural(item) price = @adapter.getPrice(item) if @adapter.getMoney < price pbDisplayPaused(_INTL("You don't have enough money.")) next end if GameData::Item.get(item).is_important? - next if !pbConfirm(_INTL("So you want {1}?\nIt'll be ${2}. All right?", + next if !pbConfirm(_INTL("So you want the {1}?\nIt'll be ${2}. All right?", itemname, price.to_s_formatted)) quantity = 1 else @@ -632,8 +656,8 @@ class PokemonMartScreen break if !@adapter.addItem(:PREMIERBALL) premier_balls_added += 1 end - ball_name = GameData::Item.get(:PREMIERBALL).name - ball_name = GameData::Item.get(:PREMIERBALL).name_plural if premier_balls_added > 1 + ball_name = GameData::Item.get(:PREMIERBALL).portion_name + ball_name = GameData::Item.get(:PREMIERBALL).portion_name_plural if premier_balls_added > 1 $stats.premier_balls_earned += premier_balls_added pbDisplayPaused(_INTL("And have {1} {2} on the house!", premier_balls_added, ball_name)) elsif !Settings::MORE_BONUS_PREMIER_BALLS && GameData::Item.get(item) == :POKEBALL @@ -661,8 +685,8 @@ class PokemonMartScreen loop do item = @scene.pbChooseSellItem break if !item - itemname = @adapter.getDisplayName(item) - itemnameplural = @adapter.getDisplayNamePlural(item) + itemname = @adapter.getName(item) + itemnameplural = @adapter.getNamePlural(item) if !@adapter.canSell?(item) pbDisplayPaused(_INTL("Oh, no. I can't buy {1}.", itemnameplural)) next diff --git a/Data/Scripts/016_UI/021_BattlePointShop.rb b/Data/Scripts/016_UI/021_BattlePointShop.rb index 1cf793bab..aa4ac1860 100644 --- a/Data/Scripts/016_UI/021_BattlePointShop.rb +++ b/Data/Scripts/016_UI/021_BattlePointShop.rb @@ -19,15 +19,15 @@ class BattlePointShopAdapter end def getName(item) - return GameData::Item.get(item).name + return GameData::Item.get(item).portion_name end def getNamePlural(item) - return GameData::Item.get(item).name_plural + return GameData::Item.get(item).portion_name_plural end def getDisplayName(item) - item_name = getName(item) + item_name = GameData::Item.get(item).name if GameData::Item.get(item).is_machine? machine = GameData::Item.get(item).move item_name = _INTL("{1} {2}", item_name, GameData::Move.get(machine).name) @@ -36,7 +36,7 @@ class BattlePointShopAdapter end def getDisplayNamePlural(item) - item_name_plural = getNamePlural(item) + item_name_plural = GameData::Item.get(item).name_plural if GameData::Item.get(item).is_machine? machine = GameData::Item.get(item).move item_name_plural = _INTL("{1} {2}", item_name_plural, GameData::Move.get(machine).name) @@ -446,8 +446,8 @@ class BattlePointShopScreen item = @scene.pbChooseItem break if !item quantity = 0 - itemname = @adapter.getDisplayName(item) - itemnameplural = @adapter.getDisplayNamePlural(item) + itemname = @adapter.getName(item) + itemnameplural = @adapter.getNamePlural(item) price = @adapter.getPrice(item) if @adapter.getBP < price pbDisplayPaused(_INTL("You don't have enough BP.")) @@ -484,8 +484,8 @@ class BattlePointShopScreen end if added == quantity $stats.battle_points_spent += price - #Add bpshop_items_bought to $stats? - #$stats.bpshop_items_bought += quantity + # TODO: Add bpshop_items_bought to $stats? +# $stats.bpshop_items_bought += quantity @adapter.setBP(@adapter.getBP - price) @stock.delete_if { |item| GameData::Item.get(item).is_important? && $bag.has?(item) } pbDisplayPaused(_INTL("Here you are! Thank you!")) { pbSEPlay("Mart buy item") } diff --git a/Data/Scripts/016_UI/024_UI_MysteryGift.rb b/Data/Scripts/016_UI/024_UI_MysteryGift.rb index 9453a952e..e819a0e56 100644 --- a/Data/Scripts/016_UI/024_UI_MysteryGift.rb +++ b/Data/Scripts/016_UI/024_UI_MysteryGift.rb @@ -406,10 +406,8 @@ def pbReceiveMysteryGift(id) if $bag.can_add?(item, qty) $bag.add(item, qty) itm = GameData::Item.get(item) - itemname = (qty > 1) ? itm.name_plural : itm.name - if item == :LEFTOVERS - pbMessage(_INTL("\\me[Item get]You obtained some \\c[1]{1}\\c[0]!\\wtnp[30]", itemname)) - elsif itm.is_machine? # TM or HM + itemname = (qty > 1) ? itm.portion_name_plural : itm.portion_name + if itm.is_machine? # TM or HM pbMessage(_INTL("\\me[Item get]You obtained \\c[1]{1} {2}\\c[0]!\\wtnp[30]", itemname, GameData::Move.get(itm.move).name)) elsif qty > 1 diff --git a/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/001_Challenge_BattleChallenge.rb b/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/001_Challenge_BattleChallenge.rb index e10f5c9ad..d5241c15b 100644 --- a/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/001_Challenge_BattleChallenge.rb +++ b/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/001_Challenge_BattleChallenge.rb @@ -98,8 +98,8 @@ class BattleChallenge opponent = pbGenerateBattleTrainer(self.nextTrainer, self.rules) bttrainers = pbGetBTTrainers(@id) trainerdata = bttrainers[self.nextTrainer] - opponent.lose_text = pbGetMessageFromHash(MessageTypes::EndSpeechLose, trainerdata[4]) - opponent.win_text = pbGetMessageFromHash(MessageTypes::EndSpeechWin, trainerdata[3]) + opponent.lose_text = pbGetMessageFromHash(MessageTypes::FrontierEndSpeechesLose, trainerdata[4]) + opponent.win_text = pbGetMessageFromHash(MessageTypes::FrontierEndSpeechesWin, trainerdata[3]) ret = pbOrganizedBattleEx(opponent, self.rules) return ret end @@ -376,8 +376,8 @@ class BattleFactoryData pbGetMessageFromHash(MessageTypes::TrainerNames, trainerdata[1]), trainerdata[0] ) - @opponent.lose_text = pbGetMessageFromHash(MessageTypes::EndSpeechLose, trainerdata[4]) - @opponent.win_text = pbGetMessageFromHash(MessageTypes::EndSpeechWin, trainerdata[3]) + @opponent.lose_text = pbGetMessageFromHash(MessageTypes::FrontierEndSpeechesLose, trainerdata[4]) + @opponent.win_text = pbGetMessageFromHash(MessageTypes::FrontierEndSpeechesWin, trainerdata[3]) opponentPkmn = pbBattleFactoryPokemon(pbBattleChallenge.rules, @bcdata.wins, @bcdata.swaps, @rentals) @opponent.party = opponentPkmn.sample(3) end @@ -401,8 +401,8 @@ class BattleFactoryData pbGetMessageFromHash(MessageTypes::TrainerNames, trainerdata[1]), trainerdata[0] ) - @opponent.lose_text = pbGetMessageFromHash(MessageTypes::EndSpeechLose, trainerdata[4]) - @opponent.win_text = pbGetMessageFromHash(MessageTypes::EndSpeechWin, trainerdata[3]) + @opponent.lose_text = pbGetMessageFromHash(MessageTypes::FrontierEndSpeechesLose, trainerdata[4]) + @opponent.win_text = pbGetMessageFromHash(MessageTypes::FrontierEndSpeechesWin, trainerdata[3]) opponentPkmn = pbBattleFactoryPokemon(pbBattleChallenge.rules, @bcdata.wins, @bcdata.swaps, [].concat(@rentals).concat(@oldopponent)) @opponent.party = opponentPkmn.sample(3) diff --git a/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/002_Challenge_Data.rb b/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/002_Challenge_Data.rb index 0e8118a8b..c4536f6dd 100644 --- a/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/002_Challenge_Data.rb +++ b/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/002_Challenge_Data.rb @@ -92,7 +92,7 @@ def pbBattleChallengeBeginSpeech return "..." if !pbBattleChallenge.pbInProgress? bttrainers = pbGetBTTrainers(pbBattleChallenge.currentChallenge) tr = bttrainers[pbBattleChallenge.nextTrainer] - return (tr) ? pbGetMessageFromHash(MessageTypes::BeginSpeech, tr[2]) : "..." + return (tr) ? pbGetMessageFromHash(MessageTypes::FrontierIntroSpeeches, tr[2]) : "..." end #=============================================================================== diff --git a/Data/Scripts/019_Utilities/001_Utilities.rb b/Data/Scripts/019_Utilities/001_Utilities.rb index 1665f7eaf..ee23519dc 100644 --- a/Data/Scripts/019_Utilities/001_Utilities.rb +++ b/Data/Scripts/019_Utilities/001_Utilities.rb @@ -134,12 +134,13 @@ def getID(mod, constant) return constant end -def getConstantName(mod, value) +def getConstantName(mod, value, raise_if_none = true) mod = Object.const_get(mod) if mod.is_a?(Symbol) mod.constants.each do |c| return c.to_s if mod.const_get(c.to_sym) == value end - raise _INTL("Value {1} not defined by a constant in {2}", value, mod.name) + raise _INTL("Value {1} not defined by a constant in {2}", value, mod.name) if raise_if_none + return nil end def getConstantNameOrValue(mod, value) diff --git a/Data/Scripts/020_Debug/002_Animation editor/002_AnimEditor_ControlsButtons.rb b/Data/Scripts/020_Debug/002_Animation editor/002_AnimEditor_ControlsButtons.rb index a51e3167f..598920fab 100644 --- a/Data/Scripts/020_Debug/002_Animation editor/002_AnimEditor_ControlsButtons.rb +++ b/Data/Scripts/020_Debug/002_Animation editor/002_AnimEditor_ControlsButtons.rb @@ -432,13 +432,13 @@ class Slider < UIControl color = Color.new(120, 120, 120) bitmap.fill_rect(x, y, width, height, Color.new(0, 0, 0, 0)) size = bitmap.text_size(self.label).width - leftarrows = bitmap.text_size(_INTL(" << ")) + leftarrows = bitmap.text_size(_INTL("<<")) numbers = bitmap.text_size(" XXXX ").width - rightarrows = bitmap.text_size(_INTL(" >> ")) + rightarrows = bitmap.text_size(_INTL(">>")) bitmap.font.color = color shadowtext(bitmap, x, y, size, height, self.label) x += size - shadowtext(bitmap, x, y, leftarrows.width, height, _INTL(" << "), + shadowtext(bitmap, x, y, leftarrows.width, height, _INTL("<<"), self.disabled || self.curvalue == self.minvalue) @leftarrow = Rect.new(x, y, leftarrows.width, height) x += leftarrows.width @@ -447,7 +447,7 @@ class Slider < UIControl shadowtext(bitmap, x, y, numbers, height, " #{self.curvalue} ", false, 1) end x += numbers - shadowtext(bitmap, x, y, rightarrows.width, height, _INTL(" >> "), + shadowtext(bitmap, x, y, rightarrows.width, height, _INTL(">>"), self.disabled || self.curvalue == self.maxvalue) @rightarrow = Rect.new(x, y, rightarrows.width, height) end @@ -681,12 +681,12 @@ class TextSlider < UIControl color = Color.new(120, 120, 120) bitmap.fill_rect(x, y, width, height, Color.new(0, 0, 0, 0)) size = bitmap.text_size(self.label).width - leftarrows = bitmap.text_size(_INTL(" << ")) - rightarrows = bitmap.text_size(_INTL(" >> ")) + leftarrows = bitmap.text_size(_INTL("<<")) + rightarrows = bitmap.text_size(_INTL(">>")) bitmap.font.color = color shadowtext(bitmap, x, y, size, height, self.label) x += size - shadowtext(bitmap, x, y, leftarrows.width, height, _INTL(" << "), + shadowtext(bitmap, x, y, leftarrows.width, height, _INTL("<<"), self.disabled || self.curvalue == self.minvalue) @leftarrow = Rect.new(x, y, leftarrows.width, height) x += leftarrows.width @@ -695,7 +695,7 @@ class TextSlider < UIControl shadowtext(bitmap, x, y, @maxoptionwidth, height, " #{@options[self.curvalue]} ", false, 1) end x += @maxoptionwidth - shadowtext(bitmap, x, y, rightarrows.width, height, _INTL(" >> "), + shadowtext(bitmap, x, y, rightarrows.width, height, _INTL(">>"), self.disabled || self.curvalue == self.maxvalue) @rightarrow = Rect.new(x, y, rightarrows.width, height) 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 115635945..13f084dc6 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 @@ -1088,20 +1088,58 @@ MenuHandlers.add(:debug_menu, :mystery_gift, { }) MenuHandlers.add(:debug_menu, :extract_text, { - "name" => _INTL("Extract Text"), + "name" => _INTL("Extract Text For Translation"), "parent" => :other_menu, - "description" => _INTL("Extract all text in the game to a single file for translating."), + "description" => _INTL("Extract all text in the game to text files for translating."), "effect" => proc { - pbExtractText + if Settings::LANGUAGES.length == 0 + pbMessage(_INTL("No languages are defined in the LANGUAGES array in Settings.")) + pbMessage(_INTL("You need to add at least one language to LANGUAGES first, to choose which one to extract text for.")) + next + end + # Choose a language from Settings to name the extraction folder after + cmds = [] + Settings::LANGUAGES.each { |val| cmds.push(val[0]) } + cmds.push(_INTL("Cancel")) + language_index = pbMessage(_INTL("Choose a language to extract text for."), cmds, cmds.length) + next if language_index == cmds.length - 1 + language_name = Settings::LANGUAGES[language_index][1] + # Choose whether to extract core text or game text + text_type = pbMessage(_INTL("Choose a language to extract text for."), + [_INTL("Game-specific text"), _INTL("Core text"), _INTL("Cancel")], 3) + next if text_type == 2 + # If game text, choose whether to extract map texts to map-specific files or + # to one big file + map_files = 0 + if text_type == 0 + map_files = pbMessage(_INTL("How many text files should map event texts be extracted to?"), + [_INTL("One big file"), _INTL("One file per map"), _INTL("Cancel")], 3) + next if map_files == 2 + end + # Extract the chosen set of text for the chosen language + Translator.extract_text(language_name, text_type == 1, map_files == 1) } }) MenuHandlers.add(:debug_menu, :compile_text, { - "name" => _INTL("Compile Text"), + "name" => _INTL("Compile Translated Text"), "parent" => :other_menu, - "description" => _INTL("Import text and converts it into a language file."), + "description" => _INTL("Import text files and convert them into a language file."), "effect" => proc { - pbCompileTextUI + # Find all folders with a particular naming convention + cmds = Dir.glob("Text_*_*") + if cmds.length == 0 + pbMessage(_INTL("No language folders found to compile.")) + pbMessage(_INTL("Language folders must be named \"Text_SOMETHING_core\" or \"Text_SOMETHING_game\" and be in the root folder.")) + next + end + cmds.push(_INTL("Cancel")) + # Ask which folder to compile into a .dat file + folder_index = pbMessage(_INTL("Choose a language folder to compile."), cmds, cmds.length) + next if folder_index == cmds.length - 1 + # Compile the text files in the chosen folder + dat_filename = cmds[folder_index].gsub!(/^Text_/, "") + Translator.compile_text(cmds[folder_index], dat_filename) } }) 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 9a6dd6cae..70d5231ae 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 @@ -546,37 +546,6 @@ end -#=============================================================================== -# Text import/export for localisation -#=============================================================================== -def pbExtractText - msgwindow = pbCreateMessageWindow - if safeExists?("intl.txt") && - !pbConfirmMessageSerious(_INTL("intl.txt already exists. Overwrite it?")) - pbDisposeMessageWindow(msgwindow) - return - end - pbMessageDisplay(msgwindow, _INTL("Please wait.\\wtnp[0]")) - MessageTypes.extract("intl.txt") - pbMessageDisplay(msgwindow, _INTL("All text in the game was extracted and saved to intl.txt.\1")) - pbMessageDisplay(msgwindow, _INTL("To localize the text for a particular language, translate every second line in the file.\1")) - pbMessageDisplay(msgwindow, _INTL("After translating, choose \"Compile Text.\"")) - pbDisposeMessageWindow(msgwindow) -end - -def pbCompileTextUI - msgwindow = pbCreateMessageWindow - pbMessageDisplay(msgwindow, _INTL("Please wait.\\wtnp[0]")) - begin - pbCompileText - pbMessageDisplay(msgwindow, _INTL("Successfully compiled text and saved it to intl.dat.\1")) - pbMessageDisplay(msgwindow, _INTL("To use the file in a game, place the file in the Data folder under a different name, and edit the Settings::LANGUAGES array in the scripts.")) - rescue RuntimeError - pbMessageDisplay(msgwindow, _INTL("Failed to compile text: {1}", $!.message)) - end - pbDisposeMessageWindow(msgwindow) -end - #=============================================================================== # Battle animations import/export #=============================================================================== diff --git a/Data/Scripts/021_Compiler/001_Compiler.rb b/Data/Scripts/021_Compiler/001_Compiler.rb index ef4596a67..023b78a20 100644 --- a/Data/Scripts/021_Compiler/001_Compiler.rb +++ b/Data/Scripts/021_Compiler/001_Compiler.rb @@ -151,7 +151,7 @@ module Compiler } end - # Unused + # Used by translated text compiler def pbEachSection(f) lineno = 1 havesection = false @@ -164,21 +164,21 @@ module Compiler line.force_encoding(Encoding::UTF_8) if !line[/^\#/] && !line[/^\s*$/] if line[/^\s*\[\s*(.+?)\s*\]\s*$/] - yield lastsection, sectionname if havesection + yield lastsection, sectionname if havesection + lastsection.clear sectionname = $~[1] - lastsection = [] havesection = true else if sectionname.nil? - raise _INTL("Expected a section at the beginning of the file (line {1}). Sections begin with '[name of section]'", lineno) + raise _INTL("Expected a section at the beginning of the file (line {1}). Sections begin with '[name of section]'.", lineno) end - lastsection.push(line.gsub(/^\s+/, "").gsub(/\s+$/, "")) + lastsection.push(line.strip) end end lineno += 1 Graphics.update if lineno % 500 == 0 } - yield lastsection, sectionname if havesection + yield lastsection, sectionname if havesection end # Unused @@ -845,9 +845,9 @@ module Compiler compile_animations compile_trainer_events(mustCompile) Console.echo_li(_INTL("Saving messages...")) - pbSetTextMessages - MessageTypes.saveMessages - MessageTypes.loadMessageFile("Data/messages.dat") if safeExists?("Data/messages.dat") + Translator.gather_script_and_event_texts + MessageTypes.save_default_messages + MessageTypes.load_default_messages if safeExists?("Data/messages_core.dat") Console.echo_done(true) Console.echo_li(_INTL("Reloading cache...")) System.reload_cache diff --git a/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb b/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb index ff220ba45..c4f59bc83 100644 --- a/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb +++ b/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb @@ -90,9 +90,9 @@ module Compiler end point_names.uniq! interest_names.uniq! - MessageTypes.setMessages(MessageTypes::RegionNames, region_names) - MessageTypes.setMessagesAsHash(MessageTypes::PlaceNames, point_names) - MessageTypes.setMessagesAsHash(MessageTypes::PlaceDescriptions, interest_names) + MessageTypes.setMessagesAsHash(MessageTypes::Regions, region_names) + MessageTypes.setMessagesAsHash(MessageTypes::RegionLocations, point_names) + MessageTypes.setMessagesAsHash(MessageTypes::RegionDescriptions, interest_names) end #============================================================================= @@ -199,7 +199,7 @@ module Compiler ability_descriptions.push(ability.real_description) end MessageTypes.setMessagesAsHash(MessageTypes::Abilities, ability_names) - MessageTypes.setMessagesAsHash(MessageTypes::AbilityDescs, ability_descriptions) + MessageTypes.setMessagesAsHash(MessageTypes::AbilityDescriptions, ability_descriptions) end #============================================================================= @@ -250,14 +250,20 @@ module Compiler # Get item names/descriptions for translating item_names = [] item_names_plural = [] + item_portion_names = [] + item_portion_names_plural = [] item_descriptions = [] GameData::Item.each do |item| item_names.push(item.real_name) item_names_plural.push(item.real_name_plural) + item_portion_names.push(item.real_portion_name) + item_portion_names_plural.push(item.real_portion_name_plural) item_descriptions.push(item.real_description) end MessageTypes.setMessagesAsHash(MessageTypes::Items, item_names) MessageTypes.setMessagesAsHash(MessageTypes::ItemPlurals, item_names_plural) + MessageTypes.setMessagesAsHash(MessageTypes::ItemPortions, item_portion_names) + MessageTypes.setMessagesAsHash(MessageTypes::ItemPortionPlurals, item_portion_names_plural) MessageTypes.setMessagesAsHash(MessageTypes::ItemDescriptions, item_descriptions) end @@ -364,9 +370,9 @@ module Compiler species_pokedex_entries.push(species.real_pokedex_entry) end MessageTypes.setMessagesAsHash(MessageTypes::Species, species_names) - MessageTypes.setMessagesAsHash(MessageTypes::FormNames, species_form_names) - MessageTypes.setMessagesAsHash(MessageTypes::Kinds, species_categories) - MessageTypes.setMessagesAsHash(MessageTypes::Entries, species_pokedex_entries) + MessageTypes.setMessagesAsHash(MessageTypes::SpeciesForms, species_form_names) + MessageTypes.setMessagesAsHash(MessageTypes::SpeciesCategories, species_categories) + MessageTypes.setMessagesAsHash(MessageTypes::PokedexEntries, species_pokedex_entries) end #============================================================================= @@ -502,9 +508,9 @@ module Compiler species_categories.push(species.real_category) species_pokedex_entries.push(species.real_pokedex_entry) end - MessageTypes.addMessagesAsHash(MessageTypes::FormNames, species_form_names) - MessageTypes.addMessagesAsHash(MessageTypes::Kinds, species_categories) - MessageTypes.addMessagesAsHash(MessageTypes::Entries, species_pokedex_entries) + MessageTypes.addMessagesAsHash(MessageTypes::SpeciesForms, species_form_names) + MessageTypes.addMessagesAsHash(MessageTypes::SpeciesCategories, species_categories) + MessageTypes.addMessagesAsHash(MessageTypes::PokedexEntries, species_pokedex_entries) end #============================================================================= @@ -902,7 +908,7 @@ module Compiler lose_texts.push(trainer.real_lose_text) end MessageTypes.setMessagesAsHash(MessageTypes::TrainerNames, trainer_names) - MessageTypes.setMessagesAsHash(MessageTypes::TrainerLoseText, lose_texts) + MessageTypes.setMessagesAsHash(MessageTypes::TrainerLoseTexts, lose_texts) end #============================================================================= @@ -926,9 +932,9 @@ module Compiler } end sections = [] - MessageTypes.setMessagesAsHash(MessageTypes::BeginSpeech, []) - MessageTypes.setMessagesAsHash(MessageTypes::EndSpeechWin, []) - MessageTypes.setMessagesAsHash(MessageTypes::EndSpeechLose, []) + MessageTypes.setMessagesAsHash(MessageTypes::FrontierIntroSpeeches, []) + MessageTypes.setMessagesAsHash(MessageTypes::FrontierEndSpeechesWin, []) + MessageTypes.setMessagesAsHash(MessageTypes::FrontierEndSpeechesLose, []) File.open(path, "rb") { |f| FileLineData.file = path idx = 0 @@ -1016,9 +1022,9 @@ module Compiler } end MessageTypes.addMessagesAsHash(MessageTypes::TrainerNames, trainernames) - MessageTypes.addMessagesAsHash(MessageTypes::BeginSpeech, beginspeech) - MessageTypes.addMessagesAsHash(MessageTypes::EndSpeechWin, endspeechwin) - MessageTypes.addMessagesAsHash(MessageTypes::EndSpeechLose, endspeechlose) + MessageTypes.addMessagesAsHash(MessageTypes::FrontierIntroSpeeches, beginspeech) + MessageTypes.addMessagesAsHash(MessageTypes::FrontierEndSpeechesWin, endspeechwin) + MessageTypes.addMessagesAsHash(MessageTypes::FrontierEndSpeechesLose, endspeechlose) return sections end @@ -1147,7 +1153,7 @@ module Compiler # Get map names for translating map_names = [] GameData::MapMetadata.each { |map| map_names[map.id] = map.real_name } - MessageTypes.setMessages(MessageTypes::MapNames, map_names) + MessageTypes.setMessagesAsHash(MessageTypes::MapNames, map_names) end #============================================================================= diff --git a/Data/Scripts/999_Main/999_Main.rb b/Data/Scripts/999_Main/999_Main.rb index 2e9bcfb78..bb021dbe0 100644 --- a/Data/Scripts/999_Main/999_Main.rb +++ b/Data/Scripts/999_Main/999_Main.rb @@ -24,7 +24,7 @@ end def mainFunctionDebug begin - MessageTypes.loadMessageFile("Data/messages.dat") if safeExists?("Data/messages.dat") + MessageTypes.load_default_messages if safeExists?("Data/messages_core.dat") PluginManager.runPlugins Compiler.main Game.initialize diff --git a/PBS/Gen 5/items.txt b/PBS/Gen 5/items.txt index 0ed571afb..255d5bcc1 100644 --- a/PBS/Gen 5/items.txt +++ b/PBS/Gen 5/items.txt @@ -50,6 +50,8 @@ Description = A white flute made from blown glass. Its melody makes wild Pokémo [HONEY] Name = Honey NamePlural = Honey +PortionName = jar of Honey +PortionNamePlural = jars of Honey Pocket = 1 Price = 300 FieldUse = Direct @@ -374,6 +376,8 @@ Description = Very large pearls that sparkle in a pretty silver color. A maniac [STARDUST] Name = Stardust NamePlural = Stardusts +PortionName = bag of Stardust +PortionNamePlural = bags of Stardust Pocket = 1 Price = 2000 Flags = Fling_30 @@ -437,6 +441,8 @@ Description = A bone that is extremely valuable for Pokémon archaeology. It can [RELICCOPPER] Name = Relic Copper NamePlural = Relic Coppers +PortionName = Relic Copper coin +PortionNamePlural = Relic Copper coins Pocket = 1 Price = 2000 Flags = Fling_30 @@ -445,6 +451,8 @@ Description = A copper coin used in a civilization about 3,000 years ago. A mani [RELICSILVER] Name = Relic Silver NamePlural = Relic Silvers +PortionName = Relic Silver coin +PortionNamePlural = Relic Silver coins Pocket = 1 Price = 10000 Flags = Fling_30 @@ -453,6 +461,8 @@ Description = A silver coin used in a civilization about 3,000 years ago. A mani [RELICGOLD] Name = Relic Gold NamePlural = Relic Golds +PortionName = Relic Gold coin +PortionNamePlural = Relic Gold coins Pocket = 1 Price = 20000 Flags = Fling_30 @@ -493,6 +503,8 @@ Description = A crown made in a civilization about 3,000 years ago. A maniac wil [GROWTHMULCH] Name = Growth Mulch NamePlural = Growth Mulch +PortionName = bag of Growth Mulch +PortionNamePlural = bags of Growth Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -501,6 +513,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [DAMPMULCH] Name = Damp Mulch NamePlural = Damp Mulch +PortionName = bag of Damp Mulch +PortionNamePlural = bags of Damp Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -509,6 +523,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [STABLEMULCH] Name = Stable Mulch NamePlural = Stable Mulch +PortionName = bag of Stable Mulch +PortionNamePlural = bags of Stable Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -517,6 +533,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [GOOEYMULCH] Name = Gooey Mulch NamePlural = Gooey Mulch +PortionName = bag of Gooey Mulch +PortionNamePlural = bags of Gooey Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -525,6 +543,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [SHOALSALT] Name = Shoal Salt NamePlural = Shoal Salts +PortionName = pile of Shoal Salt +PortionNamePlural = piles of Shoal Salt Pocket = 1 Price = 20 Flags = Fling_30 @@ -558,6 +578,8 @@ Description = An item to be held by a Pokémon. The holder will float in the air [BRIGHTPOWDER] Name = Bright Powder NamePlural = Bright Powders +PortionName = bag of Bright Powder +PortionNamePlural = bags of Bright Powder Pocket = 1 Price = 10 BPPrice = 12 @@ -688,6 +710,8 @@ Description = An item to be held by a Pokémon. This headband ups Attack, but al [CHOICESPECS] Name = Choice Specs NamePlural = Choice Specs +PortionName = pair of Choice Specs +PortionNamePlural = pairs of Choice Specs Pocket = 1 Price = 200 BPPrice = 24 @@ -742,6 +766,8 @@ Description = A Pokémon held item that extends the duration of the move Hail us [LIGHTCLAY] Name = Light Clay NamePlural = Light Clays +PortionName = lump of Light Clay +PortionNamePlural = lumps of Light Clay Pocket = 1 Price = 200 BPPrice = 8 @@ -778,6 +804,8 @@ Description = A Pokémon held item that boosts the power of HP-stealing moves to [BLACKSLUDGE] Name = Black Sludge NamePlural = Black Sludges +PortionName = blob of Black Sludge +PortionNamePlural = blobs of Black Sludge Pocket = 1 Price = 200 BPPrice = 24 @@ -787,6 +815,8 @@ Description = A held item that gradually restores the HP of Poison-type Pokémon [LEFTOVERS] Name = Leftovers NamePlural = Leftovers +PortionName = serving of Leftovers +PortionNamePlural = servings of Leftovers Pocket = 1 Price = 200 BPPrice = 24 @@ -886,6 +916,8 @@ Description = An item to be held by a Pokémon. It is a headband that slightly b [WISEGLASSES] Name = Wise Glasses NamePlural = Wise Glasses +PortionName = pair of Wise Glasses +PortionNamePlural = pairs of Wise Glasses Pocket = 1 Price = 200 BPPrice = 8 @@ -1093,6 +1125,8 @@ Description = A Pokémon held item that promotes Speed gain on leveling, but red [LAXINCENSE] Name = Lax Incense NamePlural = Lax Incenses +PortionName = jar of Lax Incense +PortionNamePlural = jars of Lax Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1101,6 +1135,8 @@ Description = An item to be held by a Pokémon. The tricky aroma of this incense [FULLINCENSE] Name = Full Incense NamePlural = Full Incenses +PortionName = jar of Full Incense +PortionNamePlural = jars of Full Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1109,6 +1145,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense mak [LUCKINCENSE] Name = Luck Incense NamePlural = Luck Incenses +PortionName = jar of Luck Incense +PortionNamePlural = jars of Luck Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1117,6 +1155,8 @@ Description = An item to be held by a Pokémon. It doubles a battle's prize mone [PUREINCENSE] Name = Pure Incense NamePlural = Pure Incenses +PortionName = jar of Pure Incense +PortionNamePlural = jars of Pure Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1125,6 +1165,8 @@ Description = An item to be held by a Pokémon. It helps keep wild Pokémon away [SEAINCENSE] Name = Sea Incense NamePlural = Sea Incenses +PortionName = jar of Sea Incense +PortionNamePlural = jars of Sea Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1133,6 +1175,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [WAVEINCENSE] Name = Wave Incense NamePlural = Wave Incenses +PortionName = jar of Wave Incense +PortionNamePlural = jars of Wave Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1141,6 +1185,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [ROSEINCENSE] Name = Rose Incense NamePlural = Rose Incenses +PortionName = jar of Rose Incense +PortionNamePlural = jars of Rose Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1149,6 +1195,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ODDINCENSE] Name = Odd Incense NamePlural = Odd Incenses +PortionName = jar of Odd Incense +PortionNamePlural = jars of Odd Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1157,6 +1205,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ROCKINCENSE] Name = Rock Incense NamePlural = Rock Incenses +PortionName = jar of Rock Incense +PortionNamePlural = jars of Rock Incense Pocket = 1 Price = 9600 Flags = Fling_10 @@ -1165,6 +1215,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [CHARCOAL] Name = Charcoal NamePlural = Charcoals +PortionName = piece of Charcoal +PortionNamePlural = pieces of Charcoal Pocket = 1 Price = 9800 Flags = Fling_30 @@ -1197,6 +1249,8 @@ Description = An item to be held by a Pokémon. It is a seed imbued with life th [NEVERMELTICE] Name = Never-Melt Ice NamePlural = Never-Melt Ices +PortionName = piece of Never-Melt Ice +PortionNamePlural = pieces of Never-Melt Ice Pocket = 1 Price = 100 Flags = Fling_30 @@ -1221,6 +1275,8 @@ Description = An item to be held by a Pokémon. It is a small, poisonous barb th [SOFTSAND] Name = Soft Sand NamePlural = Soft Sand +PortionName = bag of Soft Sand +PortionNamePlural = bags of Soft Sand Pocket = 1 Price = 100 Flags = Fling_10 @@ -1245,6 +1301,8 @@ Description = An item to be held by a Pokémon. It is a spoon imbued with teleki [SILVERPOWDER] Name = Silver Powder NamePlural = Silver Powders +PortionName = pile of Silver Powder +PortionNamePlural = piles of Silver Powder Pocket = 1 Price = 100 Flags = Fling_10 @@ -1277,6 +1335,8 @@ Description = An item to be held by a Pokémon. It is a hard and sharp fang that [BLACKGLASSES] Name = Black Glasses NamePlural = Black Glasses +PortionName = pair of Black Glasses +PortionNamePlural = pairs of Black Glasses Pocket = 1 Price = 100 Flags = Fling_30 @@ -1582,6 +1642,8 @@ Description = An item to be held by Chansey. It is a pair of gloves that boosts [METALPOWDER] Name = Metal Powder NamePlural = Metal Powders +PortionName = bag of Metal Powder +PortionNamePlural = bags of Metal Powder Pocket = 1 Price = 10 Flags = Fling_10 @@ -1590,6 +1652,8 @@ Description = An item to be held by Ditto. Extremely fine yet hard, this odd pow [QUICKPOWDER] Name = Quick Powder NamePlural = Quick Powders +PortionName = bag of Quick Powder +PortionNamePlural = bags of Quick Powder Pocket = 1 Price = 10 Flags = Fling_10 @@ -1759,6 +1823,8 @@ Description = A box packed with a tremendous amount of magma energy. It is loved [REAPERCLOTH] Name = Reaper Cloth NamePlural = Reaper Cloths +PortionName = scrap of Reaper Cloth +PortionNamePlural = scraps of Reaper Cloth Pocket = 1 Price = 2100 BPPrice = 8 @@ -1877,6 +1943,8 @@ Description = A medicine that fully restores the HP and heals any status problem [SACREDASH] Name = Sacred Ash NamePlural = Sacred Ashes +PortionName = bag of Sacred Ash +PortionNamePlural = bags of Sacred Ash Pocket = 2 Price = 200 FieldUse = Direct @@ -1997,6 +2065,8 @@ Description = A medicine that revives a fainted Pokémon. It fully restores the [BERRYJUICE] Name = Berry Juice NamePlural = Berry Juices +PortionName = cup of Berry Juice +PortionNamePlural = cups of Berry Juice Pocket = 2 Price = 100 FieldUse = OnPokemon @@ -2027,6 +2097,8 @@ Description = Very sweet chocolate. It restores the HP of one Pokémon by only 2 [FRESHWATER] Name = Fresh Water NamePlural = Fresh Waters +PortionName = bottle of Fresh Water +PortionNamePlural = bottles of Fresh Water Pocket = 2 Price = 200 FieldUse = OnPokemon @@ -2037,6 +2109,8 @@ Description = Water with a high mineral content. It restores the HP of one Poké [SODAPOP] Name = Soda Pop NamePlural = Soda Pops +PortionName = bottle of Soda Pop +PortionNamePlural = bottles of Soda Pop Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -2047,6 +2121,8 @@ Description = A fizzy soda drink. It restores the HP of one Pokémon by 60 point [LEMONADE] Name = Lemonade NamePlural = Lemonades +PortionName = can of Lemonade +PortionNamePlural = cans of Lemonade Pocket = 2 Price = 350 FieldUse = OnPokemon @@ -2057,6 +2133,8 @@ Description = A very sweet drink. It restores the HP of one Pokémon by 80 point [MOOMOOMILK] Name = Moomoo Milk NamePlural = Moomoo Milks +PortionName = bottle of Moomoo Milk +PortionNamePlural = bottles of Moomoo Milk Pocket = 2 Price = 500 FieldUse = OnPokemon @@ -2067,6 +2145,8 @@ Description = Milk with a very high nutrition content. It restores the HP of one [ENERGYPOWDER] Name = Energy Powder NamePlural = Energy Powders +PortionName = dose of Energy Powder +PortionNamePlural = doses of Energy Powder Pocket = 2 Price = 500 FieldUse = OnPokemon @@ -2087,6 +2167,8 @@ Description = A very bitter root. It restores the HP of one Pokémon by 200 poin [HEALPOWDER] Name = Heal Powder NamePlural = Heal Powders +PortionName = dose of Heal Powder +PortionNamePlural = doses of Heal Powder Pocket = 2 Price = 450 FieldUse = OnPokemon @@ -2148,6 +2230,8 @@ Description = It fully restores the PP of all the moves learned by the targeted [PPUP] Name = PP Up NamePlural = PP Ups +PortionName = bottle of PP Up +PortionNamePlural = bottles of PP Up Pocket = 2 Price = 9800 BPPrice = 16 @@ -2158,6 +2242,8 @@ Description = It slightly raises the maximum PP of a selected move that has been [PPMAX] Name = PP Max NamePlural = PP Maxes +PortionName = bottle of PP Max +PortionNamePlural = bottles of PP Max Pocket = 2 Price = 9800 FieldUse = OnPokemon @@ -2167,6 +2253,8 @@ Description = It maximally raises the top PP of a selected move that has been le [HPUP] Name = HP Up NamePlural = HP Ups +PortionName = bottle of HP Up +PortionNamePlural = bottles of HP Up Pocket = 2 Price = 9800 FieldUse = OnPokemon @@ -2176,6 +2264,8 @@ Description = A nutritious drink for Pokémon. It raises the base HP of a single [PROTEIN] Name = Protein NamePlural = Proteins +PortionName = bottle of Protein +PortionNamePlural = bottles of Protein Pocket = 2 Price = 9800 FieldUse = OnPokemon @@ -2185,6 +2275,8 @@ Description = A nutritious drink for Pokémon. It raises the base Attack stat of [IRON] Name = Iron NamePlural = Irons +PortionName = bottle of Iron +PortionNamePlural = bottles of Iron Pocket = 2 Price = 9800 FieldUse = OnPokemon @@ -2194,6 +2286,8 @@ Description = A nutritious drink for Pokémon. It raises the base Defense stat o [CALCIUM] Name = Calcium NamePlural = Calciums +PortionName = bottle of Calcium +PortionNamePlural = bottles of Calcium Pocket = 2 Price = 9800 FieldUse = OnPokemon @@ -2203,6 +2297,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Atk (Speci [ZINC] Name = Zinc NamePlural = Zincs +PortionName = bottle of Zinc +PortionNamePlural = bottles of Zinc Pocket = 2 Price = 9800 FieldUse = OnPokemon @@ -2212,6 +2308,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Def (Speci [CARBOS] Name = Carbos NamePlural = Carbos +PortionName = bottle of Carbos +PortionNamePlural = bottles of Carbos Pocket = 2 Price = 9800 FieldUse = OnPokemon @@ -4042,6 +4140,8 @@ Description = If held by a Pokémon and a special attack lands, the attacker als [GRASSMAIL] Name = Grass Mail NamePlural = Grass Mail +PortionName = piece of Grass Mail +PortionNamePlural = pieces of Grass Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4050,6 +4150,8 @@ Description = Stationery featuring a print of a refreshingly green field. Let a [FLAMEMAIL] Name = Flame Mail NamePlural = Flame Mail +PortionName = piece of Flame Mail +PortionNamePlural = pieces of Flame Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4058,6 +4160,8 @@ Description = Stationery featuring a print of flames in blazing red. Let a Poké [BUBBLEMAIL] Name = Bubble Mail NamePlural = Bubble Mail +PortionName = piece of Bubble Mail +PortionNamePlural = pieces of Bubble Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4066,6 +4170,8 @@ Description = Stationery featuring a print of a blue world underwater. Let a Pok [BLOOMMAIL] Name = Bloom Mail NamePlural = Bloom Mail +PortionName = piece of Bloom Mail +PortionNamePlural = pieces of Bloom Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4074,6 +4180,8 @@ Description = Stationery featuring a print of pretty floral patterns. Let a Pok [TUNNELMAIL] Name = Tunnel Mail NamePlural = Tunnel Mail +PortionName = piece of Tunnel Mail +PortionNamePlural = pieces of Tunnel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4082,6 +4190,8 @@ Description = Stationery featuring a print of a dimly lit coal mine. Let a Poké [STEELMAIL] Name = Steel Mail NamePlural = Steel Mail +PortionName = piece of Steel Mail +PortionNamePlural = pieces of Steel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4090,6 +4200,8 @@ Description = Stationery featuring a print of cool mechanical designs. Let a Pok [HEARTMAIL] Name = Heart Mail NamePlural = Heart Mail +PortionName = piece of Heart Mail +PortionNamePlural = pieces of Heart Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4098,6 +4210,8 @@ Description = Stationery featuring a print of giant heart patterns. Let a Pokém [SNOWMAIL] Name = Snow Mail NamePlural = Snow Mail +PortionName = piece of Snow Mail +PortionNamePlural = pieces of Snow Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4106,6 +4220,8 @@ Description = Stationery featuring a print of a chilly, snow-covered world. Let [SPACEMAIL] Name = Space Mail NamePlural = Space Mail +PortionName = piece of Space Mail +PortionNamePlural = pieces of Space Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4114,6 +4230,8 @@ Description = Stationery featuring a print depicting the huge expanse of space. [AIRMAIL] Name = Air Mail NamePlural = Air Mail +PortionName = piece of Air Mail +PortionNamePlural = pieces of Air Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4122,6 +4240,8 @@ Description = Stationery featuring a print of colorful letter sets. Let a Pokém [MOSAICMAIL] Name = Mosaic Mail NamePlural = Mosaic Mail +PortionName = piece of Mosaic Mail +PortionNamePlural = pieces of Mosaic Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4130,6 +4250,8 @@ Description = Stationery featuring a print of a vivid rainbow pattern. Let a Pok [BRICKMAIL] Name = Brick Mail NamePlural = Brick Mail +PortionName = piece of Brick Mail +PortionNamePlural = pieces of Brick Mail Pocket = 6 Price = 50 Flags = IconMail diff --git a/PBS/Gen 6/items.txt b/PBS/Gen 6/items.txt index 464fa633a..930512dcc 100644 --- a/PBS/Gen 6/items.txt +++ b/PBS/Gen 6/items.txt @@ -50,6 +50,8 @@ Description = A white flute made from blown glass. Its melody makes wild Pokémo [HONEY] Name = Honey NamePlural = Honey +PortionName = jar of Honey +PortionNamePlural = jars of Honey Pocket = 1 Price = 300 FieldUse = Direct @@ -390,6 +392,8 @@ Description = Very large pearls that sparkle in a pretty silver color. A maniac [STARDUST] Name = Stardust NamePlural = Stardusts +PortionName = bag of Stardust +PortionNamePlural = bags of Stardust Pocket = 1 Price = 3000 Flags = Fling_30 @@ -453,6 +457,8 @@ Description = A bone that is extremely valuable for Pokémon archaeology. It can [RELICCOPPER] Name = Relic Copper NamePlural = Relic Coppers +PortionName = Relic Copper coin +PortionNamePlural = Relic Copper coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -461,6 +467,8 @@ Description = A copper coin used in a civilization about 3,000 years ago. A mani [RELICSILVER] Name = Relic Silver NamePlural = Relic Silvers +PortionName = Relic Silver coin +PortionNamePlural = Relic Silver coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -469,6 +477,8 @@ Description = A silver coin used in a civilization about 3,000 years ago. A mani [RELICGOLD] Name = Relic Gold NamePlural = Relic Golds +PortionName = Relic Gold coin +PortionNamePlural = Relic Gold coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -509,6 +519,8 @@ Description = A crown made in a civilization about 3,000 years ago. A maniac wil [GROWTHMULCH] Name = Growth Mulch NamePlural = Growth Mulch +PortionName = bag of Growth Mulch +PortionNamePlural = bags of Growth Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -517,6 +529,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [DAMPMULCH] Name = Damp Mulch NamePlural = Damp Mulch +PortionName = bag of Damp Mulch +PortionNamePlural = bags of Damp Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -525,6 +539,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [STABLEMULCH] Name = Stable Mulch NamePlural = Stable Mulch +PortionName = bag of Stable Mulch +PortionNamePlural = bags of Stable Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -533,6 +549,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [GOOEYMULCH] Name = Gooey Mulch NamePlural = Gooey Mulch +PortionName = bag of Gooey Mulch +PortionNamePlural = bags of Gooey Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -541,6 +559,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [SHOALSALT] Name = Shoal Salt NamePlural = Shoal Salts +PortionName = pile of Shoal Salt +PortionNamePlural = piles of Shoal Salt Pocket = 1 Price = 20 Flags = Fling_30 @@ -574,6 +594,8 @@ Description = An item to be held by a Pokémon. The holder will float in the air [BRIGHTPOWDER] Name = Bright Powder NamePlural = Bright Powders +PortionName = bag of Bright Powder +PortionNamePlural = bags of Bright Powder Pocket = 1 Price = 4000 BPPrice = 48 @@ -628,6 +650,8 @@ Description = An item to be held by a Pokémon. This offensive vest raises Sp. D [SAFETYGOGGLES] Name = Safety Goggles NamePlural = Safety Goggles +PortionName = pair of Safety Goggles +PortionNamePlural = pairs of Safety Goggles Pocket = 1 Price = 4000 BPPrice = 48 @@ -722,6 +746,8 @@ Description = An item to be held by a Pokémon. This headband ups Attack, but al [CHOICESPECS] Name = Choice Specs NamePlural = Choice Specs +PortionName = pair of Choice Specs +PortionNamePlural = pairs of Choice Specs Pocket = 1 Price = 4000 BPPrice = 48 @@ -776,6 +802,8 @@ Description = A Pokémon held item that extends the duration of the move Hail us [LIGHTCLAY] Name = Light Clay NamePlural = Light Clays +PortionName = lump of Light Clay +PortionNamePlural = lumps of Light Clay Pocket = 1 Price = 4000 BPPrice = 48 @@ -812,6 +840,8 @@ Description = A Pokémon held item that boosts the power of HP-stealing moves to [BLACKSLUDGE] Name = Black Sludge NamePlural = Black Sludges +PortionName = blob of Black Sludge +PortionNamePlural = blobs of Black Sludge Pocket = 1 Price = 4000 BPPrice = 48 @@ -821,6 +851,8 @@ Description = A held item that gradually restores the HP of Poison-type Pokémon [LEFTOVERS] Name = Leftovers NamePlural = Leftovers +PortionName = serving of Leftovers +PortionNamePlural = servings of Leftovers Pocket = 1 Price = 4000 BPPrice = 48 @@ -883,7 +915,9 @@ Description = A consumable battery. If the holder is hit by an Electric-type mov #------------------------------- [LUMINOUSMOSS] Name = Luminous Moss -NamePlural = Luminous Mosses +NamePlural = Luminous Moss +PortionName = clump of Luminous Moss +PortionNamePlural = clumps of Luminous Moss Pocket = 1 Price = 4000 BPPrice = 32 @@ -947,6 +981,8 @@ Description = An item to be held by a Pokémon. It is a headband that slightly b [WISEGLASSES] Name = Wise Glasses NamePlural = Wise Glasses +PortionName = pair of Wise Glasses +PortionNamePlural = pairs of Wise Glasses Pocket = 1 Price = 4000 BPPrice = 48 @@ -1154,6 +1190,8 @@ Description = A Pokémon held item that promotes Speed gain on leveling, but red [LAXINCENSE] Name = Lax Incense NamePlural = Lax Incenses +PortionName = jar of Lax Incense +PortionNamePlural = jars of Lax Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1162,6 +1200,8 @@ Description = An item to be held by a Pokémon. The tricky aroma of this incense [FULLINCENSE] Name = Full Incense NamePlural = Full Incenses +PortionName = jar of Full Incense +PortionNamePlural = jars of Full Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1170,6 +1210,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense mak [LUCKINCENSE] Name = Luck Incense NamePlural = Luck Incenses +PortionName = jar of Luck Incense +PortionNamePlural = jars of Luck Incense Pocket = 1 Price = 11000 Flags = Fling_10 @@ -1178,6 +1220,8 @@ Description = An item to be held by a Pokémon. It doubles a battle's prize mone [PUREINCENSE] Name = Pure Incense NamePlural = Pure Incenses +PortionName = jar of Pure Incense +PortionNamePlural = jars of Pure Incense Pocket = 1 Price = 6000 Flags = Fling_10 @@ -1186,6 +1230,8 @@ Description = An item to be held by a Pokémon. It helps keep wild Pokémon away [SEAINCENSE] Name = Sea Incense NamePlural = Sea Incenses +PortionName = jar of Sea Incense +PortionNamePlural = jars of Sea Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1194,6 +1240,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [WAVEINCENSE] Name = Wave Incense NamePlural = Wave Incenses +PortionName = jar of Wave Incense +PortionNamePlural = jars of Wave Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1202,6 +1250,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [ROSEINCENSE] Name = Rose Incense NamePlural = Rose Incenses +PortionName = jar of Rose Incense +PortionNamePlural = jars of Rose Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1210,6 +1260,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ODDINCENSE] Name = Odd Incense NamePlural = Odd Incenses +PortionName = jar of Odd Incense +PortionNamePlural = jars of Odd Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1218,6 +1270,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ROCKINCENSE] Name = Rock Incense NamePlural = Rock Incenses +PortionName = jar of Rock Incense +PortionNamePlural = jars of Rock Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1226,6 +1280,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [CHARCOAL] Name = Charcoal NamePlural = Charcoals +PortionName = piece of Charcoal +PortionNamePlural = pieces of Charcoal Pocket = 1 Price = 1000 Flags = Fling_30 @@ -1258,6 +1314,8 @@ Description = An item to be held by a Pokémon. It is a seed imbued with life th [NEVERMELTICE] Name = Never-Melt Ice NamePlural = Never-Melt Ices +PortionName = piece of Never-Melt Ice +PortionNamePlural = pieces of Never-Melt Ice Pocket = 1 Price = 1000 Flags = Fling_30 @@ -1282,6 +1340,8 @@ Description = An item to be held by a Pokémon. It is a small, poisonous barb th [SOFTSAND] Name = Soft Sand NamePlural = Soft Sand +PortionName = bag of Soft Sand +PortionNamePlural = bags of Soft Sand Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1306,6 +1366,8 @@ Description = An item to be held by a Pokémon. It is a spoon imbued with teleki [SILVERPOWDER] Name = Silver Powder NamePlural = Silver Powders +PortionName = pile of Silver Powder +PortionNamePlural = piles of Silver Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1338,6 +1400,8 @@ Description = An item to be held by a Pokémon. It is a hard and sharp fang that [BLACKGLASSES] Name = Black Glasses NamePlural = Black Glasses +PortionName = pair of Black Glasses +PortionNamePlural = pairs of Black Glasses Pocket = 1 Price = 1000 Flags = Fling_30 @@ -1659,6 +1723,8 @@ Description = An item to be held by Chansey. It is a pair of gloves that boosts [METALPOWDER] Name = Metal Powder NamePlural = Metal Powders +PortionName = bag of Metal Powder +PortionNamePlural = bags of Metal Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1667,6 +1733,8 @@ Description = An item to be held by Ditto. Extremely fine yet hard, this odd pow [QUICKPOWDER] Name = Quick Powder NamePlural = Quick Powders +PortionName = bag of Quick Powder +PortionNamePlural = bags of Quick Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1836,6 +1904,8 @@ Description = A box packed with a tremendous amount of magma energy. It is loved [REAPERCLOTH] Name = Reaper Cloth NamePlural = Reaper Cloths +PortionName = scrap of Reaper Cloth +PortionNamePlural = scraps of Reaper Cloth Pocket = 1 Price = 2000 BPPrice = 32 @@ -1863,6 +1933,8 @@ Description = A peculiar stone that makes certain species of Pokémon evolve. It [WHIPPEDDREAM] Name = Whipped Dream NamePlural = Whipped Dreams +PortionName = dollop of Whipped Dream +PortionNamePlural = dollops of Whipped Dream Pocket = 1 Price = 2000 BPPrice = 32 @@ -2411,6 +2483,8 @@ Description = A medicine that fully restores the HP and heals any status problem [SACREDASH] Name = Sacred Ash NamePlural = Sacred Ashes +PortionName = bag of Sacred Ash +PortionNamePlural = bags of Sacred Ash Pocket = 2 Price = 50000 FieldUse = Direct @@ -2561,6 +2635,8 @@ Description = A medicine that revives a fainted Pokémon. It fully restores the [BERRYJUICE] Name = Berry Juice NamePlural = Berry Juices +PortionName = cup of Berry Juice +PortionNamePlural = cups of Berry Juice Pocket = 2 Price = 100 FieldUse = OnPokemon @@ -2581,6 +2657,8 @@ Description = Very sweet chocolate. It restores the HP of one Pokémon by only 2 [FRESHWATER] Name = Fresh Water NamePlural = Fresh Waters +PortionName = bottle of Fresh Water +PortionNamePlural = bottles of Fresh Water Pocket = 2 Price = 200 FieldUse = OnPokemon @@ -2591,6 +2669,8 @@ Description = Water with a high mineral content. It restores the HP of one Poké [SODAPOP] Name = Soda Pop NamePlural = Soda Pops +PortionName = bottle of Soda Pop +PortionNamePlural = bottles of Soda Pop Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -2601,6 +2681,8 @@ Description = A fizzy soda drink. It restores the HP of one Pokémon by 60 point [LEMONADE] Name = Lemonade NamePlural = Lemonades +PortionName = can of Lemonade +PortionNamePlural = cans of Lemonade Pocket = 2 Price = 350 FieldUse = OnPokemon @@ -2611,6 +2693,8 @@ Description = A very sweet drink. It restores the HP of one Pokémon by 80 point [MOOMOOMILK] Name = Moomoo Milk NamePlural = Moomoo Milks +PortionName = bottle of Moomoo Milk +PortionNamePlural = bottles of Moomoo Milk Pocket = 2 Price = 600 FieldUse = OnPokemon @@ -2621,6 +2705,8 @@ Description = Milk with a very high nutrition content. It restores the HP of one [ENERGYPOWDER] Name = Energy Powder NamePlural = Energy Powders +PortionName = dose of Energy Powder +PortionNamePlural = doses of Energy Powder Pocket = 2 Price = 500 FieldUse = OnPokemon @@ -2641,6 +2727,8 @@ Description = A very bitter root. It restores the HP of one Pokémon by 200 poin [HEALPOWDER] Name = Heal Powder NamePlural = Heal Powders +PortionName = dose of Heal Powder +PortionNamePlural = doses of Heal Powder Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -2702,6 +2790,8 @@ Description = It fully restores the PP of all the moves learned by the targeted [PPUP] Name = PP Up NamePlural = PP Ups +PortionName = bottle of PP Up +PortionNamePlural = bottles of PP Up Pocket = 2 Price = 10000 BPPrice = 48 @@ -2712,6 +2802,8 @@ Description = It slightly raises the maximum PP of a selected move that has been [PPMAX] Name = PP Max NamePlural = PP Maxes +PortionName = bottle of PP Max +PortionNamePlural = bottles of PP Max Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -2721,6 +2813,8 @@ Description = It maximally raises the top PP of a selected move that has been le [HPUP] Name = HP Up NamePlural = HP Ups +PortionName = bottle of HP Up +PortionNamePlural = bottles of HP Up Pocket = 2 Price = 10000 BPPrice = 2 @@ -2731,6 +2825,8 @@ Description = A nutritious drink for Pokémon. It raises the base HP of a single [PROTEIN] Name = Protein NamePlural = Proteins +PortionName = bottle of Protein +PortionNamePlural = bottles of Protein Pocket = 2 Price = 10000 BPPrice = 2 @@ -2741,6 +2837,8 @@ Description = A nutritious drink for Pokémon. It raises the base Attack stat of [IRON] Name = Iron NamePlural = Irons +PortionName = bottle of Iron +PortionNamePlural = bottles of Iron Pocket = 2 Price = 10000 BPPrice = 2 @@ -2751,6 +2849,8 @@ Description = A nutritious drink for Pokémon. It raises the base Defense stat o [CALCIUM] Name = Calcium NamePlural = Calciums +PortionName = bottle of Calcium +PortionNamePlural = bottles of Calcium Pocket = 2 Price = 10000 BPPrice = 2 @@ -2761,6 +2861,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Atk (Speci [ZINC] Name = Zinc NamePlural = Zincs +PortionName = bottle of Zinc +PortionNamePlural = bottles of Zinc Pocket = 2 Price = 10000 BPPrice = 2 @@ -2771,6 +2873,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Def (Speci [CARBOS] Name = Carbos NamePlural = Carbos +PortionName = bottle of Carbos +PortionNamePlural = bottles of Carbos Pocket = 2 Price = 10000 BPPrice = 2 @@ -4694,6 +4798,8 @@ Description = If held by a Pokémon, this Berry will increase the holder's Sp. D [GRASSMAIL] Name = Grass Mail NamePlural = Grass Mail +PortionName = piece of Grass Mail +PortionNamePlural = pieces of Grass Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4702,6 +4808,8 @@ Description = Stationery featuring a print of a refreshingly green field. Let a [FLAMEMAIL] Name = Flame Mail NamePlural = Flame Mail +PortionName = piece of Flame Mail +PortionNamePlural = pieces of Flame Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4710,6 +4818,8 @@ Description = Stationery featuring a print of flames in blazing red. Let a Poké [BUBBLEMAIL] Name = Bubble Mail NamePlural = Bubble Mail +PortionName = piece of Bubble Mail +PortionNamePlural = pieces of Bubble Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4718,6 +4828,8 @@ Description = Stationery featuring a print of a blue world underwater. Let a Pok [BLOOMMAIL] Name = Bloom Mail NamePlural = Bloom Mail +PortionName = piece of Bloom Mail +PortionNamePlural = pieces of Bloom Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4726,6 +4838,8 @@ Description = Stationery featuring a print of pretty floral patterns. Let a Pok [TUNNELMAIL] Name = Tunnel Mail NamePlural = Tunnel Mail +PortionName = piece of Tunnel Mail +PortionNamePlural = pieces of Tunnel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4734,6 +4848,8 @@ Description = Stationery featuring a print of a dimly lit coal mine. Let a Poké [STEELMAIL] Name = Steel Mail NamePlural = Steel Mail +PortionName = piece of Steel Mail +PortionNamePlural = pieces of Steel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4742,6 +4858,8 @@ Description = Stationery featuring a print of cool mechanical designs. Let a Pok [HEARTMAIL] Name = Heart Mail NamePlural = Heart Mail +PortionName = piece of Heart Mail +PortionNamePlural = pieces of Heart Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4750,6 +4868,8 @@ Description = Stationery featuring a print of giant heart patterns. Let a Pokém [SNOWMAIL] Name = Snow Mail NamePlural = Snow Mail +PortionName = piece of Snow Mail +PortionNamePlural = pieces of Snow Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4758,6 +4878,8 @@ Description = Stationery featuring a print of a chilly, snow-covered world. Let [SPACEMAIL] Name = Space Mail NamePlural = Space Mail +PortionName = piece of Space Mail +PortionNamePlural = pieces of Space Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4766,6 +4888,8 @@ Description = Stationery featuring a print depicting the huge expanse of space. [AIRMAIL] Name = Air Mail NamePlural = Air Mail +PortionName = piece of Air Mail +PortionNamePlural = pieces of Air Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4774,6 +4898,8 @@ Description = Stationery featuring a print of colorful letter sets. Let a Pokém [MOSAICMAIL] Name = Mosaic Mail NamePlural = Mosaic Mail +PortionName = piece of Mosaic Mail +PortionNamePlural = pieces of Mosaic Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4782,6 +4908,8 @@ Description = Stationery featuring a print of a vivid rainbow pattern. Let a Pok [BRICKMAIL] Name = Brick Mail NamePlural = Brick Mail +PortionName = piece of Brick Mail +PortionNamePlural = pieces of Brick Mail Pocket = 6 Price = 50 Flags = IconMail diff --git a/PBS/Gen 7/items.txt b/PBS/Gen 7/items.txt index 4cb04dd8b..245044011 100644 --- a/PBS/Gen 7/items.txt +++ b/PBS/Gen 7/items.txt @@ -50,6 +50,8 @@ Description = A white flute made from blown glass. Its melody makes wild Pokémo [HONEY] Name = Honey NamePlural = Honey +PortionName = jar of Honey +PortionNamePlural = jars of Honey Pocket = 1 Price = 300 FieldUse = Direct @@ -400,6 +402,8 @@ Description = Very large pearls that sparkle in a pretty silver color. A maniac [STARDUST] Name = Stardust NamePlural = Stardusts +PortionName = bag of Stardust +PortionNamePlural = bags of Stardust Pocket = 1 Price = 3000 Flags = Fling_30 @@ -463,6 +467,8 @@ Description = A bone that is extremely valuable for Pokémon archaeology. It can [RELICCOPPER] Name = Relic Copper NamePlural = Relic Coppers +PortionName = Relic Copper coin +PortionNamePlural = Relic Copper coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -471,6 +477,8 @@ Description = A copper coin used in a civilization about 3,000 years ago. A mani [RELICSILVER] Name = Relic Silver NamePlural = Relic Silvers +PortionName = Relic Silver coin +PortionNamePlural = Relic Silver coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -479,6 +487,8 @@ Description = A silver coin used in a civilization about 3,000 years ago. A mani [RELICGOLD] Name = Relic Gold NamePlural = Relic Golds +PortionName = Relic Gold coin +PortionNamePlural = Relic Gold coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -519,6 +529,8 @@ Description = A crown made in a civilization about 3,000 years ago. A maniac wil [GROWTHMULCH] Name = Growth Mulch NamePlural = Growth Mulch +PortionName = bag of Growth Mulch +PortionNamePlural = bags of Growth Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -527,6 +539,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [DAMPMULCH] Name = Damp Mulch NamePlural = Damp Mulch +PortionName = bag of Damp Mulch +PortionNamePlural = bags of Damp Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -535,6 +549,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [STABLEMULCH] Name = Stable Mulch NamePlural = Stable Mulch +PortionName = bag of Stable Mulch +PortionNamePlural = bags of Stable Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -543,6 +559,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [GOOEYMULCH] Name = Gooey Mulch NamePlural = Gooey Mulch +PortionName = bag of Gooey Mulch +PortionNamePlural = bags of Gooey Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -551,6 +569,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [SHOALSALT] Name = Shoal Salt NamePlural = Shoal Salts +PortionName = pile of Shoal Salt +PortionNamePlural = piles of Shoal Salt Pocket = 1 Price = 20 Flags = Fling_30 @@ -575,6 +595,8 @@ Description = A vital item that is needed to keep a stone tower from collapsing. [REDNECTAR] Name = Red Nectar NamePlural = Red Nectars +PortionName = jar of Red Nectar +PortionNamePlural = jars of Red Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -584,6 +606,8 @@ Description = A flower nectar obtained at Ula'ula Meadow. It changes the form of [YELLOWNECTAR] Name = Yellow Nectar NamePlural = Yellow Nectars +PortionName = jar of Yellow Nectar +PortionNamePlural = jars of Yellow Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -593,6 +617,8 @@ Description = A flower nectar obtained at Melemele Meadow. It changes the form o [PINKNECTAR] Name = Pink Nectar NamePlural = Pink Nectars +PortionName = jar of Pink Nectar +PortionNamePlural = jars of Pink Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -602,6 +628,8 @@ Description = A flower nectar obtained from shrubs on Royal Avenue. It changes t [PURPLENECTAR] Name = Purple Nectar NamePlural = Purple Nectars +PortionName = jar of Purple Nectar +PortionNamePlural = jars of Purple Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -620,6 +648,8 @@ Description = An item to be held by a Pokémon. The holder will float in the air [BRIGHTPOWDER] Name = Bright Powder NamePlural = Bright Powders +PortionName = bag of Bright Powder +PortionNamePlural = bags of Bright Powder Pocket = 1 Price = 4000 BPPrice = 48 @@ -674,6 +704,8 @@ Description = An item to be held by a Pokémon. This offensive vest raises Sp. D [SAFETYGOGGLES] Name = Safety Goggles NamePlural = Safety Goggles +PortionName = pair of Safety Goggles +PortionNamePlural = pairs of Safety Goggles Pocket = 1 Price = 4000 BPPrice = 48 @@ -777,6 +809,8 @@ Description = An item to be held by a Pokémon. This headband ups Attack, but al [CHOICESPECS] Name = Choice Specs NamePlural = Choice Specs +PortionName = pair of Choice Specs +PortionNamePlural = pairs of Choice Specs Pocket = 1 Price = 4000 BPPrice = 48 @@ -840,6 +874,8 @@ Description = An item to be held by a Pokémon. It extends the duration of the t [LIGHTCLAY] Name = Light Clay NamePlural = Light Clays +PortionName = lump of Light Clay +PortionNamePlural = lumps of Light Clay Pocket = 1 Price = 4000 BPPrice = 48 @@ -876,6 +912,8 @@ Description = A Pokémon held item that boosts the power of HP-stealing moves to [BLACKSLUDGE] Name = Black Sludge NamePlural = Black Sludges +PortionName = blob of Black Sludge +PortionNamePlural = blobs of Black Sludge Pocket = 1 Price = 4000 BPPrice = 48 @@ -885,6 +923,8 @@ Description = A held item that gradually restores the HP of Poison-type Pokémon [LEFTOVERS] Name = Leftovers NamePlural = Leftovers +PortionName = serving of Leftovers +PortionNamePlural = servings of Leftovers Pocket = 1 Price = 4000 BPPrice = 48 @@ -947,7 +987,9 @@ Description = A consumable battery. If the holder is hit by an Electric-type mov #------------------------------- [LUMINOUSMOSS] Name = Luminous Moss -NamePlural = Luminous Mosses +NamePlural = Luminous Moss +PortionName = clump of Luminous Moss +PortionNamePlural = clumps of Luminous Moss Pocket = 1 Price = 4000 BPPrice = 24 @@ -1052,6 +1094,8 @@ Description = An item to be held by a Pokémon. It is a headband that slightly b [WISEGLASSES] Name = Wise Glasses NamePlural = Wise Glasses +PortionName = pair of Wise Glasses +PortionNamePlural = pairs of Wise Glasses Pocket = 1 Price = 4000 BPPrice = 48 @@ -1259,6 +1303,8 @@ Description = A Pokémon held item that promotes Speed gain on leveling, but red [LAXINCENSE] Name = Lax Incense NamePlural = Lax Incenses +PortionName = jar of Lax Incense +PortionNamePlural = jars of Lax Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1267,6 +1313,8 @@ Description = An item to be held by a Pokémon. The tricky aroma of this incense [FULLINCENSE] Name = Full Incense NamePlural = Full Incenses +PortionName = jar of Full Incense +PortionNamePlural = jars of Full Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1275,6 +1323,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense mak [LUCKINCENSE] Name = Luck Incense NamePlural = Luck Incenses +PortionName = jar of Luck Incense +PortionNamePlural = jars of Luck Incense Pocket = 1 Price = 11000 Flags = Fling_10 @@ -1283,6 +1333,8 @@ Description = An item to be held by a Pokémon. It doubles a battle's prize mone [PUREINCENSE] Name = Pure Incense NamePlural = Pure Incenses +PortionName = jar of Pure Incense +PortionNamePlural = jars of Pure Incense Pocket = 1 Price = 6000 Flags = Fling_10 @@ -1291,6 +1343,8 @@ Description = An item to be held by a Pokémon. It helps keep wild Pokémon away [SEAINCENSE] Name = Sea Incense NamePlural = Sea Incenses +PortionName = jar of Sea Incense +PortionNamePlural = jars of Sea Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1299,6 +1353,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [WAVEINCENSE] Name = Wave Incense NamePlural = Wave Incenses +PortionName = jar of Wave Incense +PortionNamePlural = jars of Wave Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1307,6 +1363,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [ROSEINCENSE] Name = Rose Incense NamePlural = Rose Incenses +PortionName = jar of Rose Incense +PortionNamePlural = jars of Rose Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1315,6 +1373,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ODDINCENSE] Name = Odd Incense NamePlural = Odd Incenses +PortionName = jar of Odd Incense +PortionNamePlural = jars of Odd Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1323,6 +1383,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ROCKINCENSE] Name = Rock Incense NamePlural = Rock Incenses +PortionName = jar of Rock Incense +PortionNamePlural = jars of Rock Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1331,6 +1393,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [CHARCOAL] Name = Charcoal NamePlural = Charcoals +PortionName = piece of Charcoal +PortionNamePlural = pieces of Charcoal Pocket = 1 Price = 1000 Flags = Fling_30 @@ -1363,6 +1427,8 @@ Description = An item to be held by a Pokémon. It is a seed imbued with life th [NEVERMELTICE] Name = Never-Melt Ice NamePlural = Never-Melt Ices +PortionName = piece of Never-Melt Ice +PortionNamePlural = pieces of Never-Melt Ice Pocket = 1 Price = 1000 Flags = Fling_30 @@ -1387,6 +1453,8 @@ Description = An item to be held by a Pokémon. It is a small, poisonous barb th [SOFTSAND] Name = Soft Sand NamePlural = Soft Sand +PortionName = bag of Soft Sand +PortionNamePlural = bags of Soft Sand Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1411,6 +1479,8 @@ Description = An item to be held by a Pokémon. It is a spoon imbued with teleki [SILVERPOWDER] Name = Silver Powder NamePlural = Silver Powders +PortionName = pile of Silver Powder +PortionNamePlural = piles of Silver Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1443,6 +1513,8 @@ Description = An item to be held by a Pokémon. It is a hard and sharp fang that [BLACKGLASSES] Name = Black Glasses NamePlural = Black Glasses +PortionName = pair of Black Glasses +PortionNamePlural = pairs of Black Glasses Pocket = 1 Price = 1000 Flags = Fling_30 @@ -1764,6 +1836,8 @@ Description = An item to be held by Chansey. It is a pair of gloves that boosts [METALPOWDER] Name = Metal Powder NamePlural = Metal Powders +PortionName = bag of Metal Powder +PortionNamePlural = bags of Metal Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1772,6 +1846,8 @@ Description = An item to be held by Ditto. Extremely fine yet hard, this odd pow [QUICKPOWDER] Name = Quick Powder NamePlural = Quick Powders +PortionName = bag of Quick Powder +PortionNamePlural = bags of Quick Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -2077,6 +2153,8 @@ Description = A box packed with a tremendous amount of magma energy. It is loved [REAPERCLOTH] Name = Reaper Cloth NamePlural = Reaper Cloths +PortionName = scrap of Reaper Cloth +PortionNamePlural = scraps of Reaper Cloth Pocket = 1 Price = 2000 BPPrice = 32 @@ -2104,6 +2182,8 @@ Description = A peculiar stone that makes certain species of Pokémon evolve. It [WHIPPEDDREAM] Name = Whipped Dream NamePlural = Whipped Dreams +PortionName = dollop of Whipped Dream +PortionNamePlural = dollops of Whipped Dream Pocket = 1 Price = 2000 BPPrice = 32 @@ -2651,6 +2731,8 @@ Description = A medicine that fully restores the HP and heals any status problem [SACREDASH] Name = Sacred Ash NamePlural = Sacred Ashes +PortionName = bag of Sacred Ash +PortionNamePlural = bags of Sacred Ash Pocket = 2 Price = 50000 FieldUse = Direct @@ -2811,6 +2893,8 @@ Description = A medicine that revives a fainted Pokémon. It fully restores the [BERRYJUICE] Name = Berry Juice NamePlural = Berry Juices +PortionName = cup of Berry Juice +PortionNamePlural = cups of Berry Juice Pocket = 2 Price = 100 FieldUse = OnPokemon @@ -2831,6 +2915,8 @@ Description = Very sweet chocolate. It restores the HP of one Pokémon by only 2 [FRESHWATER] Name = Fresh Water NamePlural = Fresh Waters +PortionName = bottle of Fresh Water +PortionNamePlural = bottles of Fresh Water Pocket = 2 Price = 200 FieldUse = OnPokemon @@ -2841,6 +2927,8 @@ Description = Water with a high mineral content. It restores the HP of one Poké [SODAPOP] Name = Soda Pop NamePlural = Soda Pops +PortionName = bottle of Soda Pop +PortionNamePlural = bottles of Soda Pop Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -2851,6 +2939,8 @@ Description = A fizzy soda drink. It restores the HP of one Pokémon by 60 point [LEMONADE] Name = Lemonade NamePlural = Lemonades +PortionName = can of Lemonade +PortionNamePlural = cans of Lemonade Pocket = 2 Price = 350 FieldUse = OnPokemon @@ -2861,6 +2951,8 @@ Description = A very sweet drink. It restores the HP of one Pokémon by 80 point [MOOMOOMILK] Name = Moomoo Milk NamePlural = Moomoo Milks +PortionName = bottle of Moomoo Milk +PortionNamePlural = bottles of Moomoo Milk Pocket = 2 Price = 600 FieldUse = OnPokemon @@ -2871,6 +2963,8 @@ Description = Milk with a very high nutrition content. It restores the HP of one [ENERGYPOWDER] Name = Energy Powder NamePlural = Energy Powders +PortionName = dose of Energy Powder +PortionNamePlural = doses of Energy Powder Pocket = 2 Price = 500 FieldUse = OnPokemon @@ -2891,6 +2985,8 @@ Description = A very bitter root. It restores the HP of one Pokémon by 200 poin [HEALPOWDER] Name = Heal Powder NamePlural = Heal Powders +PortionName = dose of Heal Powder +PortionNamePlural = doses of Heal Powder Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -2952,6 +3048,8 @@ Description = It fully restores the PP of all the moves learned by the targeted [PPUP] Name = PP Up NamePlural = PP Ups +PortionName = bottle of PP Up +PortionNamePlural = bottles of PP Up Pocket = 2 Price = 10000 BPPrice = 48 @@ -2962,6 +3060,8 @@ Description = It slightly raises the maximum PP of a selected move that has been [PPMAX] Name = PP Max NamePlural = PP Maxes +PortionName = bottle of PP Max +PortionNamePlural = bottles of PP Max Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -2971,6 +3071,8 @@ Description = It maximally raises the top PP of a selected move that has been le [HPUP] Name = HP Up NamePlural = HP Ups +PortionName = bottle of HP Up +PortionNamePlural = bottles of HP Up Pocket = 2 Price = 10000 BPPrice = 2 @@ -2981,6 +3083,8 @@ Description = A nutritious drink for Pokémon. It raises the base HP of a single [PROTEIN] Name = Protein NamePlural = Proteins +PortionName = bottle of Protein +PortionNamePlural = bottles of Protein Pocket = 2 Price = 10000 BPPrice = 2 @@ -2991,6 +3095,8 @@ Description = A nutritious drink for Pokémon. It raises the base Attack stat of [IRON] Name = Iron NamePlural = Irons +PortionName = bottle of Iron +PortionNamePlural = bottles of Iron Pocket = 2 Price = 10000 BPPrice = 2 @@ -3001,6 +3107,8 @@ Description = A nutritious drink for Pokémon. It raises the base Defense stat o [CALCIUM] Name = Calcium NamePlural = Calciums +PortionName = bottle of Calcium +PortionNamePlural = bottles of Calcium Pocket = 2 Price = 10000 BPPrice = 2 @@ -3011,6 +3119,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Atk (Speci [ZINC] Name = Zinc NamePlural = Zincs +PortionName = bottle of Zinc +PortionNamePlural = bottles of Zinc Pocket = 2 Price = 10000 BPPrice = 2 @@ -3021,6 +3131,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Def (Speci [CARBOS] Name = Carbos NamePlural = Carbos +PortionName = bottle of Carbos +PortionNamePlural = bottles of Carbos Pocket = 2 Price = 10000 BPPrice = 2 @@ -4853,6 +4965,8 @@ Description = If held by a Pokémon, this Berry will increase the holder's Sp. D [GRASSMAIL] Name = Grass Mail NamePlural = Grass Mail +PortionName = piece of Grass Mail +PortionNamePlural = pieces of Grass Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4861,6 +4975,8 @@ Description = Stationery featuring a print of a refreshingly green field. Let a [FLAMEMAIL] Name = Flame Mail NamePlural = Flame Mail +PortionName = piece of Flame Mail +PortionNamePlural = pieces of Flame Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4869,6 +4985,8 @@ Description = Stationery featuring a print of flames in blazing red. Let a Poké [BUBBLEMAIL] Name = Bubble Mail NamePlural = Bubble Mail +PortionName = piece of Bubble Mail +PortionNamePlural = pieces of Bubble Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4877,6 +4995,8 @@ Description = Stationery featuring a print of a blue world underwater. Let a Pok [BLOOMMAIL] Name = Bloom Mail NamePlural = Bloom Mail +PortionName = piece of Bloom Mail +PortionNamePlural = pieces of Bloom Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4885,6 +5005,8 @@ Description = Stationery featuring a print of pretty floral patterns. Let a Pok [TUNNELMAIL] Name = Tunnel Mail NamePlural = Tunnel Mail +PortionName = piece of Tunnel Mail +PortionNamePlural = pieces of Tunnel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4893,6 +5015,8 @@ Description = Stationery featuring a print of a dimly lit coal mine. Let a Poké [STEELMAIL] Name = Steel Mail NamePlural = Steel Mail +PortionName = piece of Steel Mail +PortionNamePlural = pieces of Steel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4901,6 +5025,8 @@ Description = Stationery featuring a print of cool mechanical designs. Let a Pok [HEARTMAIL] Name = Heart Mail NamePlural = Heart Mail +PortionName = piece of Heart Mail +PortionNamePlural = pieces of Heart Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4909,6 +5035,8 @@ Description = Stationery featuring a print of giant heart patterns. Let a Pokém [SNOWMAIL] Name = Snow Mail NamePlural = Snow Mail +PortionName = piece of Snow Mail +PortionNamePlural = pieces of Snow Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4917,6 +5045,8 @@ Description = Stationery featuring a print of a chilly, snow-covered world. Let [SPACEMAIL] Name = Space Mail NamePlural = Space Mail +PortionName = piece of Space Mail +PortionNamePlural = pieces of Space Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4925,6 +5055,8 @@ Description = Stationery featuring a print depicting the huge expanse of space. [AIRMAIL] Name = Air Mail NamePlural = Air Mail +PortionName = piece of Air Mail +PortionNamePlural = pieces of Air Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4933,6 +5065,8 @@ Description = Stationery featuring a print of colorful letter sets. Let a Pokém [MOSAICMAIL] Name = Mosaic Mail NamePlural = Mosaic Mail +PortionName = piece of Mosaic Mail +PortionNamePlural = pieces of Mosaic Mail Pocket = 6 Price = 50 Flags = IconMail @@ -4941,6 +5075,8 @@ Description = Stationery featuring a print of a vivid rainbow pattern. Let a Pok [BRICKMAIL] Name = Brick Mail NamePlural = Brick Mail +PortionName = piece of Brick Mail +PortionNamePlural = pieces of Brick Mail Pocket = 6 Price = 50 Flags = IconMail diff --git a/PBS/Gen 8/items.txt b/PBS/Gen 8/items.txt index 4642a646e..a2e945334 100644 --- a/PBS/Gen 8/items.txt +++ b/PBS/Gen 8/items.txt @@ -50,6 +50,8 @@ Description = A white flute made from blown glass. Its melody makes wild Pokémo [HONEY] Name = Honey NamePlural = Honey +PortionName = jar of Honey +PortionNamePlural = jars of Honey Pocket = 1 Price = 900 FieldUse = Direct @@ -404,7 +406,7 @@ Description = The fossil of an ancient Pokémon that once soared through the sky #------------------------------- [FOSSILIZEDFISH] Name = Fossilized Fish -NamePlural = Fossilized Fishes +NamePlural = Fossilized Fish Pocket = 1 Price = 5000 Flags = Fling_100 @@ -485,6 +487,8 @@ Description = Very large pearls that sparkle in a pretty silver color. A maniac [STARDUST] Name = Stardust NamePlural = Stardusts +PortionName = bag of Stardust +PortionNamePlural = bags of Stardust Pocket = 1 Price = 3000 Flags = Fling_30 @@ -548,6 +552,8 @@ Description = A bone that is extremely valuable for Pokémon archaeology. It can [RELICCOPPER] Name = Relic Copper NamePlural = Relic Coppers +PortionName = Relic Copper coin +PortionNamePlural = Relic Copper coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -556,6 +562,8 @@ Description = A copper coin used in a civilization about 3,000 years ago. A mani [RELICSILVER] Name = Relic Silver NamePlural = Relic Silvers +PortionName = Relic Silver coin +PortionNamePlural = Relic Silver coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -564,6 +572,8 @@ Description = A silver coin used in a civilization about 3,000 years ago. A mani [RELICGOLD] Name = Relic Gold NamePlural = Relic Golds +PortionName = Relic Gold coin +PortionNamePlural = Relic Gold coins Pocket = 1 Price = 60000 Flags = Fling_30 @@ -604,6 +614,8 @@ Description = A crown made in a civilization about 3,000 years ago. A maniac wil [GROWTHMULCH] Name = Growth Mulch NamePlural = Growth Mulch +PortionName = bag of Growth Mulch +PortionNamePlural = bags of Growth Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -612,6 +624,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [DAMPMULCH] Name = Damp Mulch NamePlural = Damp Mulch +PortionName = bag of Damp Mulch +PortionNamePlural = bags of Damp Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -620,6 +634,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [STABLEMULCH] Name = Stable Mulch NamePlural = Stable Mulch +PortionName = bag of Stable Mulch +PortionNamePlural = bags of Stable Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -628,6 +644,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [GOOEYMULCH] Name = Gooey Mulch NamePlural = Gooey Mulch +PortionName = bag of Gooey Mulch +PortionNamePlural = bags of Gooey Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -636,6 +654,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [SHOALSALT] Name = Shoal Salt NamePlural = Shoal Salts +PortionName = pile of Shoal Salt +PortionNamePlural = piles of Shoal Salt Pocket = 1 Price = 20 Flags = Fling_30 @@ -660,6 +680,8 @@ Description = A vital item that is needed to keep a stone tower from collapsing. [REDNECTAR] Name = Red Nectar NamePlural = Red Nectars +PortionName = jar of Red Nectar +PortionNamePlural = jars of Red Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -669,6 +691,8 @@ Description = A flower nectar obtained at Ula'ula Meadow. It changes the form of [YELLOWNECTAR] Name = Yellow Nectar NamePlural = Yellow Nectars +PortionName = jar of Yellow Nectar +PortionNamePlural = jars of Yellow Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -678,6 +702,8 @@ Description = A flower nectar obtained at Melemele Meadow. It changes the form o [PINKNECTAR] Name = Pink Nectar NamePlural = Pink Nectars +PortionName = jar of Pink Nectar +PortionNamePlural = jars of Pink Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -687,6 +713,8 @@ Description = A flower nectar obtained from shrubs on Royal Avenue. It changes t [PURPLENECTAR] Name = Purple Nectar NamePlural = Purple Nectars +PortionName = jar of Purple Nectar +PortionNamePlural = jars of Purple Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -706,6 +734,8 @@ Description = An item to be held by a Pokémon. The holder will float in the air [BRIGHTPOWDER] Name = Bright Powder NamePlural = Bright Powders +PortionName = bag of Bright Powder +PortionNamePlural = bags of Bright Powder Pocket = 1 Price = 3000 SellPrice = 2000 @@ -765,6 +795,8 @@ Description = An item to be held by a Pokémon. This offensive vest raises Sp. D [SAFETYGOGGLES] Name = Safety Goggles NamePlural = Safety Goggles +PortionName = pair of Safety Goggles +PortionNamePlural = pairs of Safety Goggles Pocket = 1 Price = 3000 SellPrice = 2000 @@ -775,6 +807,8 @@ Description = An item to be held by a Pokémon. They protect the holder from wea [PROTECTIVEPADS] Name = Protective Pads NamePlural = Protective Pads +PortionName = set of Protective Pads +PortionNamePlural = sets of Protective Pads Pocket = 1 Price = 3000 SellPrice = 2000 @@ -784,7 +818,9 @@ Description = An item to be held by a Pokémon. They protect the holder from eff #------------------------------- [HEAVYDUTYBOOTS] Name = Heavy-Duty Boots -NamePlural = pairs of Heavy-Duty Boots +NamePlural = Heavy-Duty Boots +PortionName = pair of Heavy-Duty Boots +PortionNamePlural = pairs of Heavy-Duty Boots Pocket = 1 Price = 3000 SellPrice = 2000 @@ -904,6 +940,8 @@ Description = An item to be held by a Pokémon. This headband ups Attack, but al [CHOICESPECS] Name = Choice Specs NamePlural = Choice Specs +PortionName = pair of Choice Specs +PortionNamePlural = pairs of Choice Specs Pocket = 1 Price = 4000 BPPrice = 25 @@ -967,6 +1005,8 @@ Description = An item to be held by a Pokémon. It extends the duration of the t [LIGHTCLAY] Name = Light Clay NamePlural = Light Clays +PortionName = lump of Light Clay +PortionNamePlural = lumps of Light Clay Pocket = 1 Price = 4000 BPPrice = 15 @@ -1004,6 +1044,8 @@ Description = A Pokémon held item that boosts the power of HP-stealing moves to [BLACKSLUDGE] Name = Black Sludge NamePlural = Black Sludges +PortionName = blob of Black Sludge +PortionNamePlural = blobs of Black Sludge Pocket = 1 Price = 3000 SellPrice = 2000 @@ -1014,6 +1056,8 @@ Description = A held item that gradually restores the HP of Poison-type Pokémon [LEFTOVERS] Name = Leftovers NamePlural = Leftovers +PortionName = serving of Leftovers +PortionNamePlural = servings of Leftovers Pocket = 1 Price = 4000 BPPrice = 25 @@ -1076,7 +1120,9 @@ Description = A consumable battery. If the holder is hit by an Electric-type mov #------------------------------- [LUMINOUSMOSS] Name = Luminous Moss -NamePlural = Luminous Mosses +NamePlural = Luminous Moss +PortionName = clump of Luminous Moss +PortionNamePlural = clumps of Luminous Moss Pocket = 1 Price = 4000 BPPrice = 10 @@ -1113,6 +1159,8 @@ Description = Raises Speed sharply when a Pokémon misses with a move because of [THROATSPRAY] Name = Throat Spray NamePlural = Throat Sprays +PortionName = bottle of Throat Spray +PortionNamePlural = bottles of Throat Spray Pocket = 1 Price = 4000 BPPrice = 10 @@ -1131,6 +1179,8 @@ Description = An item to be held by a Pokémon. It boosts Speed when intimidated [ROOMSERVICE] Name = Room Service NamePlural = Room Services +PortionName = voucher for Room Service +PortionNamePlural = vouchers for Room Service Pocket = 1 Price = 4000 BPPrice = 15 @@ -1213,6 +1263,8 @@ Description = An item to be held by a Pokémon. It is a headband that slightly b [WISEGLASSES] Name = Wise Glasses NamePlural = Wise Glasses +PortionName = pair of Wise Glasses +PortionNamePlural = pairs of Wise Glasses Pocket = 1 Price = 4000 BPPrice = 48 @@ -1425,6 +1477,8 @@ Description = A Pokémon held item that promotes Speed gain on leveling, but red [LAXINCENSE] Name = Lax Incense NamePlural = Lax Incenses +PortionName = jar of Lax Incense +PortionNamePlural = jars of Lax Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1433,6 +1487,8 @@ Description = An item to be held by a Pokémon. The tricky aroma of this incense [FULLINCENSE] Name = Full Incense NamePlural = Full Incenses +PortionName = jar of Full Incense +PortionNamePlural = jars of Full Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1441,6 +1497,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense mak [LUCKINCENSE] Name = Luck Incense NamePlural = Luck Incenses +PortionName = jar of Luck Incense +PortionNamePlural = jars of Luck Incense Pocket = 1 Price = 11000 Flags = Fling_10 @@ -1449,6 +1507,8 @@ Description = An item to be held by a Pokémon. It doubles a battle's prize mone [PUREINCENSE] Name = Pure Incense NamePlural = Pure Incenses +PortionName = jar of Pure Incense +PortionNamePlural = jars of Pure Incense Pocket = 1 Price = 6000 Flags = Fling_10 @@ -1457,6 +1517,8 @@ Description = An item to be held by a Pokémon. It helps keep wild Pokémon away [SEAINCENSE] Name = Sea Incense NamePlural = Sea Incenses +PortionName = jar of Sea Incense +PortionNamePlural = jars of Sea Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1465,6 +1527,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [WAVEINCENSE] Name = Wave Incense NamePlural = Wave Incenses +PortionName = jar of Wave Incense +PortionNamePlural = jars of Wave Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1473,6 +1537,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [ROSEINCENSE] Name = Rose Incense NamePlural = Rose Incenses +PortionName = jar of Rose Incense +PortionNamePlural = jars of Rose Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1481,6 +1547,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ODDINCENSE] Name = Odd Incense NamePlural = Odd Incenses +PortionName = jar of Odd Incense +PortionNamePlural = jars of Odd Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1489,6 +1557,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ROCKINCENSE] Name = Rock Incense NamePlural = Rock Incenses +PortionName = jar of Rock Incense +PortionNamePlural = jars of Rock Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1497,6 +1567,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [CHARCOAL] Name = Charcoal NamePlural = Charcoals +PortionName = piece of Charcoal +PortionNamePlural = pieces of Charcoal Pocket = 1 Price = 3000 SellPrice = 500 @@ -1533,6 +1605,8 @@ Description = An item to be held by a Pokémon. It is a seed imbued with life th [NEVERMELTICE] Name = Never-Melt Ice NamePlural = Never-Melt Ices +PortionName = piece of Never-Melt Ice +PortionNamePlural = pieces of Never-Melt Ice Pocket = 1 Price = 3000 SellPrice = 500 @@ -1560,6 +1634,8 @@ Description = An item to be held by a Pokémon. It is a small, poisonous barb th [SOFTSAND] Name = Soft Sand NamePlural = Soft Sand +PortionName = bag of Soft Sand +PortionNamePlural = bags of Soft Sand Pocket = 1 Price = 3000 SellPrice = 500 @@ -1587,6 +1663,8 @@ Description = An item to be held by a Pokémon. It is a spoon imbued with teleki [SILVERPOWDER] Name = Silver Powder NamePlural = Silver Powders +PortionName = pile of Silver Powder +PortionNamePlural = piles of Silver Powder Pocket = 1 Price = 3000 SellPrice = 500 @@ -1623,6 +1701,8 @@ Description = An item to be held by a Pokémon. It is a hard and sharp fang that [BLACKGLASSES] Name = Black Glasses NamePlural = Black Glasses +PortionName = pair of Black Glasses +PortionNamePlural = pairs of Black Glasses Pocket = 1 Price = 3000 SellPrice = 500 @@ -1964,6 +2044,8 @@ Description = An item to be held by Chansey. It is a pair of gloves that boosts [METALPOWDER] Name = Metal Powder NamePlural = Metal Powders +PortionName = bag of Metal Powder +PortionNamePlural = bags of Metal Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1972,6 +2054,8 @@ Description = An item to be held by Ditto. Extremely fine yet hard, this odd pow [QUICKPOWDER] Name = Quick Powder NamePlural = Quick Powders +PortionName = bag of Quick Powder +PortionNamePlural = bags of Quick Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -2300,6 +2384,8 @@ Description = A box packed with a tremendous amount of magma energy. It is loved [REAPERCLOTH] Name = Reaper Cloth NamePlural = Reaper Cloths +PortionName = scrap of Reaper Cloth +PortionNamePlural = scraps of Reaper Cloth Pocket = 1 Price = 3000 SellPrice = 1000 @@ -2330,6 +2416,8 @@ Description = A peculiar stone that makes certain species of Pokémon evolve. It [WHIPPEDDREAM] Name = Whipped Dream NamePlural = Whipped Dreams +PortionName = dollop of Whipped Dream +PortionNamePlural = dollops of Whipped Dream Pocket = 1 Price = 3000 SellPrice = 1000 @@ -2905,6 +2993,8 @@ Description = A medicine that fully restores the HP and heals any status problem [SACREDASH] Name = Sacred Ash NamePlural = Sacred Ashes +PortionName = bag of Sacred Ash +PortionNamePlural = bags of Sacred Ash Pocket = 2 Price = 50000 FieldUse = Direct @@ -2974,6 +3064,8 @@ Description = A spray-type medicine. It heals all the status problems of a singl [PEWTERCRUNCHIES] Name = Pewter Crunchies NamePlural = Pewter Crunchies +PortionName = bag of Pewter Crunchies +PortionNamePlural = bags of Pewter Crunchies Pocket = 2 Price = 250 FieldUse = OnPokemon @@ -3075,6 +3167,8 @@ Description = A medicine that revives a fainted Pokémon. It fully restores the [BERRYJUICE] Name = Berry Juice NamePlural = Berry Juices +PortionName = cup of Berry Juice +PortionNamePlural = cups of Berry Juice Pocket = 2 Price = 100 FieldUse = OnPokemon @@ -3095,6 +3189,8 @@ Description = Very sweet chocolate. It restores the HP of one Pokémon by only 2 [FRESHWATER] Name = Fresh Water NamePlural = Fresh Waters +PortionName = bottle of Fresh Water +PortionNamePlural = bottles of Fresh Water Pocket = 2 Price = 200 FieldUse = OnPokemon @@ -3105,6 +3201,8 @@ Description = Water with high mineral content. It can be used to restore 30 HP t [SODAPOP] Name = Soda Pop NamePlural = Soda Pops +PortionName = bottle of Soda Pop +PortionNamePlural = bottles of Soda Pop Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -3115,6 +3213,8 @@ Description = A highly carbonated soda drink. It can be used to restore 50 HP to [LEMONADE] Name = Lemonade NamePlural = Lemonades +PortionName = can of Lemonade +PortionNamePlural = cans of Lemonade Pocket = 2 Price = 350 SellPrice = 200 @@ -3126,6 +3226,8 @@ Description = A very sweet and refreshing drink. It can be used to restore 70 HP [MOOMOOMILK] Name = Moomoo Milk NamePlural = Moomoo Milks +PortionName = bottle of Moomoo Milk +PortionNamePlural = bottles of Moomoo Milk Pocket = 2 Price = 600 FieldUse = OnPokemon @@ -3136,6 +3238,8 @@ Description = Milk with a very high nutrition content. It restores the HP of one [ENERGYPOWDER] Name = Energy Powder NamePlural = Energy Powders +PortionName = dose of Energy Powder +PortionNamePlural = doses of Energy Powder Pocket = 2 Price = 500 FieldUse = OnPokemon @@ -3156,6 +3260,8 @@ Description = An extremely bitter medicinal root. It can be used to restore 120 [HEALPOWDER] Name = Heal Powder NamePlural = Heal Powders +PortionName = dose of Heal Powder +PortionNamePlural = doses of Heal Powder Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -3176,6 +3282,8 @@ Description = A very bitter medicinal herb. It revives a fainted Pokémon, fully [MAXHONEY] Name = Max Honey NamePlural = Max Honeys +PortionName = comb of Max Honey +PortionNamePlural = combs of Max Honey Pocket = 2 Price = 8000 FieldUse = OnPokemon @@ -3227,6 +3335,8 @@ Description = It fully restores the PP of all the moves learned by the targeted [PPUP] Name = PP Up NamePlural = PP Ups +PortionName = bottle of PP Up +PortionNamePlural = bottles of PP Up Pocket = 2 Price = 10000 BPPrice = 10 @@ -3237,6 +3347,8 @@ Description = It slightly raises the maximum PP of a selected move that has been [PPMAX] Name = PP Max NamePlural = PP Maxes +PortionName = bottle of PP Max +PortionNamePlural = bottles of PP Max Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3246,6 +3358,8 @@ Description = It maximally raises the top PP of a selected move that has been le [HPUP] Name = HP Up NamePlural = HP Ups +PortionName = bottle of HP Up +PortionNamePlural = bottles of HP Up Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3255,6 +3369,8 @@ Description = A nutritious drink for Pokémon. It raises the base HP of a single [PROTEIN] Name = Protein NamePlural = Proteins +PortionName = bottle of Protein +PortionNamePlural = bottles of Protein Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3264,6 +3380,8 @@ Description = A nutritious drink for Pokémon. It raises the base Attack stat of [IRON] Name = Iron NamePlural = Irons +PortionName = bottle of Iron +PortionNamePlural = bottles of Iron Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3273,6 +3391,8 @@ Description = A nutritious drink for Pokémon. It raises the base Defense stat o [CALCIUM] Name = Calcium NamePlural = Calciums +PortionName = bottle of Calcium +PortionNamePlural = bottles of Calcium Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3282,6 +3402,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Atk (Speci [ZINC] Name = Zinc NamePlural = Zincs +PortionName = bottle of Zinc +PortionNamePlural = bottles of Zinc Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3291,6 +3413,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Def (Speci [CARBOS] Name = Carbos NamePlural = Carbos +PortionName = bottle of Carbos +PortionNamePlural = bottles of Carbos Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3354,6 +3478,8 @@ Description = An item for use on a Pokémon. It slightly increases the base Spee [LONELYMINT] Name = Lonely Mint NamePlural = Lonely Mints +PortionName = sprig of Lonely Mint +PortionNamePlural = sprigs of Lonely Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3364,6 +3490,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [ADAMANTMINT] Name = Adamant Mint NamePlural = Adamant Mints +PortionName = sprig of Adamant Mint +PortionNamePlural = sprigs of Adamant Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3374,6 +3502,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [NAUGHTYMINT] Name = Naughty Mint NamePlural = Naughty Mints +PortionName = sprig of Naughty Mint +PortionNamePlural = sprigs of Naughty Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3384,6 +3514,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [BRAVEMINT] Name = Brave Mint NamePlural = Brave Mints +PortionName = sprig of Brave Mint +PortionNamePlural = sprigs of Brave Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3394,6 +3526,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [BOLDMINT] Name = Bold Mint NamePlural = Bold Mints +PortionName = sprig of Bold Mint +PortionNamePlural = sprigs of Bold Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3404,6 +3538,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [IMPISHMINT] Name = Impish Mint NamePlural = Impish Mints +PortionName = sprig of Impish Mint +PortionNamePlural = sprigs of Impish Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3414,6 +3550,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [LAXMINT] Name = Lax Mint NamePlural = Lax Mints +PortionName = sprig of Lax Mint +PortionNamePlural = sprigs of Lax Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3424,6 +3562,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [RELAXEDMINT] Name = Relaxed Mint NamePlural = Relaxed Mints +PortionName = sprig of Relaxed Mint +PortionNamePlural = sprigs of Relaxed Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3434,6 +3574,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [MODESTMINT] Name = Modest Mint NamePlural = Modest Mints +PortionName = sprig of Modest Mint +PortionNamePlural = sprigs of Modest Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3444,6 +3586,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [MILDMINT] Name = Mild Mint NamePlural = Mild Mints +PortionName = sprig of Mild Mint +PortionNamePlural = sprigs of Mild Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3454,6 +3598,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [RASHMINT] Name = Rash Mint NamePlural = Rash Mints +PortionName = sprig of Rash Mint +PortionNamePlural = sprigs of Rash Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3464,6 +3610,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [QUIETMINT] Name = Quiet Mint NamePlural = Quiet Mints +PortionName = sprig of Quiet Mint +PortionNamePlural = sprigs of Quiet Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3474,6 +3622,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [CALMMINT] Name = Calm Mint NamePlural = Calm Mints +PortionName = sprig of Calm Mint +PortionNamePlural = sprigs of Calm Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3484,6 +3634,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [GENTLEMINT] Name = Gentle Mint NamePlural = Gentle Mints +PortionName = sprig of Gentle Mint +PortionNamePlural = sprigs of Gentle Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3494,6 +3646,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [CAREFULMINT] Name = Careful Mint NamePlural = Careful Mints +PortionName = sprig of Careful Mint +PortionNamePlural = sprigs of Careful Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3504,6 +3658,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [SASSYMINT] Name = Sassy Mint NamePlural = Sassy Mints +PortionName = sprig of Sassy Mint +PortionNamePlural = sprigs of Sassy Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3514,6 +3670,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [TIMIDMINT] Name = Timid Mint NamePlural = Timid Mints +PortionName = sprig of Timid Mint +PortionNamePlural = sprigs of Timid Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3524,6 +3682,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [HASTYMINT] Name = Hasty Mint NamePlural = Hasty Mints +PortionName = sprig of Hasty Mint +PortionNamePlural = sprigs of Hasty Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3534,6 +3694,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [JOLLYMINT] Name = Jolly Mint NamePlural = Jolly Mints +PortionName = sprig of Jolly Mint +PortionNamePlural = sprigs of Jolly Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3544,6 +3706,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [NAIVEMINT] Name = Naive Mint NamePlural = Naive Mints +PortionName = sprig of Naive Mint +PortionNamePlural = sprigs of Naive Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3554,6 +3718,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [SERIOUSMINT] Name = Serious Mint NamePlural = Serious Mints +PortionName = sprig of Serious Mint +PortionNamePlural = sprigs of Serious Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -5587,6 +5753,8 @@ Description = If held by a Pokémon, this Berry will increase the holder's Sp. D [GRASSMAIL] Name = Grass Mail NamePlural = Grass Mail +PortionName = piece of Grass Mail +PortionNamePlural = pieces of Grass Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5595,6 +5763,8 @@ Description = Stationery featuring a print of a refreshingly green field. Let a [FLAMEMAIL] Name = Flame Mail NamePlural = Flame Mail +PortionName = piece of Flame Mail +PortionNamePlural = pieces of Flame Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5603,6 +5773,8 @@ Description = Stationery featuring a print of flames in blazing red. Let a Poké [BUBBLEMAIL] Name = Bubble Mail NamePlural = Bubble Mail +PortionName = piece of Bubble Mail +PortionNamePlural = pieces of Bubble Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5611,6 +5783,8 @@ Description = Stationery featuring a print of a blue world underwater. Let a Pok [BLOOMMAIL] Name = Bloom Mail NamePlural = Bloom Mail +PortionName = piece of Bloom Mail +PortionNamePlural = pieces of Bloom Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5619,6 +5793,8 @@ Description = Stationery featuring a print of pretty floral patterns. Let a Pok [TUNNELMAIL] Name = Tunnel Mail NamePlural = Tunnel Mail +PortionName = piece of Tunnel Mail +PortionNamePlural = pieces of Tunnel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5627,6 +5803,8 @@ Description = Stationery featuring a print of a dimly lit coal mine. Let a Poké [STEELMAIL] Name = Steel Mail NamePlural = Steel Mail +PortionName = piece of Steel Mail +PortionNamePlural = pieces of Steel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5635,6 +5813,8 @@ Description = Stationery featuring a print of cool mechanical designs. Let a Pok [HEARTMAIL] Name = Heart Mail NamePlural = Heart Mail +PortionName = piece of Heart Mail +PortionNamePlural = pieces of Heart Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5643,6 +5823,8 @@ Description = Stationery featuring a print of giant heart patterns. Let a Pokém [SNOWMAIL] Name = Snow Mail NamePlural = Snow Mail +PortionName = piece of Snow Mail +PortionNamePlural = pieces of Snow Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5651,6 +5833,8 @@ Description = Stationery featuring a print of a chilly, snow-covered world. Let [SPACEMAIL] Name = Space Mail NamePlural = Space Mail +PortionName = piece of Space Mail +PortionNamePlural = pieces of Space Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5659,6 +5843,8 @@ Description = Stationery featuring a print depicting the huge expanse of space. [AIRMAIL] Name = Air Mail NamePlural = Air Mail +PortionName = piece of Air Mail +PortionNamePlural = pieces of Air Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5667,6 +5853,8 @@ Description = Stationery featuring a print of colorful letter sets. Let a Pokém [MOSAICMAIL] Name = Mosaic Mail NamePlural = Mosaic Mail +PortionName = piece of Mosaic Mail +PortionNamePlural = pieces of Mosaic Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5675,6 +5863,8 @@ Description = Stationery featuring a print of a vivid rainbow pattern. Let a Pok [BRICKMAIL] Name = Brick Mail NamePlural = Brick Mail +PortionName = piece of Brick Mail +PortionNamePlural = pieces of Brick Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5898,7 +6088,9 @@ Description = It raises the accuracy of a Pokémon in battle immensely. It wears #------------------------------- [MAXMUSHROOMS] Name = Max Mushrooms -NamePlural = clusters of Max Mushrooms +NamePlural = Max Mushrooms +PortionName = cluster of Max Mushrooms +PortionNamePlural = clusters of Max Mushrooms Pocket = 7 Price = 8000 BattleUse = OnBattler @@ -6289,6 +6481,8 @@ Description = A machine to separate Necrozma, which needed light, from Lunala. [REINSOFUNITY] Name = Reins of Unity NamePlural = Reins of Unity +PortionName = set of Reins of Unity +PortionNamePlural = sets of Reins of Unity Pocket = 8 Price = 0 FieldUse = OnPokemon @@ -6298,6 +6492,8 @@ Description = Reins that people presented to the king. They unite Calyrex with i [REINSOFUNITYUSED] Name = Reins of Unity NamePlural = Reins of Unity +PortionName = set of Reins of Unity +PortionNamePlural = sets of Reins of Unity Pocket = 8 Price = 0 FieldUse = OnPokemon diff --git a/PBS/items.txt b/PBS/items.txt index 4642a646e..a2e945334 100644 --- a/PBS/items.txt +++ b/PBS/items.txt @@ -50,6 +50,8 @@ Description = A white flute made from blown glass. Its melody makes wild Pokémo [HONEY] Name = Honey NamePlural = Honey +PortionName = jar of Honey +PortionNamePlural = jars of Honey Pocket = 1 Price = 900 FieldUse = Direct @@ -404,7 +406,7 @@ Description = The fossil of an ancient Pokémon that once soared through the sky #------------------------------- [FOSSILIZEDFISH] Name = Fossilized Fish -NamePlural = Fossilized Fishes +NamePlural = Fossilized Fish Pocket = 1 Price = 5000 Flags = Fling_100 @@ -485,6 +487,8 @@ Description = Very large pearls that sparkle in a pretty silver color. A maniac [STARDUST] Name = Stardust NamePlural = Stardusts +PortionName = bag of Stardust +PortionNamePlural = bags of Stardust Pocket = 1 Price = 3000 Flags = Fling_30 @@ -548,6 +552,8 @@ Description = A bone that is extremely valuable for Pokémon archaeology. It can [RELICCOPPER] Name = Relic Copper NamePlural = Relic Coppers +PortionName = Relic Copper coin +PortionNamePlural = Relic Copper coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -556,6 +562,8 @@ Description = A copper coin used in a civilization about 3,000 years ago. A mani [RELICSILVER] Name = Relic Silver NamePlural = Relic Silvers +PortionName = Relic Silver coin +PortionNamePlural = Relic Silver coins Pocket = 1 Price = 0 Flags = Fling_30 @@ -564,6 +572,8 @@ Description = A silver coin used in a civilization about 3,000 years ago. A mani [RELICGOLD] Name = Relic Gold NamePlural = Relic Golds +PortionName = Relic Gold coin +PortionNamePlural = Relic Gold coins Pocket = 1 Price = 60000 Flags = Fling_30 @@ -604,6 +614,8 @@ Description = A crown made in a civilization about 3,000 years ago. A maniac wil [GROWTHMULCH] Name = Growth Mulch NamePlural = Growth Mulch +PortionName = bag of Growth Mulch +PortionNamePlural = bags of Growth Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -612,6 +624,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [DAMPMULCH] Name = Damp Mulch NamePlural = Damp Mulch +PortionName = bag of Damp Mulch +PortionNamePlural = bags of Damp Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -620,6 +634,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [STABLEMULCH] Name = Stable Mulch NamePlural = Stable Mulch +PortionName = bag of Stable Mulch +PortionNamePlural = bags of Stable Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -628,6 +644,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [GOOEYMULCH] Name = Gooey Mulch NamePlural = Gooey Mulch +PortionName = bag of Gooey Mulch +PortionNamePlural = bags of Gooey Mulch Pocket = 1 Price = 200 Flags = Mulch,Fling_30 @@ -636,6 +654,8 @@ Description = A fertilizer to be spread on soft soil in regions where Berries ar [SHOALSALT] Name = Shoal Salt NamePlural = Shoal Salts +PortionName = pile of Shoal Salt +PortionNamePlural = piles of Shoal Salt Pocket = 1 Price = 20 Flags = Fling_30 @@ -660,6 +680,8 @@ Description = A vital item that is needed to keep a stone tower from collapsing. [REDNECTAR] Name = Red Nectar NamePlural = Red Nectars +PortionName = jar of Red Nectar +PortionNamePlural = jars of Red Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -669,6 +691,8 @@ Description = A flower nectar obtained at Ula'ula Meadow. It changes the form of [YELLOWNECTAR] Name = Yellow Nectar NamePlural = Yellow Nectars +PortionName = jar of Yellow Nectar +PortionNamePlural = jars of Yellow Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -678,6 +702,8 @@ Description = A flower nectar obtained at Melemele Meadow. It changes the form o [PINKNECTAR] Name = Pink Nectar NamePlural = Pink Nectars +PortionName = jar of Pink Nectar +PortionNamePlural = jars of Pink Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -687,6 +713,8 @@ Description = A flower nectar obtained from shrubs on Royal Avenue. It changes t [PURPLENECTAR] Name = Purple Nectar NamePlural = Purple Nectars +PortionName = jar of Purple Nectar +PortionNamePlural = jars of Purple Nectar Pocket = 1 Price = 300 FieldUse = OnPokemon @@ -706,6 +734,8 @@ Description = An item to be held by a Pokémon. The holder will float in the air [BRIGHTPOWDER] Name = Bright Powder NamePlural = Bright Powders +PortionName = bag of Bright Powder +PortionNamePlural = bags of Bright Powder Pocket = 1 Price = 3000 SellPrice = 2000 @@ -765,6 +795,8 @@ Description = An item to be held by a Pokémon. This offensive vest raises Sp. D [SAFETYGOGGLES] Name = Safety Goggles NamePlural = Safety Goggles +PortionName = pair of Safety Goggles +PortionNamePlural = pairs of Safety Goggles Pocket = 1 Price = 3000 SellPrice = 2000 @@ -775,6 +807,8 @@ Description = An item to be held by a Pokémon. They protect the holder from wea [PROTECTIVEPADS] Name = Protective Pads NamePlural = Protective Pads +PortionName = set of Protective Pads +PortionNamePlural = sets of Protective Pads Pocket = 1 Price = 3000 SellPrice = 2000 @@ -784,7 +818,9 @@ Description = An item to be held by a Pokémon. They protect the holder from eff #------------------------------- [HEAVYDUTYBOOTS] Name = Heavy-Duty Boots -NamePlural = pairs of Heavy-Duty Boots +NamePlural = Heavy-Duty Boots +PortionName = pair of Heavy-Duty Boots +PortionNamePlural = pairs of Heavy-Duty Boots Pocket = 1 Price = 3000 SellPrice = 2000 @@ -904,6 +940,8 @@ Description = An item to be held by a Pokémon. This headband ups Attack, but al [CHOICESPECS] Name = Choice Specs NamePlural = Choice Specs +PortionName = pair of Choice Specs +PortionNamePlural = pairs of Choice Specs Pocket = 1 Price = 4000 BPPrice = 25 @@ -967,6 +1005,8 @@ Description = An item to be held by a Pokémon. It extends the duration of the t [LIGHTCLAY] Name = Light Clay NamePlural = Light Clays +PortionName = lump of Light Clay +PortionNamePlural = lumps of Light Clay Pocket = 1 Price = 4000 BPPrice = 15 @@ -1004,6 +1044,8 @@ Description = A Pokémon held item that boosts the power of HP-stealing moves to [BLACKSLUDGE] Name = Black Sludge NamePlural = Black Sludges +PortionName = blob of Black Sludge +PortionNamePlural = blobs of Black Sludge Pocket = 1 Price = 3000 SellPrice = 2000 @@ -1014,6 +1056,8 @@ Description = A held item that gradually restores the HP of Poison-type Pokémon [LEFTOVERS] Name = Leftovers NamePlural = Leftovers +PortionName = serving of Leftovers +PortionNamePlural = servings of Leftovers Pocket = 1 Price = 4000 BPPrice = 25 @@ -1076,7 +1120,9 @@ Description = A consumable battery. If the holder is hit by an Electric-type mov #------------------------------- [LUMINOUSMOSS] Name = Luminous Moss -NamePlural = Luminous Mosses +NamePlural = Luminous Moss +PortionName = clump of Luminous Moss +PortionNamePlural = clumps of Luminous Moss Pocket = 1 Price = 4000 BPPrice = 10 @@ -1113,6 +1159,8 @@ Description = Raises Speed sharply when a Pokémon misses with a move because of [THROATSPRAY] Name = Throat Spray NamePlural = Throat Sprays +PortionName = bottle of Throat Spray +PortionNamePlural = bottles of Throat Spray Pocket = 1 Price = 4000 BPPrice = 10 @@ -1131,6 +1179,8 @@ Description = An item to be held by a Pokémon. It boosts Speed when intimidated [ROOMSERVICE] Name = Room Service NamePlural = Room Services +PortionName = voucher for Room Service +PortionNamePlural = vouchers for Room Service Pocket = 1 Price = 4000 BPPrice = 15 @@ -1213,6 +1263,8 @@ Description = An item to be held by a Pokémon. It is a headband that slightly b [WISEGLASSES] Name = Wise Glasses NamePlural = Wise Glasses +PortionName = pair of Wise Glasses +PortionNamePlural = pairs of Wise Glasses Pocket = 1 Price = 4000 BPPrice = 48 @@ -1425,6 +1477,8 @@ Description = A Pokémon held item that promotes Speed gain on leveling, but red [LAXINCENSE] Name = Lax Incense NamePlural = Lax Incenses +PortionName = jar of Lax Incense +PortionNamePlural = jars of Lax Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1433,6 +1487,8 @@ Description = An item to be held by a Pokémon. The tricky aroma of this incense [FULLINCENSE] Name = Full Incense NamePlural = Full Incenses +PortionName = jar of Full Incense +PortionNamePlural = jars of Full Incense Pocket = 1 Price = 5000 Flags = Fling_10 @@ -1441,6 +1497,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense mak [LUCKINCENSE] Name = Luck Incense NamePlural = Luck Incenses +PortionName = jar of Luck Incense +PortionNamePlural = jars of Luck Incense Pocket = 1 Price = 11000 Flags = Fling_10 @@ -1449,6 +1507,8 @@ Description = An item to be held by a Pokémon. It doubles a battle's prize mone [PUREINCENSE] Name = Pure Incense NamePlural = Pure Incenses +PortionName = jar of Pure Incense +PortionNamePlural = jars of Pure Incense Pocket = 1 Price = 6000 Flags = Fling_10 @@ -1457,6 +1517,8 @@ Description = An item to be held by a Pokémon. It helps keep wild Pokémon away [SEAINCENSE] Name = Sea Incense NamePlural = Sea Incenses +PortionName = jar of Sea Incense +PortionNamePlural = jars of Sea Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1465,6 +1527,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [WAVEINCENSE] Name = Wave Incense NamePlural = Wave Incenses +PortionName = jar of Wave Incense +PortionNamePlural = jars of Wave Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1473,6 +1537,8 @@ Description = An item to be held by a Pokémon. It has a curious aroma that boos [ROSEINCENSE] Name = Rose Incense NamePlural = Rose Incenses +PortionName = jar of Rose Incense +PortionNamePlural = jars of Rose Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1481,6 +1547,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ODDINCENSE] Name = Odd Incense NamePlural = Odd Incenses +PortionName = jar of Odd Incense +PortionNamePlural = jars of Odd Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1489,6 +1557,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [ROCKINCENSE] Name = Rock Incense NamePlural = Rock Incenses +PortionName = jar of Rock Incense +PortionNamePlural = jars of Rock Incense Pocket = 1 Price = 2000 Flags = Fling_10 @@ -1497,6 +1567,8 @@ Description = An item to be held by a Pokémon. This exotic-smelling incense boo [CHARCOAL] Name = Charcoal NamePlural = Charcoals +PortionName = piece of Charcoal +PortionNamePlural = pieces of Charcoal Pocket = 1 Price = 3000 SellPrice = 500 @@ -1533,6 +1605,8 @@ Description = An item to be held by a Pokémon. It is a seed imbued with life th [NEVERMELTICE] Name = Never-Melt Ice NamePlural = Never-Melt Ices +PortionName = piece of Never-Melt Ice +PortionNamePlural = pieces of Never-Melt Ice Pocket = 1 Price = 3000 SellPrice = 500 @@ -1560,6 +1634,8 @@ Description = An item to be held by a Pokémon. It is a small, poisonous barb th [SOFTSAND] Name = Soft Sand NamePlural = Soft Sand +PortionName = bag of Soft Sand +PortionNamePlural = bags of Soft Sand Pocket = 1 Price = 3000 SellPrice = 500 @@ -1587,6 +1663,8 @@ Description = An item to be held by a Pokémon. It is a spoon imbued with teleki [SILVERPOWDER] Name = Silver Powder NamePlural = Silver Powders +PortionName = pile of Silver Powder +PortionNamePlural = piles of Silver Powder Pocket = 1 Price = 3000 SellPrice = 500 @@ -1623,6 +1701,8 @@ Description = An item to be held by a Pokémon. It is a hard and sharp fang that [BLACKGLASSES] Name = Black Glasses NamePlural = Black Glasses +PortionName = pair of Black Glasses +PortionNamePlural = pairs of Black Glasses Pocket = 1 Price = 3000 SellPrice = 500 @@ -1964,6 +2044,8 @@ Description = An item to be held by Chansey. It is a pair of gloves that boosts [METALPOWDER] Name = Metal Powder NamePlural = Metal Powders +PortionName = bag of Metal Powder +PortionNamePlural = bags of Metal Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -1972,6 +2054,8 @@ Description = An item to be held by Ditto. Extremely fine yet hard, this odd pow [QUICKPOWDER] Name = Quick Powder NamePlural = Quick Powders +PortionName = bag of Quick Powder +PortionNamePlural = bags of Quick Powder Pocket = 1 Price = 1000 Flags = Fling_10 @@ -2300,6 +2384,8 @@ Description = A box packed with a tremendous amount of magma energy. It is loved [REAPERCLOTH] Name = Reaper Cloth NamePlural = Reaper Cloths +PortionName = scrap of Reaper Cloth +PortionNamePlural = scraps of Reaper Cloth Pocket = 1 Price = 3000 SellPrice = 1000 @@ -2330,6 +2416,8 @@ Description = A peculiar stone that makes certain species of Pokémon evolve. It [WHIPPEDDREAM] Name = Whipped Dream NamePlural = Whipped Dreams +PortionName = dollop of Whipped Dream +PortionNamePlural = dollops of Whipped Dream Pocket = 1 Price = 3000 SellPrice = 1000 @@ -2905,6 +2993,8 @@ Description = A medicine that fully restores the HP and heals any status problem [SACREDASH] Name = Sacred Ash NamePlural = Sacred Ashes +PortionName = bag of Sacred Ash +PortionNamePlural = bags of Sacred Ash Pocket = 2 Price = 50000 FieldUse = Direct @@ -2974,6 +3064,8 @@ Description = A spray-type medicine. It heals all the status problems of a singl [PEWTERCRUNCHIES] Name = Pewter Crunchies NamePlural = Pewter Crunchies +PortionName = bag of Pewter Crunchies +PortionNamePlural = bags of Pewter Crunchies Pocket = 2 Price = 250 FieldUse = OnPokemon @@ -3075,6 +3167,8 @@ Description = A medicine that revives a fainted Pokémon. It fully restores the [BERRYJUICE] Name = Berry Juice NamePlural = Berry Juices +PortionName = cup of Berry Juice +PortionNamePlural = cups of Berry Juice Pocket = 2 Price = 100 FieldUse = OnPokemon @@ -3095,6 +3189,8 @@ Description = Very sweet chocolate. It restores the HP of one Pokémon by only 2 [FRESHWATER] Name = Fresh Water NamePlural = Fresh Waters +PortionName = bottle of Fresh Water +PortionNamePlural = bottles of Fresh Water Pocket = 2 Price = 200 FieldUse = OnPokemon @@ -3105,6 +3201,8 @@ Description = Water with high mineral content. It can be used to restore 30 HP t [SODAPOP] Name = Soda Pop NamePlural = Soda Pops +PortionName = bottle of Soda Pop +PortionNamePlural = bottles of Soda Pop Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -3115,6 +3213,8 @@ Description = A highly carbonated soda drink. It can be used to restore 50 HP to [LEMONADE] Name = Lemonade NamePlural = Lemonades +PortionName = can of Lemonade +PortionNamePlural = cans of Lemonade Pocket = 2 Price = 350 SellPrice = 200 @@ -3126,6 +3226,8 @@ Description = A very sweet and refreshing drink. It can be used to restore 70 HP [MOOMOOMILK] Name = Moomoo Milk NamePlural = Moomoo Milks +PortionName = bottle of Moomoo Milk +PortionNamePlural = bottles of Moomoo Milk Pocket = 2 Price = 600 FieldUse = OnPokemon @@ -3136,6 +3238,8 @@ Description = Milk with a very high nutrition content. It restores the HP of one [ENERGYPOWDER] Name = Energy Powder NamePlural = Energy Powders +PortionName = dose of Energy Powder +PortionNamePlural = doses of Energy Powder Pocket = 2 Price = 500 FieldUse = OnPokemon @@ -3156,6 +3260,8 @@ Description = An extremely bitter medicinal root. It can be used to restore 120 [HEALPOWDER] Name = Heal Powder NamePlural = Heal Powders +PortionName = dose of Heal Powder +PortionNamePlural = doses of Heal Powder Pocket = 2 Price = 300 FieldUse = OnPokemon @@ -3176,6 +3282,8 @@ Description = A very bitter medicinal herb. It revives a fainted Pokémon, fully [MAXHONEY] Name = Max Honey NamePlural = Max Honeys +PortionName = comb of Max Honey +PortionNamePlural = combs of Max Honey Pocket = 2 Price = 8000 FieldUse = OnPokemon @@ -3227,6 +3335,8 @@ Description = It fully restores the PP of all the moves learned by the targeted [PPUP] Name = PP Up NamePlural = PP Ups +PortionName = bottle of PP Up +PortionNamePlural = bottles of PP Up Pocket = 2 Price = 10000 BPPrice = 10 @@ -3237,6 +3347,8 @@ Description = It slightly raises the maximum PP of a selected move that has been [PPMAX] Name = PP Max NamePlural = PP Maxes +PortionName = bottle of PP Max +PortionNamePlural = bottles of PP Max Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3246,6 +3358,8 @@ Description = It maximally raises the top PP of a selected move that has been le [HPUP] Name = HP Up NamePlural = HP Ups +PortionName = bottle of HP Up +PortionNamePlural = bottles of HP Up Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3255,6 +3369,8 @@ Description = A nutritious drink for Pokémon. It raises the base HP of a single [PROTEIN] Name = Protein NamePlural = Proteins +PortionName = bottle of Protein +PortionNamePlural = bottles of Protein Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3264,6 +3380,8 @@ Description = A nutritious drink for Pokémon. It raises the base Attack stat of [IRON] Name = Iron NamePlural = Irons +PortionName = bottle of Iron +PortionNamePlural = bottles of Iron Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3273,6 +3391,8 @@ Description = A nutritious drink for Pokémon. It raises the base Defense stat o [CALCIUM] Name = Calcium NamePlural = Calciums +PortionName = bottle of Calcium +PortionNamePlural = bottles of Calcium Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3282,6 +3402,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Atk (Speci [ZINC] Name = Zinc NamePlural = Zincs +PortionName = bottle of Zinc +PortionNamePlural = bottles of Zinc Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3291,6 +3413,8 @@ Description = A nutritious drink for Pokémon. It raises the base Sp. Def (Speci [CARBOS] Name = Carbos NamePlural = Carbos +PortionName = bottle of Carbos +PortionNamePlural = bottles of Carbos Pocket = 2 Price = 10000 FieldUse = OnPokemon @@ -3354,6 +3478,8 @@ Description = An item for use on a Pokémon. It slightly increases the base Spee [LONELYMINT] Name = Lonely Mint NamePlural = Lonely Mints +PortionName = sprig of Lonely Mint +PortionNamePlural = sprigs of Lonely Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3364,6 +3490,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [ADAMANTMINT] Name = Adamant Mint NamePlural = Adamant Mints +PortionName = sprig of Adamant Mint +PortionNamePlural = sprigs of Adamant Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3374,6 +3502,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [NAUGHTYMINT] Name = Naughty Mint NamePlural = Naughty Mints +PortionName = sprig of Naughty Mint +PortionNamePlural = sprigs of Naughty Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3384,6 +3514,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [BRAVEMINT] Name = Brave Mint NamePlural = Brave Mints +PortionName = sprig of Brave Mint +PortionNamePlural = sprigs of Brave Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3394,6 +3526,8 @@ Description = When a Pokémon smells this mint, its Attack will grow more easily [BOLDMINT] Name = Bold Mint NamePlural = Bold Mints +PortionName = sprig of Bold Mint +PortionNamePlural = sprigs of Bold Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3404,6 +3538,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [IMPISHMINT] Name = Impish Mint NamePlural = Impish Mints +PortionName = sprig of Impish Mint +PortionNamePlural = sprigs of Impish Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3414,6 +3550,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [LAXMINT] Name = Lax Mint NamePlural = Lax Mints +PortionName = sprig of Lax Mint +PortionNamePlural = sprigs of Lax Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3424,6 +3562,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [RELAXEDMINT] Name = Relaxed Mint NamePlural = Relaxed Mints +PortionName = sprig of Relaxed Mint +PortionNamePlural = sprigs of Relaxed Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3434,6 +3574,8 @@ Description = When a Pokémon smells this mint, its Defense will grow more easil [MODESTMINT] Name = Modest Mint NamePlural = Modest Mints +PortionName = sprig of Modest Mint +PortionNamePlural = sprigs of Modest Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3444,6 +3586,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [MILDMINT] Name = Mild Mint NamePlural = Mild Mints +PortionName = sprig of Mild Mint +PortionNamePlural = sprigs of Mild Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3454,6 +3598,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [RASHMINT] Name = Rash Mint NamePlural = Rash Mints +PortionName = sprig of Rash Mint +PortionNamePlural = sprigs of Rash Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3464,6 +3610,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [QUIETMINT] Name = Quiet Mint NamePlural = Quiet Mints +PortionName = sprig of Quiet Mint +PortionNamePlural = sprigs of Quiet Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3474,6 +3622,8 @@ Description = When a Pokémon smells this mint, its Sp. Atk will grow more easil [CALMMINT] Name = Calm Mint NamePlural = Calm Mints +PortionName = sprig of Calm Mint +PortionNamePlural = sprigs of Calm Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3484,6 +3634,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [GENTLEMINT] Name = Gentle Mint NamePlural = Gentle Mints +PortionName = sprig of Gentle Mint +PortionNamePlural = sprigs of Gentle Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3494,6 +3646,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [CAREFULMINT] Name = Careful Mint NamePlural = Careful Mints +PortionName = sprig of Careful Mint +PortionNamePlural = sprigs of Careful Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3504,6 +3658,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [SASSYMINT] Name = Sassy Mint NamePlural = Sassy Mints +PortionName = sprig of Sassy Mint +PortionNamePlural = sprigs of Sassy Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3514,6 +3670,8 @@ Description = When a Pokémon smells this mint, its Sp. Def will grow more easil [TIMIDMINT] Name = Timid Mint NamePlural = Timid Mints +PortionName = sprig of Timid Mint +PortionNamePlural = sprigs of Timid Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3524,6 +3682,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [HASTYMINT] Name = Hasty Mint NamePlural = Hasty Mints +PortionName = sprig of Hasty Mint +PortionNamePlural = sprigs of Hasty Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3534,6 +3694,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [JOLLYMINT] Name = Jolly Mint NamePlural = Jolly Mints +PortionName = sprig of Jolly Mint +PortionNamePlural = sprigs of Jolly Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3544,6 +3706,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [NAIVEMINT] Name = Naive Mint NamePlural = Naive Mints +PortionName = sprig of Naive Mint +PortionNamePlural = sprigs of Naive Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -3554,6 +3718,8 @@ Description = When a Pokémon smells this mint, its Speed will grow more easily, [SERIOUSMINT] Name = Serious Mint NamePlural = Serious Mints +PortionName = sprig of Serious Mint +PortionNamePlural = sprigs of Serious Mint Pocket = 2 Price = 20 BPPrice = 50 @@ -5587,6 +5753,8 @@ Description = If held by a Pokémon, this Berry will increase the holder's Sp. D [GRASSMAIL] Name = Grass Mail NamePlural = Grass Mail +PortionName = piece of Grass Mail +PortionNamePlural = pieces of Grass Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5595,6 +5763,8 @@ Description = Stationery featuring a print of a refreshingly green field. Let a [FLAMEMAIL] Name = Flame Mail NamePlural = Flame Mail +PortionName = piece of Flame Mail +PortionNamePlural = pieces of Flame Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5603,6 +5773,8 @@ Description = Stationery featuring a print of flames in blazing red. Let a Poké [BUBBLEMAIL] Name = Bubble Mail NamePlural = Bubble Mail +PortionName = piece of Bubble Mail +PortionNamePlural = pieces of Bubble Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5611,6 +5783,8 @@ Description = Stationery featuring a print of a blue world underwater. Let a Pok [BLOOMMAIL] Name = Bloom Mail NamePlural = Bloom Mail +PortionName = piece of Bloom Mail +PortionNamePlural = pieces of Bloom Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5619,6 +5793,8 @@ Description = Stationery featuring a print of pretty floral patterns. Let a Pok [TUNNELMAIL] Name = Tunnel Mail NamePlural = Tunnel Mail +PortionName = piece of Tunnel Mail +PortionNamePlural = pieces of Tunnel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5627,6 +5803,8 @@ Description = Stationery featuring a print of a dimly lit coal mine. Let a Poké [STEELMAIL] Name = Steel Mail NamePlural = Steel Mail +PortionName = piece of Steel Mail +PortionNamePlural = pieces of Steel Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5635,6 +5813,8 @@ Description = Stationery featuring a print of cool mechanical designs. Let a Pok [HEARTMAIL] Name = Heart Mail NamePlural = Heart Mail +PortionName = piece of Heart Mail +PortionNamePlural = pieces of Heart Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5643,6 +5823,8 @@ Description = Stationery featuring a print of giant heart patterns. Let a Pokém [SNOWMAIL] Name = Snow Mail NamePlural = Snow Mail +PortionName = piece of Snow Mail +PortionNamePlural = pieces of Snow Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5651,6 +5833,8 @@ Description = Stationery featuring a print of a chilly, snow-covered world. Let [SPACEMAIL] Name = Space Mail NamePlural = Space Mail +PortionName = piece of Space Mail +PortionNamePlural = pieces of Space Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5659,6 +5843,8 @@ Description = Stationery featuring a print depicting the huge expanse of space. [AIRMAIL] Name = Air Mail NamePlural = Air Mail +PortionName = piece of Air Mail +PortionNamePlural = pieces of Air Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5667,6 +5853,8 @@ Description = Stationery featuring a print of colorful letter sets. Let a Pokém [MOSAICMAIL] Name = Mosaic Mail NamePlural = Mosaic Mail +PortionName = piece of Mosaic Mail +PortionNamePlural = pieces of Mosaic Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5675,6 +5863,8 @@ Description = Stationery featuring a print of a vivid rainbow pattern. Let a Pok [BRICKMAIL] Name = Brick Mail NamePlural = Brick Mail +PortionName = piece of Brick Mail +PortionNamePlural = pieces of Brick Mail Pocket = 6 Price = 50 Flags = IconMail @@ -5898,7 +6088,9 @@ Description = It raises the accuracy of a Pokémon in battle immensely. It wears #------------------------------- [MAXMUSHROOMS] Name = Max Mushrooms -NamePlural = clusters of Max Mushrooms +NamePlural = Max Mushrooms +PortionName = cluster of Max Mushrooms +PortionNamePlural = clusters of Max Mushrooms Pocket = 7 Price = 8000 BattleUse = OnBattler @@ -6289,6 +6481,8 @@ Description = A machine to separate Necrozma, which needed light, from Lunala. [REINSOFUNITY] Name = Reins of Unity NamePlural = Reins of Unity +PortionName = set of Reins of Unity +PortionNamePlural = sets of Reins of Unity Pocket = 8 Price = 0 FieldUse = OnPokemon @@ -6298,6 +6492,8 @@ Description = Reins that people presented to the king. They unite Calyrex with i [REINSOFUNITYUSED] Name = Reins of Unity NamePlural = Reins of Unity +PortionName = set of Reins of Unity +PortionNamePlural = sets of Reins of Unity Pocket = 8 Price = 0 FieldUse = OnPokemon