diff --git a/Data/Scripts/002_Save data/005_Game_SaveConversions.rb b/Data/Scripts/002_Save data/005_Game_SaveConversions.rb index d1bd520d2..d9e088d83 100644 --- a/Data/Scripts/002_Save data/005_Game_SaveConversions.rb +++ b/Data/Scripts/002_Save data/005_Game_SaveConversions.rb @@ -213,6 +213,11 @@ SaveData.register_conversion(:v20_refactor_day_care_variables) do slot.instance_eval do @pokemon = old_slot[0] @initial_level = old_slot[1] + if @pokemon && @pokemon.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((@pokemon.markings & (1 << i)) == 0) ? 0 : 1 } + @pokemon.markings = markings + end end end end @@ -253,3 +258,103 @@ SaveData.register_conversion(:v20_adding_pokedex_records) do end end end + +SaveData.register_conversion(:v20_convert_pokemon_markings_party) do + essentials_version 20 + display_title 'Updating format of Pokémon markings (1/4)' + to_value :player do |player| + player.party.each do |pkmn| + next if !pkmn.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((pkmn.markings & (1 << i)) == 0) ? 0 : 1 } + pkmn.markings = markings + end + end +end + +SaveData.register_conversion(:v20_convert_pokemon_markings_global) do + essentials_version 20 + display_title 'Updating format of Pokémon markings (2/4)' + to_value :global_metadata do |global| + if global.partner + global.partner[3].each do |pkmn| + next if !pkmn.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((pkmn.markings & (1 << i)) == 0) ? 0 : 1 } + pkmn.markings = markings + end + end + # Pokémon in the Day Care have their markings converted above + if global.roamPokemon + global.roamPokemon.each do |pkmn| + next if !pkmn.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((pkmn.markings & (1 << i)) == 0) ? 0 : 1 } + pkmn.markings = markings + end + end + global.purifyChamber.sets.each do |set| + set.shadow = PokeBattle_Pokemon.convert(set.shadow) if set.shadow + set.list.each do |pkmn| + next if !pkmn.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((pkmn.markings & (1 << i)) == 0) ? 0 : 1 } + pkmn.markings = markings + end + end + if global.hallOfFame + global.hallOfFame.each do |team| + next if !team + team.each do |pkmn| + next if !pkmn.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((pkmn.markings & (1 << i)) == 0) ? 0 : 1 } + pkmn.markings = markings + end + end + end + end +end + +SaveData.register_conversion(:v20_convert_pokemon_markings_variables) do + essentials_version 20 + display_title 'Updating format of Pokémon markings (3/4)' + to_all do |save_data| + variables = save_data[:variables] + for i in 0..5000 + value = variables[i] + next if value.nil? + if value.is_a?(Array) + value.each do |value2| + if value2.is_a?(Pokemon) && value2.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((value2.markings & (1 << i)) == 0) ? 0 : 1 } + value2.markings = markings + end + end + elsif value.is_a?(Pokemon) && value.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((value.markings & (1 << i)) == 0) ? 0 : 1 } + value.markings = markings + end + end + end +end + +SaveData.register_conversion(:v20_convert_pokemon_markings_storage) do + essentials_version 20 + display_title 'Updating format of Pokémon markings (4/4)' + to_value :storage_system do |storage| + storage.instance_eval do + for box in 0...self.maxBoxes + for i in 0...self.maxPokemon(box) + pkmn = self[box, i] + next if !pkmn || !pkmn.markings.is_a?(Integer) + markings = [] + 6.times { |i| markings[i] = ((pkmn.markings & (1 << i)) == 0) ? 0 : 1 } + pkmn.markings = markings + end + end + end # storage.instance_eval + end # to_value +end diff --git a/Data/Scripts/014_Pokemon/001_Pokemon.rb b/Data/Scripts/014_Pokemon/001_Pokemon.rb index 25352229d..6cdc789b4 100644 --- a/Data/Scripts/014_Pokemon/001_Pokemon.rb +++ b/Data/Scripts/014_Pokemon/001_Pokemon.rb @@ -40,7 +40,7 @@ class Pokemon attr_accessor :happiness # @return [Symbol] the item ID of the Poké Ball this Pokémon is in attr_accessor :poke_ball - # @return [Integer] this Pokémon's markings, one bit per marking + # @return [Array] this Pokémon's markings, one value per mark attr_accessor :markings # @return [Hash] a hash of IV values for HP, Atk, Def, Speed, Sp. Atk and Sp. Def attr_accessor :iv @@ -1171,7 +1171,7 @@ class Pokemon @name = nil @happiness = species_data.happiness @poke_ball = :POKEBALL - @markings = 0 + @markings = [] @iv = {} @ivMaxed = {} @ev = {} diff --git a/Data/Scripts/016_UI/001_Non-interactive UI/004_UI_Evolution.rb b/Data/Scripts/016_UI/001_Non-interactive UI/004_UI_Evolution.rb index a62265f59..4373f860a 100644 --- a/Data/Scripts/016_UI/001_Non-interactive UI/004_UI_Evolution.rb +++ b/Data/Scripts/016_UI/001_Non-interactive UI/004_UI_Evolution.rb @@ -609,7 +609,7 @@ class PokemonEvolutionScene new_pkmn = pkmn.clone new_pkmn.species = new_species new_pkmn.name = nil - new_pkmn.markings = 0 + new_pkmn.markings = [] new_pkmn.poke_ball = :POKEBALL new_pkmn.item = nil new_pkmn.clearAllRibbons diff --git a/Data/Scripts/016_UI/006_UI_Summary.rb b/Data/Scripts/016_UI/006_UI_Summary.rb index 6ec2a0bdc..058ae6a33 100644 --- a/Data/Scripts/016_UI/006_UI_Summary.rb +++ b/Data/Scripts/016_UI/006_UI_Summary.rb @@ -102,6 +102,9 @@ end # #=============================================================================== class PokemonSummary_Scene + MARK_WIDTH = 16 + MARK_HEIGHT = 16 + def pbUpdate pbUpdateSpriteHash(@sprites) end @@ -282,12 +285,13 @@ class PokemonSummary_Scene end def drawMarkings(bitmap,x,y) + mark_variants = @markingbitmap.bitmap.height / MARK_HEIGHT markings = @pokemon.markings - markrect = Rect.new(0,0,16,16) - for i in 0...6 - markrect.x = i*16 - markrect.y = (markings&(1< 0 + pbPlayDecisionSE + markings[index] = 0 redraw = true end elsif Input.trigger?(Input::UP) diff --git a/Data/Scripts/016_UI/017_UI_PokemonStorage.rb b/Data/Scripts/016_UI/017_UI_PokemonStorage.rb index 357771834..50bdc49af 100644 --- a/Data/Scripts/016_UI/017_UI_PokemonStorage.rb +++ b/Data/Scripts/016_UI/017_UI_PokemonStorage.rb @@ -564,6 +564,8 @@ end #=============================================================================== class PokemonStorageScene attr_reader :quickswap + MARK_WIDTH = 16 + MARK_HEIGHT = 16 def initialize @command = 1 @@ -1307,18 +1309,20 @@ class PokemonStorageScene else pokemon = @storage.boxes[selected[0]][selected[1]] end - markings = pokemon.markings + markings = pokemon.markings.clone + mark_variants = @markingbitmap.bitmap.height / MARK_HEIGHT index = 0 redraw = true - markrect = Rect.new(0,0,16,16) + markrect = Rect.new(0, 0, MARK_WIDTH, MARK_HEIGHT) loop do # Redraw the markings and text if redraw @sprites["markingoverlay"].bitmap.clear - for i in 0...6 - markrect.x = i*16 - markrect.y = (markings&(1<