From 6f353ba813292ae67dccf8eba5adb8db19012bca Mon Sep 17 00:00:00 2001 From: Maruno17 Date: Thu, 10 Sep 2020 22:22:06 +0100 Subject: [PATCH] Rewrote evolution methods to make them modular --- .../012_Battle/009_PokeBall_CatchEffects.rb | 4 +- .../016_Pokemon/005_Pokemon_Evolution.rb | 446 ++++++++++++------ Data/Scripts/017_UI/021_PScreen_Evolution.rb | 54 +-- Data/Scripts/017_UI/022_PScreen_Trading.rb | 20 +- Data/Scripts/021_Debug/004_Editor_Screens.rb | 2 +- Data/Scripts/021_Debug/005_Editor_SaveData.rb | 112 ++--- .../Scripts/021_Debug/006_Editor_DataTypes.rb | 132 +++--- .../Scripts/021_Debug/008_Editor_Utilities.rb | 41 +- Data/Scripts/022_Compiler/002_Compiler_PBS.rb | 26 +- 9 files changed, 474 insertions(+), 363 deletions(-) diff --git a/Data/Scripts/012_Battle/009_PokeBall_CatchEffects.rb b/Data/Scripts/012_Battle/009_PokeBall_CatchEffects.rb index c0c27bf86..4c805b321 100644 --- a/Data/Scripts/012_Battle/009_PokeBall_CatchEffects.rb +++ b/Data/Scripts/012_Battle/009_PokeBall_CatchEffects.rb @@ -207,9 +207,7 @@ BallHandlers::ModifyCatchRate.add(:MOONBALL,proc { |ball,catchRate,battle,battle # family can evolve with the Moon Stone, not whether the target itself # can immediately evolve with the Moon Stone. if hasConst?(PBItems,:MOONSTONE) && - pbCheckEvolutionFamilyForMethod(battler.species, - [PBEvolution::Item,PBEvolution::ItemMale,PBEvolution::ItemFemale], - getConst(PBItems,:MOONSTONE)) + pbCheckEvolutionFamilyForItemMethodItem(battler.species,getConst(PBItems,:MOONSTONE)) catchRate *= 4 end next [catchRate,255].min diff --git a/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb b/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb index 52f4ba4e5..4da708894 100644 --- a/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb +++ b/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb @@ -1,5 +1,5 @@ module PBEvolution - None = 0 # Do not use + None = 0 Happiness = 1 HappinessDay = 2 HappinessNight = 3 @@ -31,10 +31,6 @@ module PBEvolution LevelRain = 29 HappinessMoveType = 30 LevelEvening = 31 - Custom1 = 32 - Custom2 = 33 - Custom3 = 34 - Custom4 = 35 EVONAMES = ["None", "Happiness", "HappinessDay", "HappinessNight", "Level", "Trade", @@ -43,29 +39,43 @@ module PBEvolution "ItemMale", "ItemFemale", "DayHoldItem", "NightHoldItem", "HasMove", "HasInParty", "LevelMale", "LevelFemale", "Location", "TradeSpecies", "LevelDay", "LevelNight", "LevelDarkInParty", "LevelRain", "HappinessMoveType", - "LevelEvening", "Custom1", "Custom2", "Custom3", "Custom4", + "LevelEvening" ] - # 0 = no parameter - # 1 = Positive integer - # 2 = Item internal name - # 3 = Move internal name - # 4 = Species internal name - # 5 = Type internal name - # 6 = Ability internal name - EVOPARAM = [0, # None (do not use) - 0,0,0,1,0, # Happiness, HappinessDay, HappinessNight, Level, Trade - 2,2,1,1,1, # TradeItem, Item, AttackGreater, AtkDefEqual, DefenseGreater - 1,1,1,1,1, # Silcoon, Cascoon, Ninjask, Shedinja, Beauty - 2,2,2,2,3, # ItemMale, ItemFemale, DayHoldItem, NightHoldItem, HasMove - 4,1,1,1,4, # HasInParty, LevelMale, LevelFemale, Location, TradeSpecies - 1,1,1,1,5, # LevelDay, LevelNight, LevelDarkInParty, LevelRain, HappinessMoveType - 1,1,1,1,1 # LevelEvening, Custom 1-4 - ] + @@evolution_methods = HandlerHash.new(:PBEvolution) + + def self.copy(sym, *syms) + @@evolution_methods.copy(sym, *syms) + end + + def self.register(sym, hash) + @@evolution_methods.add(sym, hash) + end + + def self.registerIf(cond, hash) + @@evolution_methods.addIf(cond, hash) + end + + def self.hasFunction?(method, function) + method = (method.is_a?(Numeric)) ? method : getConst(PBEvolution, method) + method_hash = @@evolution_methods[method] + return method_hash && method_hash[function] + end + + def self.getFunction(method, function) + method = (method.is_a?(Numeric)) ? method : getConst(PBEvolution, method) + method_hash = @@evolution_methods[method] + return (method_hash && method_hash[function]) ? method_hash[function] : nil + end + + def self.call(function, method, *args) + method = (method.is_a?(Numeric)) ? method : getConst(PBEvolution, method) + method_hash = @@evolution_methods[method] + return nil if !method_hash || !method_hash[function] + return method_hash[function].call(*args) + end end - - #=============================================================================== # Evolutions data cache #=============================================================================== @@ -73,8 +83,6 @@ class PokemonTemp attr_accessor :evolutionsData end - - def pbLoadEvolutionsData $PokemonTemp = PokemonTemp.new if !$PokemonTemp if !$PokemonTemp.evolutionsData @@ -138,24 +146,18 @@ def pbGetBabySpecies(species,item1=-1,item2=-1) end def pbGetMinimumLevel(species) - methodsWithMinLevel = [ - PBEvolution::Level, PBEvolution::LevelMale, PBEvolution::LevelFemale, - PBEvolution::AttackGreater, PBEvolution::AtkDefEqual, PBEvolution::DefenseGreater, - PBEvolution::Silcoon, PBEvolution::Cascoon, - PBEvolution::Ninjask, PBEvolution::Shedinja, - PBEvolution::LevelDay, PBEvolution::LevelNight, - PBEvolution::LevelDarkInParty, PBEvolution::LevelRain - ] evoData = pbGetEvolutionData(species) - return 1 if !evoData || evoData.length==0 + return 1 if !evoData || evoData.length == 0 ret = -1 evoData.each do |evo| - if evo[3] && methodsWithMinLevel.include?(evo[1]) # Is the prevolution - ret = (ret<0) ? evo[2] : [ret,evo[2]].min - break + next if !evo[3] # Is the prevolution + if PBEvolution.hasFunction?(evo[1], "levelUpCheck") + min_level = PBEvolution.getFunction(evo[1], "minimumLevel") + ret = evo[2] if !min_level || min_level != 1 end + break # Because only one prevolution method can be defined end - return (ret==-1) ? 1 : ret + return (ret == -1) ? 1 : ret end def pbGetEvolutionFamilyData(species) @@ -172,17 +174,31 @@ end # Used by the Moon Ball when checking if a Pokémon's evolution family includes # an evolution that uses the Moon Stone. -def pbCheckEvolutionFamilyForMethod(species,method,param=-1) +def pbCheckEvolutionFamilyForMethod(species, method, param = -1) species = pbGetBabySpecies(species) evos = pbGetEvolutionFamilyData(species) - return false if !evos || evos.length==0 + return false if !evos || evos.length == 0 for evo in evos if method.is_a?(Array) next if !method.include?(evo[1]) elsif method>=0 - next if evo[1]!=method + next if evo[1] != method end - next if param>=0 && evo[2]!=param + next if param >= 0 && evo[2] != param + return true + end + return false +end + +# Used by the Moon Ball when checking if a Pokémon's evolution family includes +# an evolution that uses the Moon Stone. +def pbCheckEvolutionFamilyForItemMethodItem(species, param = -1) + species = pbGetBabySpecies(species) + evos = pbGetEvolutionFamilyData(species) + return false if !evos || evos.length == 0 + for evo in evos + next if !PBEvolution.hasFunction?(evo[1], "itemCheck") + next if param >= 0 && evo[2] != param return true end return false @@ -202,106 +218,17 @@ def pbEvoDebug # Unused echo "end\n" end - - #=============================================================================== -# Evolution methods +# Evolution checks #=============================================================================== -def pbMiniCheckEvolution(pokemon,evonib,level,poke) - case evonib - when PBEvolution::Happiness - return poke if pokemon.happiness>=220 - when PBEvolution::HappinessDay - return poke if pokemon.happiness>=220 && PBDayNight.isDay? - when PBEvolution::HappinessNight - return poke if pokemon.happiness>=220 && PBDayNight.isNight? - when PBEvolution::HappinessMoveType - if pokemon.happiness>=220 - for m in pokemon.moves - return poke if m.id>0 && m.type==level - end - end - when PBEvolution::Level - return poke if pokemon.level>=level - when PBEvolution::LevelDay - return poke if pokemon.level>=level && PBDayNight.isDay? - when PBEvolution::LevelNight - return poke if pokemon.level>=level && PBDayNight.isNight? - when PBEvolution::LevelEvening - return poke if pokemon.level>=level && PBDayNight.isEvening? - when PBEvolution::LevelMale - return poke if pokemon.level>=level && pokemon.male? - when PBEvolution::LevelFemale - return poke if pokemon.level>=level && pokemon.female? - when PBEvolution::AttackGreater # Hitmonlee - return poke if pokemon.level>=level && pokemon.attack>pokemon.defense - when PBEvolution::AtkDefEqual # Hitmontop - return poke if pokemon.level>=level && pokemon.attack==pokemon.defense - when PBEvolution::DefenseGreater # Hitmonchan - return poke if pokemon.level>=level && pokemon.attack=level && (((pokemon.personalID>>16)&0xFFFF)%10)<5 - when PBEvolution::Cascoon - return poke if pokemon.level>=level && (((pokemon.personalID>>16)&0xFFFF)%10)>=5 - when PBEvolution::Ninjask - return poke if pokemon.level>=level - when PBEvolution::Shedinja - return -1 - when PBEvolution::DayHoldItem - return poke if pokemon.item==level && PBDayNight.isDay? - when PBEvolution::NightHoldItem - return poke if pokemon.item==level && PBDayNight.isNight? - when PBEvolution::HasMove - for m in pokemon.moves - return poke if m.id==level - end - when PBEvolution::HasInParty - for i in $Trainer.pokemonParty - return poke if i.species==level - end - when PBEvolution::LevelDarkInParty - if pokemon.level>=level - for i in $Trainer.pokemonParty - return poke if i.hasType?(:DARK) - end - end - when PBEvolution::Location - return poke if $game_map.map_id==level - when PBEvolution::LevelRain - if pokemon.level>=level - if $game_screen && ($game_screen.weather_type==PBFieldWeather::Rain || - $game_screen.weather_type==PBFieldWeather::HeavyRain || - $game_screen.weather_type==PBFieldWeather::Storm) - return poke - end - end - when PBEvolution::Beauty # Feebas - return poke if pokemon.beauty>=level - when PBEvolution::Trade, PBEvolution::TradeItem, PBEvolution::TradeSpecies - return -1 - when PBEvolution::Custom1 - # Add code for custom evolution type 1 - when PBEvolution::Custom2 - # Add code for custom evolution type 2 - when PBEvolution::Custom3 - # Add code for custom evolution type 3 - when PBEvolution::Custom4 - # Add code for custom evolution type 4 - end - return -1 +def pbMiniCheckEvolution(pkmn, method, parameter, new_species) + success = PBEvolution.call("levelUpCheck", method, pkmn, parameter) + return (success) ? new_species : -1 end -def pbMiniCheckEvolutionItem(pokemon,evonib,level,poke,item) - # Checks for when an item is used on the Pokémon (e.g. an evolution stone) - case evonib - when PBEvolution::Item - return poke if level==item - when PBEvolution::ItemMale - return poke if level==item && pokemon.male? - when PBEvolution::ItemFemale - return poke if level==item && pokemon.female? - end - return -1 +def pbMiniCheckEvolutionItem(pkmn, method, parameter, new_species, item) + success = PBEvolution.call("itemCheck", method, pkmn, parameter, item) + return (success) ? new_species : -1 end # Checks whether a Pokemon can evolve now. If a block is given, calls the block @@ -332,3 +259,244 @@ def pbCheckEvolution(pokemon,item=0) } end end + +#=============================================================================== +# Evolution methods that trigger when levelling up +#=============================================================================== +PBEvolution.register(:Level, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter + } +}) + +PBEvolution.register(:LevelMale, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && pkmn.male? + } +}) + +PBEvolution.register(:LevelFemale, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && pkmn.female? + } +}) + +PBEvolution.register(:LevelDay, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && PBDayNight.isDay? + } +}) + +PBEvolution.register(:LevelNight, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && PBDayNight.isNight? + } +}) + +PBEvolution.register(:LevelEvening, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && PBDayNight.isEvening? + } +}) + +PBEvolution.register(:LevelDarkInParty, { + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.level >= parameter + next $Trainer.pokemonParty.any? { |p| p && p.hasType(:DARK) } + end + } +}) + +PBEvolution.register(:LevelRain, { + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.level >= parameter && $game_screen + next [PBFieldWeather::Rain, PBFieldWeather::HeavyRain, + PBFieldWeather::Storm].include?($game_screen.weather_type) + end + } +}) + +PBEvolution.register(:AttackGreater, { # Hitmonlee + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && pkmn.attack > pkmn.defense + } +}) + +PBEvolution.register(:AtkDefEqual, { # Hitmontop + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && pkmn.attack == pkmn.defense + } +}) + +PBEvolution.register(:DefenseGreater, { # Hitmonchan + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && pkmn.attack < pkmn.defense + } +}) + +PBEvolution.register(:Silcoon, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && (((pkmn.personalID >> 16) & 0xFFFF) % 10) < 5 + } +}) + +PBEvolution.register(:Cascoon, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && (((pkmn.personalID >> 16) & 0xFFFF) % 10) >= 5 + } +}) + +PBEvolution.register(:Ninjask, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter + } +}) + +PBEvolution.register(:Shedinja, { + "afterEvolution" => proc { |pkmn, new_species, parameter, evo_species| + next false if $Trainer.party.length>=6 + next false if !$PokemonBag.pbHasItem?(getConst(PBItems,:POKEBALL)) + PokemonEvolutionScene.pbDuplicatePokemon(pkmn, new_species) + $PokemonBag.pbDeleteItem(getConst(PBItems,:POKEBALL)) + next true + } +}) + +PBEvolution.register(:Happiness, { + "minimumLevel" => 1, # Needs any level up + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.happiness >= 220 + } +}) + +PBEvolution.register(:HappinessDay, { + "minimumLevel" => 1, # Needs any level up + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.happiness >= 220 && PBDayNight.isDay? + } +}) + +PBEvolution.register(:HappinessNight, { + "minimumLevel" => 1, # Needs any level up + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.happiness >= 220 && PBDayNight.isDay? + } +}) + +PBEvolution.register(:HappinessMoveType, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBTypes, + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.happiness >= 220 + next pkmn.moves.any? { |m| m && m.id > 0 && m.type == parameter } + end + } +}) + +PBEvolution.register(:Beauty, { # Feebas + "minimumLevel" => 1, # Needs any level up + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.beauty >= parameter + } +}) + +PBEvolution.register(:DayHoldItem, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.item == parameter && PBDayNight.isDay? + }, + "afterEvolution" => proc { |pkmn, new_species, parameter, evo_species| + next false if evo_species != new_species || !pkmn.hasItem?(parameter) + pkmn.setItem(0) # Item is now consumed + next true + } +}) + +PBEvolution.register(:NightHoldItem, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.item == parameter && PBDayNight.isNight? + }, + "afterEvolution" => proc { |pkmn, new_species, parameter, evo_species| + next false if evo_species != new_species || !pkmn.hasItem?(parameter) + pkmn.setItem(0) # Item is now consumed + next true + } +}) + +PBEvolution.register(:HasMove, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBMoves, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.moves.any? { |m| m && m.id == parameter } + } +}) + +PBEvolution.register(:HasInParty, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBSpecies, + "levelUpCheck" => proc { |pkmn, parameter| + next pbHasSpecies?(parameter) + } +}) + +PBEvolution.register(:Location, { + "minimumLevel" => 1, # Needs any level up + "levelUpCheck" => proc { |pkmn, parameter| + next $game_map.map_id == parameter + } +}) + +#=============================================================================== +# Evolution methods that trigger when using an item on the Pokémon +#=============================================================================== +PBEvolution.register(:Item, { + "parameterType" => :PBItems, + "itemCheck" => proc { |pkmn, parameter, item| + next item == parameter + } +}) + +PBEvolution.register(:ItemMale, { + "parameterType" => :PBItems, + "itemCheck" => proc { |pkmn, parameter, item| + next item == parameter && pkmn.male? + } +}) + +PBEvolution.register(:ItemFemale, { + "parameterType" => :PBItems, + "itemCheck" => proc { |pkmn, parameter, item| + next item == parameter && pkmn.female? + } +}) + +#=============================================================================== +# Evolution methods that trigger when the Pokémon is obtained in a trade +#=============================================================================== +PBEvolution.register(:Trade, { + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + next true + } +}) + +PBEvolution.register(:TradeItem, { + "parameterType" => :PBItems, + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + next pkmn.item == parameter + }, + "afterEvolution" => proc { |pkmn, new_species, parameter, evo_species| + next false if evo_species != new_species || !pkmn.hasItem?(parameter) + pkmn.setItem(0) # Item is now consumed + next true + } +}) + +PBEvolution.register(:TradeSpecies, { + "parameterType" => :PBSpecies, + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + next pkmn.species == parameter && !other_pkmn.hasItem?(:EVERSTONE) + } +}) diff --git a/Data/Scripts/017_UI/021_PScreen_Evolution.rb b/Data/Scripts/017_UI/021_PScreen_Evolution.rb index d1057cc85..6f9fd2aa2 100644 --- a/Data/Scripts/017_UI/021_PScreen_Evolution.rb +++ b/Data/Scripts/017_UI/021_PScreen_Evolution.rb @@ -583,7 +583,7 @@ class PokemonEvolutionScene @pokemon.name,newspeciesname)) { pbUpdate } @sprites["msgwindow"].text = "" # Check for consumed item and check if Pokémon should be duplicated - createSpecies = pbRemoveItemAfterEvolution + pbEvolutionMethodAfterEvolution # Modify Pokémon to make it evolved @pokemon.species = @newspecies @pokemon.name = newspeciesname if @pokemon.name==oldspeciesname @@ -599,46 +599,30 @@ class PokemonEvolutionScene next if i[0]!=0 && i[0]!=@pokemon.level # 0 is "learn upon evolution" pbLearnMove(@pokemon,i[1],true) { pbUpdate } end - # Duplicate Pokémon (i.e. Shedinja) - if createSpecies>0 && $Trainer.party.length<6 - pbDuplicatePokemon(createSpecies) - # Consume Poké Ball - $PokemonBag.pbDeleteItem(getConst(PBItems,:POKEBALL)) - end end - def pbRemoveItemAfterEvolution - removeItem = false - createSpecies = pbCheckEvolutionEx(@pokemon) { |_pokemon,evonib,_level,pkmn| - case evonib - when PBEvolution::Shedinja - next pkmn if $PokemonBag.pbHasItem?(getConst(PBItems,:POKEBALL)) - when PBEvolution::TradeItem,PBEvolution::DayHoldItem,PBEvolution::NightHoldItem - removeItem = true if pkmn==@newspecies # Item is now consumed - end - next -1 + def pbEvolutionMethodAfterEvolution + pbCheckEvolutionEx(@pokemon) { |pkmn, method, parameter, new_species| + success = PBEvolution.call("afterEvolution", method, pkmn, new_species, parameter, @newspecies) + next (success) ? 1 : -1 } - @pokemon.setItem(0) if removeItem - return createSpecies end - def pbDuplicatePokemon(createSpecies) - newpokemon = @pokemon.clone - newpokemon.species = createSpecies - newpokemon.name = PBSpecies.getName(createSpecies) - newpokemon.iv = @pokemon.iv.clone - newpokemon.ev = @pokemon.ev.clone - newpokemon.markings = 0 - newpokemon.ballused = 0 - newpokemon.setItem(0) - newpokemon.clearAllRibbons - newpokemon.calcStats - newpokemon.heal + def self.pbDuplicatePokemon(pkmn, new_species) + new_pkmn = pkmn.clone + new_pkmn.species = new_species + new_pkmn.name = PBSpecies.getName(new_species) + new_pkmn.markings = 0 + new_pkmn.ballused = 0 + new_pkmn.setItem(0) + new_pkmn.clearAllRibbons + new_pkmn.calcStats + new_pkmn.heal # Add duplicate Pokémon to party - $Trainer.party.push(newpokemon) + $Trainer.party.push(new_pkmn) # See and own duplicate Pokémon - $Trainer.seen[createSpecies] = true - $Trainer.owned[createSpecies] = true - pbSeenForm(newpokemon) + $Trainer.seen[new_species] = true + $Trainer.owned[new_species] = true + pbSeenForm(new_pkmn) end end diff --git a/Data/Scripts/017_UI/022_PScreen_Trading.rb b/Data/Scripts/017_UI/022_PScreen_Trading.rb index fb13eff9b..55ae16dea 100644 --- a/Data/Scripts/017_UI/022_PScreen_Trading.rb +++ b/Data/Scripts/017_UI/022_PScreen_Trading.rb @@ -227,22 +227,10 @@ end #=============================================================================== # Evolution methods #=============================================================================== -def pbTradeCheckEvolution(pokemon,pokemon2) - ret = pbCheckEvolutionEx(pokemon) { |pokemon,evonib,level,poke| - case evonib - when PBEvolution::Trade - next poke - when PBEvolution::TradeItem - if pokemon.item==level - pokemon.setItem(0) - next poke - end - when PBEvolution::TradeSpecies - if !pokemon2.hasItem?(:EVERSTONE) - next poke if pokemon2.species==level - end - end - next -1 +def pbTradeCheckEvolution(pkmn, other_pkmn) + ret = pbCheckEvolutionEx(pkmn) { |pkmn, method, parameter, new_species| + success = PBEvolution.call("tradeCheck", method, pkmn, parameter, other_pkmn) + next (success) ? new_species : -1 } return ret end diff --git a/Data/Scripts/021_Debug/004_Editor_Screens.rb b/Data/Scripts/021_Debug/004_Editor_Screens.rb index 414771cc0..58d589b1f 100644 --- a/Data/Scripts/021_Debug/004_Editor_Screens.rb +++ b/Data/Scripts/021_Debug/004_Editor_Screens.rb @@ -798,7 +798,7 @@ def pbPokemonEditor _INTL("Urban"),_INTL("Rare")]), _INTL("The habitat of this species.")], [_INTL("RegionalNumbers"),ReadOnlyProperty,_INTL("Regional Dex numbers for the Pokémon. These are edited elsewhere.")], - [_INTL("Kind"),StringProperty._INTL("Kind of Pokémon species.")], + [_INTL("Kind"),StringProperty,_INTL("Kind of Pokémon species.")], [_INTL("Pokédex"),StringProperty,_INTL("Description of the Pokémon as displayed in the Pokédex.")], [_INTL("FormName"),StringProperty,_INTL("Name of this form of the Pokémon.")], [_INTL("WildItemCommon"),ItemProperty,_INTL("Item commonly held by wild Pokémon of this species.")], diff --git a/Data/Scripts/021_Debug/005_Editor_SaveData.rb b/Data/Scripts/021_Debug/005_Editor_SaveData.rb index da5489090..65a882a56 100644 --- a/Data/Scripts/021_Debug/005_Editor_SaveData.rb +++ b/Data/Scripts/021_Debug/005_Editor_SaveData.rb @@ -829,33 +829,21 @@ def pbSavePokemonData pokedata.write("Evolutions = ") count = 0 for form in pbGetEvolvedFormData(i) - evonib = form[0] - level = form[1] - poke = form[2] - next if poke==0 - cpoke = getConstantName(PBSpecies,poke) rescue pbGetSpeciesConst(poke) - evoname = getConstantName(PBEvolution,evonib) rescue pbGetEvolutionConst(evonib) - next if !cpoke || cpoke=="" + method = form[0] + parameter = form[1] + new_species = form[2] + next if new_species==0 + cnew_species = getConstantName(PBSpecies,new_species) rescue pbGetSpeciesConst(new_species) + evoname = getConstantName(PBEvolution,method) rescue pbGetEvolutionConst(method) + next if !cnew_species || cnew_species=="" pokedata.write(",") if count>0 - pokedata.write(sprintf("%s,%s,",cpoke,evoname)) - case PBEvolution::EVOPARAM[evonib] - when 1 - pokedata.write("#{level}") - when 2 - clevel = getConstantName(PBItems,level) rescue pbGetItemConst(level) - pokedata.write("#{clevel}") - when 3 - clevel = getConstantName(PBMoves,level) rescue pbGetMoveConst(level) - pokedata.write("#{clevel}") - when 4 - clevel = getConstantName(PBSpecies,level) rescue pbGetSpeciesConst(level) - pokedata.write("#{clevel}") - when 5 - clevel = getConstantName(PBTypes,level) rescue pbGetTypeConst(level) - pokedata.write("#{clevel}") - when 6 - clevel = getConstantName(PBAbilities,level) rescue pbGetAbilityConst(level) - pokedata.write("#{clevel}") + pokedata.write(sprintf("%s,%s,",cnew_species,evoname)) + param_type = PBEvolution.getFunction(method, "parameterType") + if param_type + cparameter = getConstantName(param_type,parameter) rescue "" + pokedata.write("#{cparameter}") + else + pokedata.write("#{parameter}") end count += 1 end @@ -1230,8 +1218,9 @@ def pbSavePokemonFormsData if shape!=nil pokedata.write("Shape = #{shape}\r\n") end - if habitat!=nil - pokedata.write("Habitat = "+["","Grassland","Forest","WatersEdge","Sea","Cave","Mountain","RoughTerrain","Urban","Rare"][habitat]+"\r\n") if habitat>0 + if habitat!=nil && habitat>0 + habitat_name = getConstantName(PBHabitats,habitat) rescue pbGetHabitatConst(habitat) + pokedata.write("Habitat = #{habitat_name}\r\n") end if kind!=nil pokedata.write("Kind = #{kind}\r\n") @@ -1267,25 +1256,25 @@ def pbSavePokemonFormsData end origevos = [] for form in pbGetEvolvedFormData(species) - evonib = form[0] - level = form[1] - poke = form[2] - next if poke==0 - cpoke = getConstantName(PBSpecies,poke) rescue pbGetSpeciesConst(poke) - evoname = getConstantName(PBEvolution,evonib) rescue pbGetEvolutionConst(evonib) - next if !cpoke || cpoke=="" - origevos.push([evonib,level,poke]) + method = form[0] + parameter = form[1] + new_species = form[2] + next if new_species==0 + cnew_species = getConstantName(PBSpecies,new_species) rescue pbGetSpeciesConst(new_species) + evoname = getConstantName(PBEvolution,method) rescue pbGetEvolutionConst(method) + next if !cnew_species || cnew_species=="" + origevos.push([method,parameter,new_species]) end evos = [] for form in pbGetEvolvedFormData(i) - evonib = form[0] - level = form[1] - poke = form[2] - next if poke==0 - cpoke = getConstantName(PBSpecies,poke) rescue pbGetSpeciesConst(poke) - evoname = getConstantName(PBEvolution,evonib) rescue pbGetEvolutionConst(evonib) - next if !cpoke || cpoke=="" - evos.push([evonib,level,poke]) + method = form[0] + parameter = form[1] + new_species = form[2] + next if new_species==0 + cnew_species = getConstantName(PBSpecies,new_species) rescue pbGetSpeciesConst(new_species) + evoname = getConstantName(PBEvolution,method) rescue pbGetEvolutionConst(method) + next if !cnew_species || cnew_species=="" + evos.push([method,parameter,new_species]) end diff = false if evos.length!=origevos.length @@ -1302,28 +1291,19 @@ def pbSavePokemonFormsData if diff pokedata.write("Evolutions = ") for k in 0...evos.length - cpoke = getConstantName(PBSpecies,poke) rescue pbGetSpeciesConst(poke) - evoname = getConstantName(PBEvolution,evonib) rescue pbGetEvolutionConst(evonib) - next if !cpoke || cpoke=="" - pokedata.write(sprintf("%s,%s,",cpoke,evoname)) - case PBEvolution::EVOPARAM[evonib] - when 1 - pokedata.write("#{level}") - when 2 - clevel = getConstantName(PBItems,level) rescue pbGetItemConst(level) - pokedata.write("#{clevel}") - when 3 - clevel = getConstantName(PBMoves,level) rescue pbGetMoveConst(level) - pokedata.write("#{clevel}") - when 4 - clevel = getConstantName(PBSpecies,level) rescue pbGetSpeciesConst(level) - pokedata.write("#{clevel}") - when 5 - clevel = getConstantName(PBTypes,level) rescue pbGetTypeConst(level) - pokedata.write("#{clevel}") - when 6 - clevel = getConstantName(PBAbilities,level) rescue pbGetAbilityConst(level) - pokedata.write("#{clevel}") + method = form[0] + parameter = form[1] + new_species = form[2] + cnew_species = getConstantName(PBSpecies,new_species) rescue pbGetSpeciesConst(new_species) + evoname = getConstantName(PBEvolution,method) rescue pbGetEvolutionConst(method) + next if !cnew_species || cnew_species=="" + pokedata.write(sprintf("%s,%s,",cnew_species,evoname)) + param_type = PBEvolution.getFunction(method, "parameterType") + if param_type + cparameter = getConstantName(param_type,parameter) rescue "" + pokedata.write("#{cparameter}") + else + pokedata.write("#{parameter}") end pokedata.write(",") if k0 newmethod = pbMessage(_INTL("Choose an evolution method."),@methods,-1) if newmethod>0 - newparam = 0 - if @evoparams[newmethod]==2 # Items + newparam = -1 + allow_zero = false + param_type = PBEvolution.getFunction(newmethod, "parameterType") + case param_type + when :PBItems newparam = pbChooseItemList - elsif @evoparams[newmethod]==3 # Moves + when :PBMoves newparam = pbChooseMoveList - elsif @evoparams[newmethod]==4 # Species + when :PBSpecies newparam = pbChooseSpeciesList - elsif @evoparams[newmethod]==5 # Types + when :PBTypes + allow_zero = true newparam = pbChooseTypeList - elsif @evoparams[newmethod]==6 # Abilities + when :PBAbilities newparam = pbChooseAbilityList - elsif @evoparams[newmethod]!=0 + else + allow_zero = true params = ChooseNumberParams.new params.setRange(0,65535) - params.setDefaultValue(-1) + params.setCancelValue(-1) newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params) end - if @evoparams[newmethod]==0 || - (@evoparams[newmethod]==1 && newparam && newparam>=0) || - (@evoparams[newmethod]==2 && newparam && newparam>0) || - (@evoparams[newmethod]==3 && newparam && newparam>0) || - (@evoparams[newmethod]==4 && newparam && newparam>0) || - (@evoparams[newmethod]==5 && newparam && newparam>=0) || - (@evoparams[newmethod]==6 && newparam && newparam>0) + if newparam && (newparam>0 || (allow_zero && newparam == 0)) havemove = -1 for i in 0...realcmds.length havemove = realcmds[i][3] if realcmds[i][0]==newmethod && @@ -1320,57 +1315,53 @@ class EvolutionsProperty realcmds[cmd[1]] = nil realcmds.compact! oldsel = havemove - else + elsif newmethod != entry[0] entry[0] = newmethod - entry[1] = 0 if @evoparams[entry[0]]==0 + entry[1] = 0 oldsel = entry[3] end refreshlist = true end elsif cmd2==2 # Change parameter - if @evoparams[entry[0]]==0 - pbMessage(_INTL("This evolution method doesn't use a parameter.")) + newparam = -1 + allow_zero = false + param_type = PBEvolution.getFunction(entry[0], "parameterType") + case param_type + when :PBItems + newparam = pbChooseItemList(entry[1]) + when :PBMoves + newparam = pbChooseMoveList(entry[1]) + when :PBSpecies + newparam = pbChooseSpeciesList(entry[1]) + when :PBTypes + allow_zero = true + newparam = pbChooseTypeList(entry[1]) + when :PBAbilities + newparam = pbChooseAbilityList(entry[1]) else - newparam = -1 - if @evoparams[entry[0]]==2 # Items - newparam = pbChooseItemList(entry[1]) - elsif @evoparams[entry[0]]==3 # Moves - newparam = pbChooseMoveList(entry[1]) - elsif @evoparams[entry[0]]==4 # Species - newparam = pbChooseSpeciesList(entry[1]) - elsif @evoparams[entry[0]]==5 # Types - newparam = pbChooseTypeList(entry[1]) - elsif @evoparams[entry[0]]==6 # Abilities - newparam = pbChooseAbilityList(entry[1]) + allow_zero = true + params = ChooseNumberParams.new + params.setRange(0,65535) + params.setDefaultValue(entry[1]) + params.setCancelValue(-1) + newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params) + end + if newparam && (newparam>0 || (allow_zero && newparam == 0)) + havemove = -1 + for i in 0...realcmds.length + havemove = realcmds[i][3] if realcmds[i][0]==entry[0] && + realcmds[i][1]==newparam && + realcmds[i][2]==entry[2] + end + if havemove>=0 + realcmds[cmd[1]] = nil + realcmds.compact! + oldsel = havemove else - params = ChooseNumberParams.new - params.setRange(0,65535) - params.setDefaultValue(entry[1]) - params.setCancelValue(-1) - newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params) - end - if (@evoparams[entry[0]]==1 && newparam && newparam>=0) || - (@evoparams[entry[0]]==2 && newparam && newparam>0) || - (@evoparams[entry[0]]==3 && newparam && newparam>0) || - (@evoparams[entry[0]]==4 && newparam && newparam>0) || - (@evoparams[entry[0]]==5 && newparam && newparam>=0) || - (@evoparams[entry[0]]==6 && newparam && newparam>0) - havemove = -1 - for i in 0...realcmds.length - havemove = realcmds[i][3] if realcmds[i][0]==entry[0] && - realcmds[i][1]==newparam && - realcmds[i][2]==entry[2] - end - if havemove>=0 - realcmds[cmd[1]] = nil - realcmds.compact! - oldsel = havemove - else - entry[1] = newparam - oldsel = entry[3] - end - refreshlist = true + entry[1] = newparam + oldsel = entry[3] end + refreshlist = true end elsif cmd2==3 # Delete realcmds[cmd[1]] = nil @@ -1409,14 +1400,11 @@ class EvolutionsProperty for i in 0...value.length ret << "," if i>0 param = value[i][1] - case @evoparams[value[i][0]] - when 0; param = "" - when 2; param = sprintf("#{PBItems.getName(param)}") - when 3; param = sprintf("#{PBMoves.getName(param)}") - when 4; param = sprintf("#{PBSpecies.getName(param)}") - when 5; param = sprintf("#{PBTypes.getName(param)}") - when 6; param = sprintf("#{PBAbilities.getName(param)}") + param_type = PBEvolution.getFunction(value[i][0], "parameterType") + if param_type + param = (Object.const_get(param_type).getName(param) rescue getConstantName(param_type, param) rescue param) end + param = "" if !param ret << sprintf("#{PBSpecies.getName(value[i][2])},#{@methods[value[i][0]]},#{param}") end return ret diff --git a/Data/Scripts/021_Debug/008_Editor_Utilities.rb b/Data/Scripts/021_Debug/008_Editor_Utilities.rb index a02121c42..0c7590d67 100644 --- a/Data/Scripts/021_Debug/008_Editor_Utilities.rb +++ b/Data/Scripts/021_Debug/008_Editor_Utilities.rb @@ -232,6 +232,17 @@ def pbGetGenderConst(i) return ret end +def pbGetHabitatConst(i) + ret = MakeshiftConsts.get(53,i,PBHabitats) + if !ret + ret = ["","Grassland","Forest","WatersEdge","Sea","Cave","Mountain", + "RoughTerrain","Urban","Rare"] + i = 0 if i>=ret.length || i<0 + ret = ret[i] + end + return ret +end + def pbGetAbilityConst(i) return MakeshiftConsts.get(MessageTypes::Abilities,i,PBAbilities) end @@ -267,11 +278,11 @@ def pbChooseSpeciesList(default=0) cname = getConstantName(PBSpecies,i) rescue nil commands.push([i,PBSpecies.getName(i)]) if cname end - return pbChooseList(commands,default,-1) + return pbChooseList(commands,default,0,-1) end # Displays an alphabetically sorted list of all moves, and returns the ID of the -# move selected (or 0 if the selection was canceled). "default", if specified, +# move selected (or -1 if the selection was canceled). "default", if specified, # is the ID of the move to initially select. def pbChooseMoveList(default=0) commands = [] @@ -279,7 +290,7 @@ def pbChooseMoveList(default=0) cname = getConstantName(PBMoves,i) rescue nil commands.push([i,PBMoves.getName(i)]) if cname end - return pbChooseList(commands,default) + return pbChooseList(commands,default,0) end def pbChooseMoveListForSpecies(species,defaultMoveID=0) @@ -319,9 +330,9 @@ def pbChooseMoveListForSpecies(species,defaultMoveID=0) end # Displays an alphabetically sorted list of all types, and returns the ID of the -# type selected (or 0 if the selection was canceled). "default", if specified, +# type selected (or -1 if the selection was canceled). "default", if specified, # is the ID of the type to initially select. -def pbChooseTypeList(default=0) +def pbChooseTypeList(default=-1) commands = [] for i in 0..PBTypes.maxValue cname = getConstantName(PBTypes,i) rescue nil @@ -330,9 +341,9 @@ def pbChooseTypeList(default=0) return pbChooseList(commands,default) end -# Displays a list of all items, and returns the ID of the item selected (or 0 if -# the selection was canceled). "default", if specified, is the ID of the item to -# initially select. Pressing Input::A will toggle the list sorting between +# Displays a list of all items, and returns the ID of the item selected (or -1 +# if the selection was canceled). "default", if specified, is the ID of the item +# to initially select. Pressing Input::A will toggle the list sorting between # numerical and alphabetical. def pbChooseItemList(default=0) commands = [] @@ -340,11 +351,11 @@ def pbChooseItemList(default=0) cname = getConstantName(PBItems,i) rescue nil commands.push([i,PBItems.getName(i)]) if cname end - return pbChooseList(commands,default,-1) + return pbChooseList(commands,default,0,-1) end # Displays a list of all abilities, and returns the ID of the ability selected -# (or 0 if the selection was canceled). "default", if specified, is the ID of +# (or -1 if the selection was canceled). "default", if specified, is the ID of # the ability to initially select. Pressing Input::A will toggle the list # sorting between numerical and alphabetical. def pbChooseAbilityList(default=0) @@ -353,7 +364,7 @@ def pbChooseAbilityList(default=0) cname = getConstantName(PBAbilities,i) rescue nil commands.push([i,PBAbilities.getName(i)]) if cname end - return pbChooseList(commands,default,-1) + return pbChooseList(commands,default,0,-1) end def pbChooseBallList(defaultMoveID=-1) @@ -475,7 +486,7 @@ def pbCommands3(cmdwindow,commands,cmdIfCancel,defaultindex=-1,noresize=false) return ret end -def pbChooseList(commands,default=0,sortType=1) +def pbChooseList(commands,default=0,cancelValue=-1,sortType=1) cmdwin = pbListWindow([]) itemID = default itemIndex = 0 @@ -493,7 +504,7 @@ def pbChooseList(commands,default=0,sortType=1) end realcommands = [] for command in commands - if sortType<0 || sortType==0 + if sortType<=0 realcommands.push(sprintf("%03d: %s",command[0],command[1])) else realcommands.push(command[1]) @@ -503,7 +514,7 @@ def pbChooseList(commands,default=0,sortType=1) end cmd = pbCommandsSortable(cmdwin,realcommands,-1,itemIndex,(sortType<0)) if cmd[0]==0 # Chose an option or cancelled - itemID = (cmd[1]<0) ? 0 : commands[cmd[1]][0] + itemID = (cmd[1]<0) ? cancelValue : commands[cmd[1]][0] break elsif cmd[0]==1 # Toggle sorting itemID = commands[cmd[1]][0] @@ -512,7 +523,7 @@ def pbChooseList(commands,default=0,sortType=1) end end cmdwin.dispose - return (itemID>0) ? itemID : 0 + return itemID end def pbCommandsSortable(cmdwindow,commands,cmdIfCancel,defaultindex=-1,sortable=false) diff --git a/Data/Scripts/022_Compiler/002_Compiler_PBS.rb b/Data/Scripts/022_Compiler/002_Compiler_PBS.rb index 9830be8fe..ff3a4661f 100644 --- a/Data/Scripts/022_Compiler/002_Compiler_PBS.rb +++ b/Data/Scripts/022_Compiler/002_Compiler_PBS.rb @@ -852,14 +852,11 @@ def pbCompilePokemonData evolutions[e].each_with_index do |evo,i| FileLineData.setSection(i,"Evolutions","") evo[0] = csvEnumField!(evo[0],PBSpecies,"Evolutions",i) # Species - case PBEvolution::EVOPARAM[evo[1]] # Evolution method - when 1; evo[2] = csvPosInt!(evo[2]) - when 2; evo[2] = csvEnumField!(evo[2],PBItems,"Evolutions",i) - when 3; evo[2] = csvEnumField!(evo[2],PBMoves,"Evolutions",i) - when 4; evo[2] = csvEnumField!(evo[2],PBSpecies,"Evolutions",i) - when 5; evo[2] = csvEnumField!(evo[2],PBTypes,"Evolutions",i) - when 6; evo[2] = csvEnumField!(evo[2],PBAbilities,"Evolutions",i) - else; evo[2] = 0 + param_type = PBEvolution.getFunction(evo[1], "parameterType") + if param_type + evo[2] = csvEnumField!(evo[2], param_type, "Evolutions", i) + else + evo[2] = csvInt!(evo[2]) if evo[2] && evo[2] != "" end end end @@ -1065,14 +1062,11 @@ def pbCompilePokemonForms evolutions[e].each_with_index do |evo,i| FileLineData.setSection(i,"Evolutions","") evo[0] = csvEnumField!(evo[0],PBSpecies,"Evolutions",i) # Species - case PBEvolution::EVOPARAM[evo[1]] # Evolution method - when 1; evo[2] = csvPosInt!(evo[2]) - when 2; evo[2] = csvEnumField!(evo[2],PBItems,"Evolutions",i) - when 3; evo[2] = csvEnumField!(evo[2],PBMoves,"Evolutions",i) - when 4; evo[2] = csvEnumField!(evo[2],PBSpecies,"Evolutions",i) - when 5; evo[2] = csvEnumField!(evo[2],PBTypes,"Evolutions",i) - when 6; evo[2] = csvEnumField!(evo[2],PBAbilities,"Evolutions",i) - else; evo[2] = 0 + param_type = PBEvolution.getFunction(evo[1], "parameterType") + if param_type + evo[2] = csvEnumField!(evo[2], param_type, "Evolutions", i) + else + evo[2] = csvPosInt!(evo[2]) if evo[2] && evo[2] != "" end end end