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 6197614b2..df53fc584 100644 --- a/Data/Scripts/010_Data/002_PBS data/008_Species.rb +++ b/Data/Scripts/010_Data/002_PBS data/008_Species.rb @@ -244,7 +244,7 @@ module GameData end def get_family_evolutions(exclude_invalid = true) - evos = self.get_evolutions(exclude_invalid) + evos = get_evolutions(exclude_invalid) evos = evos.sort { |a, b| GameData::Species.keys.index(a[0]) <=> GameData::Species.keys.index(b[0]) } ret = [] evos.each do |evo| @@ -280,7 +280,7 @@ module GameData # Returns an array of all the species in this species' evolution family. def get_family_species - sp = self.get_baby_species + sp = get_baby_species evos = GameData::Species.get(sp).get_family_evolutions(false) return [sp] if evos.length == 0 return [sp].concat(evos.map { |e| e[1] }).uniq @@ -292,7 +292,7 @@ module GameData if @offspring.length > 0 return (other_family & @offspring).length > 0 end - return other_family.include?(@id) + return other_family.include?(@species) end # If this species doesn't have egg moves, looks at prevolutions one at a @@ -305,7 +305,7 @@ module GameData end def family_evolutions_have_method?(check_method, check_param = nil) - sp = self.get_baby_species + sp = get_baby_species evos = GameData::Species.get(sp).get_family_evolutions return false if evos.length == 0 evos.each do |evo| @@ -322,7 +322,7 @@ module GameData # Used by the Moon Ball when checking if a Pokémon's evolution family # includes an evolution that uses the Moon Stone. def family_item_evolutions_use_item?(check_item = nil) - sp = self.get_baby_species + sp = get_baby_species evos = GameData::Species.get(sp).get_family_evolutions return false if !evos || evos.length == 0 evos.each do |evo| diff --git a/Data/Scripts/012_Overworld/007_Overworld_DayCare.rb b/Data/Scripts/012_Overworld/007_Overworld_DayCare.rb index 5588918a3..44f9c5f99 100644 --- a/Data/Scripts/012_Overworld/007_Overworld_DayCare.rb +++ b/Data/Scripts/012_Overworld/007_Overworld_DayCare.rb @@ -66,6 +66,9 @@ class DayCare egg.obtain_text = _INTL("Day-Care Couple") egg.happiness = 120 egg.form = 0 if species == :SINISTEA + # Set regional form + new_form = MultipleForms.call("getFormOnEggCreation", egg) + egg.form = new_form if new_form return egg end diff --git a/Data/Scripts/014_Pokemon/001_Pokemon-related/001_FormHandlers.rb b/Data/Scripts/014_Pokemon/001_Pokemon-related/001_FormHandlers.rb index 936b7c5d4..8495919b8 100644 --- a/Data/Scripts/014_Pokemon/001_Pokemon-related/001_FormHandlers.rb +++ b/Data/Scripts/014_Pokemon/001_Pokemon-related/001_FormHandlers.rb @@ -707,10 +707,39 @@ MultipleForms.register(:CALYREX, { }) +#=============================================================================== +# Regional forms +# This code is for determining the form of a Pokémon in an egg created at the +# Day Care, where that Pokémon's species has regional forms. The regional form +# chosen depends on the region in which the egg was produced (not where it +# hatches). +#=============================================================================== + +# The code in this proc assumes that the appropriate regional form for a Pokémon +# is equal to the region's number. This may not be true in your game. +# Note that this proc only produces a non-zero form number if the species has a +# defined form with that number, which means it can be used for both Alolan and +# Galarian forms separately (and for Meowth which has both). +MultipleForms.register(:RATTATA, { + "getFormOnEggCreation" => proc { |pkmn| + if $game_map + map_pos = $game_map.metadata&.town_map_position + next map_pos[0] if map_pos && + GameData::Species.get_species_form(pkmn.species, map_pos[0]).form == map_pos[0] + end + next 0 + } +}) + +MultipleForms.copy(:RATTATA, :SANDSHREW, :VULPIX, :DIGLETT, :MEOWTH, :GEODUDE, + :GRIMER, :PONYTA, :FARFETCHD, :CORSOLA, :ZIGZAGOON, + :DARUMAKA, :YAMASK, :STUNFISK, :SLOWPOKE, :ARTICUNO, :ZAPDOS, + :MOLTRES) + #=============================================================================== # Regional forms # These species don't have visually different regional forms, but they need to -# evolve into different forms depending on the location where they evolved. +# evolve into different forms depending on the location where they evolve. #=============================================================================== # Alolan forms diff --git a/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb b/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb index 72224f060..fef69e5c1 100644 --- a/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb +++ b/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb @@ -649,39 +649,39 @@ module Compiler types = [types] if !types.is_a?(Array) types = types.uniq.compact species_hash = { - :id => contents["InternalName"].to_sym, - :name => contents["Name"], - :form_name => contents["FormName"], - :category => contents["Category"] || contents["Kind"], - :pokedex_entry => contents["Pokedex"], - :types => types, - :base_stats => contents["BaseStats"], - :evs => contents["EVs"] || contents["EffortPoints"], - :base_exp => contents["BaseExp"] || contents["BaseEXP"], - :growth_rate => contents["GrowthRate"], - :gender_ratio => contents["GenderRatio"] || contents["GenderRate"], - :catch_rate => contents["CatchRate"] || contents["Rareness"], - :happiness => contents["Happiness"], - :moves => contents["Moves"], - :tutor_moves => contents["TutorMoves"], - :egg_moves => contents["EggMoves"], - :abilities => contents["Abilities"], - :hidden_abilities => contents["HiddenAbilities"] || contents["HiddenAbility"], - :wild_item_common => contents["WildItemCommon"], - :wild_item_uncommon => contents["WildItemUncommon"], - :wild_item_rare => contents["WildItemRare"], - :egg_groups => contents["EggGroups"] || contents["Compatibility"], - :hatch_steps => contents["HatchSteps"] || contents["StepsToHatch"], - :incense => contents["Incense"], - :offspring => contents["Offspring"], - :evolutions => contents["Evolutions"], - :height => contents["Height"], - :weight => contents["Weight"], - :color => contents["Color"], - :shape => contents["Shape"], - :habitat => contents["Habitat"], - :generation => contents["Generation"], - :flags => contents["Flags"] + :id => contents["InternalName"].to_sym, + :name => contents["Name"], + :form_name => contents["FormName"], + :category => contents["Category"] || contents["Kind"], + :pokedex_entry => contents["Pokedex"], + :types => types, + :base_stats => contents["BaseStats"], + :evs => contents["EVs"] || contents["EffortPoints"], + :base_exp => contents["BaseExp"] || contents["BaseEXP"], + :growth_rate => contents["GrowthRate"], + :gender_ratio => contents["GenderRatio"] || contents["GenderRate"], + :catch_rate => contents["CatchRate"] || contents["Rareness"], + :happiness => contents["Happiness"], + :moves => contents["Moves"], + :tutor_moves => contents["TutorMoves"], + :egg_moves => contents["EggMoves"], + :abilities => contents["Abilities"], + :hidden_abilities => contents["HiddenAbilities"] || contents["HiddenAbility"], + :wild_item_common => contents["WildItemCommon"], + :wild_item_uncommon => contents["WildItemUncommon"], + :wild_item_rare => contents["WildItemRare"], + :egg_groups => contents["EggGroups"] || contents["Compatibility"], + :hatch_steps => contents["HatchSteps"] || contents["StepsToHatch"], + :incense => contents["Incense"], + :offspring => contents["Offspring"], + :evolutions => contents["Evolutions"], + :height => contents["Height"], + :weight => contents["Weight"], + :color => contents["Color"], + :shape => contents["Shape"], + :habitat => contents["Habitat"], + :generation => contents["Generation"], + :flags => contents["Flags"] } # Add species' data to records GameData::Species.register(species_hash) @@ -850,46 +850,46 @@ module Compiler base_data.evolutions.each { |e| evolutions.push(e.clone) } end species_hash = { - :id => form_symbol, - :species => species_symbol, - :form => form, - :name => base_data.real_name, - :form_name => contents["FormName"], - :category => contents["Category"] || contents["Kind"] || base_data.real_category, - :pokedex_entry => contents["Pokedex"] || base_data.real_pokedex_entry, - :pokedex_form => contents["PokedexForm"], - :types => types, - :base_stats => contents["BaseStats"] || base_data.base_stats, - :evs => contents["EVs"] || contents["EffortPoints"] || base_data.evs, - :base_exp => contents["BaseExp"] || contents["BaseEXP"] || base_data.base_exp, - :growth_rate => base_data.growth_rate, - :gender_ratio => base_data.gender_ratio, - :catch_rate => contents["CatchRate"] || contents["Rareness"] || base_data.catch_rate, - :happiness => contents["Happiness"] || base_data.happiness, - :moves => moves, - :tutor_moves => contents["TutorMoves"] || base_data.tutor_moves.clone, - :egg_moves => contents["EggMoves"] || base_data.egg_moves.clone, - :abilities => contents["Abilities"] || base_data.abilities.clone, - :hidden_abilities => contents["HiddenAbilities"] || contents["HiddenAbility"] || base_data.hidden_abilities.clone, - :wild_item_common => contents["WildItemCommon"] || base_data.wild_item_common.clone, - :wild_item_uncommon => contents["WildItemUncommon"] || base_data.wild_item_uncommon.clone, - :wild_item_rare => contents["WildItemRare"] || base_data.wild_item_rare.clone, - :egg_groups => contents["EggGroups"] || contents["Compatibility"] || base_data.egg_groups.clone, - :hatch_steps => contents["HatchSteps"] || contents["StepsToHatch"] || base_data.hatch_steps, - :incense => base_data.incense, - :offspring => contents["Offspring"] || base_data.offspring.clone, - :evolutions => evolutions, - :height => contents["Height"] || base_data.height, - :weight => contents["Weight"] || base_data.weight, - :color => contents["Color"] || base_data.color, - :shape => contents["Shape"] || base_data.shape, - :habitat => contents["Habitat"] || base_data.habitat, - :generation => contents["Generation"] || base_data.generation, - :flags => contents["Flags"] || base_data.flags.clone, - :mega_stone => contents["MegaStone"], - :mega_move => contents["MegaMove"], - :unmega_form => contents["UnmegaForm"], - :mega_message => contents["MegaMessage"] + :id => form_symbol, + :species => species_symbol, + :form => form, + :name => base_data.real_name, + :form_name => contents["FormName"], + :category => contents["Category"] || contents["Kind"] || base_data.real_category, + :pokedex_entry => contents["Pokedex"] || base_data.real_pokedex_entry, + :pokedex_form => contents["PokedexForm"], + :types => types, + :base_stats => contents["BaseStats"] || base_data.base_stats, + :evs => contents["EVs"] || contents["EffortPoints"] || base_data.evs, + :base_exp => contents["BaseExp"] || contents["BaseEXP"] || base_data.base_exp, + :growth_rate => base_data.growth_rate, + :gender_ratio => base_data.gender_ratio, + :catch_rate => contents["CatchRate"] || contents["Rareness"] || base_data.catch_rate, + :happiness => contents["Happiness"] || base_data.happiness, + :moves => moves, + :tutor_moves => contents["TutorMoves"] || base_data.tutor_moves.clone, + :egg_moves => contents["EggMoves"] || base_data.egg_moves.clone, + :abilities => contents["Abilities"] || base_data.abilities.clone, + :hidden_abilities => contents["HiddenAbilities"] || contents["HiddenAbility"] || base_data.hidden_abilities.clone, + :wild_item_common => contents["WildItemCommon"] || base_data.wild_item_common.clone, + :wild_item_uncommon => contents["WildItemUncommon"] || base_data.wild_item_uncommon.clone, + :wild_item_rare => contents["WildItemRare"] || base_data.wild_item_rare.clone, + :egg_groups => contents["EggGroups"] || contents["Compatibility"] || base_data.egg_groups.clone, + :hatch_steps => contents["HatchSteps"] || contents["StepsToHatch"] || base_data.hatch_steps, + :incense => base_data.incense, + :offspring => contents["Offspring"] || base_data.offspring.clone, + :evolutions => evolutions, + :height => contents["Height"] || base_data.height, + :weight => contents["Weight"] || base_data.weight, + :color => contents["Color"] || base_data.color, + :shape => contents["Shape"] || base_data.shape, + :habitat => contents["Habitat"] || base_data.habitat, + :generation => contents["Generation"] || base_data.generation, + :flags => contents["Flags"] || base_data.flags.clone, + :mega_stone => contents["MegaStone"], + :mega_move => contents["MegaMove"], + :unmega_form => contents["UnmegaForm"], + :mega_message => contents["MegaMessage"] } # If form has any wild items, ensure none are inherited from base species if (contents["WildItemCommon"] && !contents["WildItemCommon"].empty?) || @@ -941,9 +941,15 @@ module Compiler end end GameData::Species.each do |species| # Distribute prevolutions - next if species.form == 0 # Looking at alternate forms only next if species.evolutions.any? { |evo| evo[3] } # Already has prevo listed - species.evolutions.push(all_evos[species.species].clone) if all_evos[species.species] + next if !all_evos[species.species] + # Record what species evolves from + species.evolutions.push(all_evos[species.species].clone) + # Record that the prevolution can evolve into species + prevo = GameData::Species.get(all_evos[species.species][0]) + if prevo.evolutions.none? { |evo| !evo[3] && evo[0] == species.species } + prevo.evolutions.push([species.species, :None, nil]) + end end # Save all data GameData::Species.save