diff --git a/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb b/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb index 4da708894..5761e5aa8 100644 --- a/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb +++ b/Data/Scripts/016_Pokemon/005_Pokemon_Evolution.rb @@ -1,46 +1,68 @@ module PBEvolution + # NOTE: If you're adding new evolution methods, don't skip any numbers. + # Remember to update def self.maxValue just below the constants list. None = 0 - Happiness = 1 - HappinessDay = 2 - HappinessNight = 3 - Level = 4 - Trade = 5 - TradeItem = 6 - Item = 7 - AttackGreater = 8 - AtkDefEqual = 9 - DefenseGreater = 10 - Silcoon = 11 - Cascoon = 12 - Ninjask = 13 - Shedinja = 14 - Beauty = 15 - ItemMale = 16 - ItemFemale = 17 - DayHoldItem = 18 - NightHoldItem = 19 - HasMove = 20 - HasInParty = 21 - LevelMale = 22 - LevelFemale = 23 - Location = 24 - TradeSpecies = 25 - LevelDay = 26 - LevelNight = 27 - LevelDarkInParty = 28 - LevelRain = 29 - HappinessMoveType = 30 - LevelEvening = 31 + Level = 1 + LevelMale = 2 + LevelFemale = 3 + LevelDay = 4 + LevelNight = 5 + LevelMorning = 6 + LevelAfternoon = 7 + LevelEvening = 8 + LevelNoWeather = 9 + LevelSun = 10 + LevelRain = 11 + LevelSnow = 12 + LevelSandstorm = 13 + LevelCycling = 14 + LevelSurfing = 15 + LevelDiving = 16 + LevelDarkness = 17 + LevelDarkInParty = 18 + AttackGreater = 19 + AtkDefEqual = 20 + DefenseGreater = 21 + Silcoon = 22 + Cascoon = 23 + Ninjask = 24 + Shedinja = 25 + Happiness = 26 + HappinessMale = 27 + HappinessFemale = 28 + HappinessDay = 29 + HappinessNight = 30 + HappinessMove = 31 + HappinessMoveType = 32 + HappinessHoldItem = 33 + MaxHappiness = 34 + Beauty = 35 + HoldItem = 36 + HoldItemMale = 37 + HoldItemFemale = 38 + DayHoldItem = 39 + NightHoldItem = 40 + HoldItemHappiness = 41 + HasMove = 42 + HasMoveType = 43 + HasInParty = 44 + Location = 45 + Region = 46 + Item = 47 + ItemMale = 48 + ItemFemale = 49 + ItemDay = 50 + ItemNight = 51 + ItemHappiness = 52 + Trade = 53 + TradeMale = 54 + TradeFemale = 55 + TradeDay = 56 + TradeNight = 57 + TradeItem = 58 + TradeSpecies = 59 - EVONAMES = ["None", - "Happiness", "HappinessDay", "HappinessNight", "Level", "Trade", - "TradeItem", "Item", "AttackGreater", "AtkDefEqual", "DefenseGreater", - "Silcoon", "Cascoon", "Ninjask", "Shedinja", "Beauty", - "ItemMale", "ItemFemale", "DayHoldItem", "NightHoldItem", "HasMove", - "HasInParty", "LevelMale", "LevelFemale", "Location", "TradeSpecies", - "LevelDay", "LevelNight", "LevelDarkInParty", "LevelRain", "HappinessMoveType", - "LevelEvening" - ] + def self.maxValue; return 59; end @@evolution_methods = HandlerHash.new(:PBEvolution) @@ -59,7 +81,7 @@ module PBEvolution 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] + return method_hash && method_hash.keys.include?(function) end def self.getFunction(method, function) @@ -293,16 +315,36 @@ PBEvolution.register(:LevelNight, { } }) +PBEvolution.register(:LevelMorning, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && PBDayNight.isMorning? + } +}) + +PBEvolution.register(:LevelAfternoon, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && PBDayNight.isAfternoon? + } +}) + PBEvolution.register(:LevelEvening, { "levelUpCheck" => proc { |pkmn, parameter| next pkmn.level >= parameter && PBDayNight.isEvening? } }) -PBEvolution.register(:LevelDarkInParty, { +PBEvolution.register(:LevelNoWeather, { "levelUpCheck" => proc { |pkmn, parameter| - if pkmn.level >= parameter - next $Trainer.pokemonParty.any? { |p| p && p.hasType(:DARK) } + if pkmn.level >= parameter && $game_screen + next $game_screen.weather_type == PBFieldWeather::None + end + } +}) + +PBEvolution.register(:LevelSun, { + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.level >= parameter && $game_screen + next $game_screen.weather_type == PBFieldWeather::Sun end } }) @@ -316,6 +358,54 @@ PBEvolution.register(:LevelRain, { } }) +PBEvolution.register(:LevelSnow, { + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.level >= parameter && $game_screen + next [PBFieldWeather::Snow, PBFieldWeather::Blizzard].include?($game_screen.weather_type) + end + } +}) + +PBEvolution.register(:LevelSandstorm, { + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.level >= parameter && $game_screen + next $game_screen.weather_type == PBFieldWeather::Sandstorm + end + } +}) + +PBEvolution.register(:LevelCycling, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && $PokemonGlobal && $PokemonGlobal.bicycle + } +}) + +PBEvolution.register(:LevelSurfing, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && $PokemonGlobal && $PokemonGlobal.surfing + } +}) + +PBEvolution.register(:LevelDiving, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && $PokemonGlobal && $PokemonGlobal.diving + } +}) + +PBEvolution.register(:LevelDarkness, { + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.level >= parameter && pbGetMetadata($game_map.map_id, MetadataDarkMap) + } +}) + +PBEvolution.register(:LevelDarkInParty, { + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.level >= parameter + next $Trainer.pokemonParty.any? { |p| p && p.hasType(:DARK) } + end + } +}) + PBEvolution.register(:AttackGreater, { # Hitmonlee "levelUpCheck" => proc { |pkmn, parameter| next pkmn.level >= parameter && pkmn.attack > pkmn.defense @@ -353,6 +443,7 @@ PBEvolution.register(:Ninjask, { }) PBEvolution.register(:Shedinja, { + "parameterType" => nil, "afterEvolution" => proc { |pkmn, new_species, parameter, evo_species| next false if $Trainer.party.length>=6 next false if !$PokemonBag.pbHasItem?(getConst(PBItems,:POKEBALL)) @@ -363,23 +454,52 @@ PBEvolution.register(:Shedinja, { }) PBEvolution.register(:Happiness, { - "minimumLevel" => 1, # Needs any level up - "levelUpCheck" => proc { |pkmn, parameter| + "minimumLevel" => 1, # Needs any level up + "parameterType" => nil, + "levelUpCheck" => proc { |pkmn, parameter| next pkmn.happiness >= 220 } }) +PBEvolution.register(:HappinessMale, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => nil, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.happiness >= 220 && pkmn.male? + } +}) + +PBEvolution.register(:HappinessFemale, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => nil, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.happiness >= 220 && pkmn.female? + } +}) + PBEvolution.register(:HappinessDay, { - "minimumLevel" => 1, # Needs any level up - "levelUpCheck" => proc { |pkmn, parameter| + "minimumLevel" => 1, # Needs any level up + "parameterType" => nil, + "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? + "minimumLevel" => 1, # Needs any level up + "parameterType" => nil, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.happiness >= 220 && PBDayNight.isNight? + } +}) + +PBEvolution.register(:HappinessMove, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBMoves, + "levelUpCheck" => proc { |pkmn, parameter| + if pkmn.happiness >= 220 + next pkmn.moves.any? { |m| m && m.id == parameter } + end } }) @@ -393,6 +513,27 @@ PBEvolution.register(:HappinessMoveType, { } }) +PBEvolution.register(:HappinessHoldItem, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.item == parameter && pkmn.happiness >= 220 + }, + "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(:MaxHappiness, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => nil, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.happiness == 255 + } +}) + PBEvolution.register(:Beauty, { # Feebas "minimumLevel" => 1, # Needs any level up "levelUpCheck" => proc { |pkmn, parameter| @@ -400,6 +541,45 @@ PBEvolution.register(:Beauty, { # Feebas } }) +PBEvolution.register(:HoldItem, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter| + 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(:HoldItemMale, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.item == parameter && pkmn.male? + }, + "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(:HoldItemFemale, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.item == parameter && pkmn.female? + }, + "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(:DayHoldItem, { "minimumLevel" => 1, # Needs any level up "parameterType" => :PBItems, @@ -426,6 +606,19 @@ PBEvolution.register(:NightHoldItem, { } }) +PBEvolution.register(:HoldItemHappiness, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.item == parameter && pkmn.happiness >= 220 + }, + "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, @@ -434,6 +627,14 @@ PBEvolution.register(:HasMove, { } }) +PBEvolution.register(:HasMoveType, { + "minimumLevel" => 1, # Needs any level up + "parameterType" => :PBTypes, + "levelUpCheck" => proc { |pkmn, parameter| + next pkmn.moves.any? { |m| m && m.type == parameter } + } +}) + PBEvolution.register(:HasInParty, { "minimumLevel" => 1, # Needs any level up "parameterType" => :PBSpecies, @@ -443,12 +644,20 @@ PBEvolution.register(:HasInParty, { }) PBEvolution.register(:Location, { - "minimumLevel" => 1, # Needs any level up - "levelUpCheck" => proc { |pkmn, parameter| + "minimumLevel" => 1, # Needs any level up + "levelUpCheck" => proc { |pkmn, parameter| next $game_map.map_id == parameter } }) +PBEvolution.register(:Region, { + "minimumLevel" => 1, # Needs any level up + "levelUpCheck" => proc { |pkmn, parameter| + mapPos = pbGetMetadata($game_map.map_id, MetadataMapPosition) + next mapPos && mapPos[0] == parameter + } +}) + #=============================================================================== # Evolution methods that trigger when using an item on the Pokémon #=============================================================================== @@ -473,15 +682,65 @@ PBEvolution.register(:ItemFemale, { } }) +PBEvolution.register(:ItemDay, { + "parameterType" => :PBItems, + "itemCheck" => proc { |pkmn, parameter, item| + next item == parameter && PBDayNight.isDay? + } +}) + +PBEvolution.register(:ItemNight, { + "parameterType" => :PBItems, + "itemCheck" => proc { |pkmn, parameter, item| + next item == parameter && PBDayNight.isNight? + } +}) + +PBEvolution.register(:ItemHappiness, { + "parameterType" => :PBItems, + "levelUpCheck" => proc { |pkmn, parameter, item| + next item == parameter && pkmn.happiness >= 220 + } +}) + #=============================================================================== # Evolution methods that trigger when the Pokémon is obtained in a trade #=============================================================================== PBEvolution.register(:Trade, { - "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + "parameterType" => nil, + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| next true } }) +PBEvolution.register(:TradeMale, { + "parameterType" => nil, + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + next pkmn.male? + } +}) + +PBEvolution.register(:TradeFemale, { + "parameterType" => nil, + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + next pkmn.female? + } +}) + +PBEvolution.register(:TradeDay, { + "parameterType" => nil, + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + next PBDayNight.isDay? + } +}) + +PBEvolution.register(:TradeNight, { + "parameterType" => nil, + "tradeCheck" => proc { |pkmn, parameter, other_pkmn| + next PBDayNight.isNight? + } +}) + PBEvolution.register(:TradeItem, { "parameterType" => :PBItems, "tradeCheck" => proc { |pkmn, parameter, other_pkmn| diff --git a/Data/Scripts/021_Debug/004_Editor_Screens.rb b/Data/Scripts/021_Debug/004_Editor_Screens.rb index 58d589b1f..bb4d8ecda 100644 --- a/Data/Scripts/021_Debug/004_Editor_Screens.rb +++ b/Data/Scripts/021_Debug/004_Editor_Screens.rb @@ -811,7 +811,7 @@ def pbPokemonEditor [_INTL("BattlerAltitude"),ReadOnlyProperty,_INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")], [_INTL("BattlerShadowX"),ReadOnlyProperty,_INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")], [_INTL("BattlerShadowSize"),ReadOnlyProperty,_INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")], - [_INTL("Evolutions"),EvolutionsProperty.new(PBEvolution::EVONAMES),_INTL("Evolution paths of this species.")], + [_INTL("Evolutions"),EvolutionsProperty.new,_INTL("Evolution paths of this species.")], [_INTL("Incense"),ItemProperty,_INTL("Item needed to be held by a parent to produce an egg of this species.")], ] pbListScreenBlock(_INTL("Pokémon species"),SpeciesLister.new(selection,false)) { |button,index| diff --git a/Data/Scripts/021_Debug/006_Editor_DataTypes.rb b/Data/Scripts/021_Debug/006_Editor_DataTypes.rb index dec728312..ed3a30896 100644 --- a/Data/Scripts/021_Debug/006_Editor_DataTypes.rb +++ b/Data/Scripts/021_Debug/006_Editor_DataTypes.rb @@ -1182,8 +1182,11 @@ end class EvolutionsProperty - def initialize(methods) - @methods = methods + def initialize + @methods = [] + (PBEvolution.maxValue + 1).times do |i| + @methods[i] = getConstantName(PBEvolution, i) + end end def set(_settingname,oldsetting) @@ -1207,12 +1210,18 @@ class EvolutionsProperty else level = realcmds[i][1] param_type = PBEvolution.getFunction(realcmds[i][0], "parameterType") - if param_type - level = (Object.const_get(param_type).getName(level) rescue getConstantName(param_type, level) rescue level) + has_param = !PBEvolution.hasFunction?(realcmds[i][0], "parameterType") || param_type != nil + if has_param + if param_type + level = (Object.const_get(param_type).getName(level) rescue getConstantName(param_type, level) rescue level) + end + level = "???" if !level + commands.push(_INTL("{1}: {2}, {3}", + PBSpecies.getName(realcmds[i][2]),@methods[realcmds[i][0]],level.to_s)) + else + commands.push(_INTL("{1}: {2}", + PBSpecies.getName(realcmds[i][2]),@methods[realcmds[i][0]])) end - level = "" if !level - commands.push(_INTL("{1}: {2}, {3}", - PBSpecies.getName(realcmds[i][2]),@methods[realcmds[i][0]],level.to_s)) end cmd[1] = i if oldsel>=0 && realcmds[i][3]==oldsel end @@ -1239,28 +1248,31 @@ class EvolutionsProperty newmethod = pbMessage(_INTL("Choose an evolution method."),@methods,-1) if newmethod>0 newparam = -1 - allow_zero = false param_type = PBEvolution.getFunction(newmethod, "parameterType") - case param_type - when :PBItems - newparam = pbChooseItemList - when :PBMoves - newparam = pbChooseMoveList - when :PBSpecies - newparam = pbChooseSpeciesList - when :PBTypes - allow_zero = true - newparam = pbChooseTypeList - when :PBAbilities - newparam = pbChooseAbilityList - else - allow_zero = true - params = ChooseNumberParams.new - params.setRange(0,65535) - params.setCancelValue(-1) - newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params) + has_param = !PBEvolution.hasFunction?(newmethod, "parameterType") || param_type != nil + if has_param + allow_zero = false + case param_type + when :PBItems + newparam = pbChooseItemList + when :PBMoves + newparam = pbChooseMoveList + when :PBSpecies + newparam = pbChooseSpeciesList + when :PBTypes + allow_zero = true + newparam = pbChooseTypeList + when :PBAbilities + newparam = pbChooseAbilityList + else + allow_zero = true + params = ChooseNumberParams.new + params.setRange(0,65535) + params.setCancelValue(-1) + newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params) + end end - if newparam && (newparam>0 || (allow_zero && newparam == 0)) + if !has_param || newparam > 0 || (allow_zero && newparam == 0) havemove = -1 for i in 0...realcmds.length havemove = realcmds[i][3] if realcmds[i][0]==newmethod && @@ -1324,44 +1336,49 @@ class EvolutionsProperty end elsif cmd2==2 # Change 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 - 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 + has_param = !PBEvolution.hasFunction?(entry[0], "parameterType") || param_type != nil + if has_param + allow_zero = false + 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 - entry[1] = newparam - oldsel = entry[3] + 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 - refreshlist = true + if 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 + entry[1] = newparam + oldsel = entry[3] + end + refreshlist = true + end + else + pbMessage(_INTL("This evolution method doesn't use a parameter.")) end elsif cmd2==3 # Delete realcmds[cmd[1]] = nil