Tidied up evolution code and added lots more evolution methods

This commit is contained in:
Maruno17
2020-09-12 00:38:06 +01:00
parent 6f353ba813
commit 7f522cee43
3 changed files with 393 additions and 117 deletions

View File

@@ -1,46 +1,68 @@
module PBEvolution 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 None = 0
Happiness = 1 Level = 1
HappinessDay = 2 LevelMale = 2
HappinessNight = 3 LevelFemale = 3
Level = 4 LevelDay = 4
Trade = 5 LevelNight = 5
TradeItem = 6 LevelMorning = 6
Item = 7 LevelAfternoon = 7
AttackGreater = 8 LevelEvening = 8
AtkDefEqual = 9 LevelNoWeather = 9
DefenseGreater = 10 LevelSun = 10
Silcoon = 11 LevelRain = 11
Cascoon = 12 LevelSnow = 12
Ninjask = 13 LevelSandstorm = 13
Shedinja = 14 LevelCycling = 14
Beauty = 15 LevelSurfing = 15
ItemMale = 16 LevelDiving = 16
ItemFemale = 17 LevelDarkness = 17
DayHoldItem = 18 LevelDarkInParty = 18
NightHoldItem = 19 AttackGreater = 19
HasMove = 20 AtkDefEqual = 20
HasInParty = 21 DefenseGreater = 21
LevelMale = 22 Silcoon = 22
LevelFemale = 23 Cascoon = 23
Location = 24 Ninjask = 24
TradeSpecies = 25 Shedinja = 25
LevelDay = 26 Happiness = 26
LevelNight = 27 HappinessMale = 27
LevelDarkInParty = 28 HappinessFemale = 28
LevelRain = 29 HappinessDay = 29
HappinessMoveType = 30 HappinessNight = 30
LevelEvening = 31 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", def self.maxValue; return 59; end
"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"
]
@@evolution_methods = HandlerHash.new(:PBEvolution) @@evolution_methods = HandlerHash.new(:PBEvolution)
@@ -59,7 +81,7 @@ module PBEvolution
def self.hasFunction?(method, function) def self.hasFunction?(method, function)
method = (method.is_a?(Numeric)) ? method : getConst(PBEvolution, method) method = (method.is_a?(Numeric)) ? method : getConst(PBEvolution, method)
method_hash = @@evolution_methods[method] method_hash = @@evolution_methods[method]
return method_hash && method_hash[function] return method_hash && method_hash.keys.include?(function)
end end
def self.getFunction(method, function) 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, { PBEvolution.register(:LevelEvening, {
"levelUpCheck" => proc { |pkmn, parameter| "levelUpCheck" => proc { |pkmn, parameter|
next pkmn.level >= parameter && PBDayNight.isEvening? next pkmn.level >= parameter && PBDayNight.isEvening?
} }
}) })
PBEvolution.register(:LevelDarkInParty, { PBEvolution.register(:LevelNoWeather, {
"levelUpCheck" => proc { |pkmn, parameter| "levelUpCheck" => proc { |pkmn, parameter|
if pkmn.level >= parameter if pkmn.level >= parameter && $game_screen
next $Trainer.pokemonParty.any? { |p| p && p.hasType(:DARK) } 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 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 PBEvolution.register(:AttackGreater, { # Hitmonlee
"levelUpCheck" => proc { |pkmn, parameter| "levelUpCheck" => proc { |pkmn, parameter|
next pkmn.level >= parameter && pkmn.attack > pkmn.defense next pkmn.level >= parameter && pkmn.attack > pkmn.defense
@@ -353,6 +443,7 @@ PBEvolution.register(:Ninjask, {
}) })
PBEvolution.register(:Shedinja, { PBEvolution.register(:Shedinja, {
"parameterType" => nil,
"afterEvolution" => proc { |pkmn, new_species, parameter, evo_species| "afterEvolution" => proc { |pkmn, new_species, parameter, evo_species|
next false if $Trainer.party.length>=6 next false if $Trainer.party.length>=6
next false if !$PokemonBag.pbHasItem?(getConst(PBItems,:POKEBALL)) next false if !$PokemonBag.pbHasItem?(getConst(PBItems,:POKEBALL))
@@ -364,13 +455,31 @@ PBEvolution.register(:Shedinja, {
PBEvolution.register(:Happiness, { PBEvolution.register(:Happiness, {
"minimumLevel" => 1, # Needs any level up "minimumLevel" => 1, # Needs any level up
"parameterType" => nil,
"levelUpCheck" => proc { |pkmn, parameter| "levelUpCheck" => proc { |pkmn, parameter|
next pkmn.happiness >= 220 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, { PBEvolution.register(:HappinessDay, {
"minimumLevel" => 1, # Needs any level up "minimumLevel" => 1, # Needs any level up
"parameterType" => nil,
"levelUpCheck" => proc { |pkmn, parameter| "levelUpCheck" => proc { |pkmn, parameter|
next pkmn.happiness >= 220 && PBDayNight.isDay? next pkmn.happiness >= 220 && PBDayNight.isDay?
} }
@@ -378,8 +487,19 @@ PBEvolution.register(:HappinessDay, {
PBEvolution.register(:HappinessNight, { PBEvolution.register(:HappinessNight, {
"minimumLevel" => 1, # Needs any level up "minimumLevel" => 1, # Needs any level up
"parameterType" => nil,
"levelUpCheck" => proc { |pkmn, parameter| "levelUpCheck" => proc { |pkmn, parameter|
next pkmn.happiness >= 220 && PBDayNight.isDay? 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 PBEvolution.register(:Beauty, { # Feebas
"minimumLevel" => 1, # Needs any level up "minimumLevel" => 1, # Needs any level up
"levelUpCheck" => proc { |pkmn, parameter| "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, { PBEvolution.register(:DayHoldItem, {
"minimumLevel" => 1, # Needs any level up "minimumLevel" => 1, # Needs any level up
"parameterType" => :PBItems, "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, { PBEvolution.register(:HasMove, {
"minimumLevel" => 1, # Needs any level up "minimumLevel" => 1, # Needs any level up
"parameterType" => :PBMoves, "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, { PBEvolution.register(:HasInParty, {
"minimumLevel" => 1, # Needs any level up "minimumLevel" => 1, # Needs any level up
"parameterType" => :PBSpecies, "parameterType" => :PBSpecies,
@@ -449,6 +650,14 @@ PBEvolution.register(:Location, {
} }
}) })
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 # 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 # Evolution methods that trigger when the Pokémon is obtained in a trade
#=============================================================================== #===============================================================================
PBEvolution.register(:Trade, { PBEvolution.register(:Trade, {
"parameterType" => nil,
"tradeCheck" => proc { |pkmn, parameter, other_pkmn| "tradeCheck" => proc { |pkmn, parameter, other_pkmn|
next true 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, { PBEvolution.register(:TradeItem, {
"parameterType" => :PBItems, "parameterType" => :PBItems,
"tradeCheck" => proc { |pkmn, parameter, other_pkmn| "tradeCheck" => proc { |pkmn, parameter, other_pkmn|

View File

@@ -811,7 +811,7 @@ def pbPokemonEditor
[_INTL("BattlerAltitude"),ReadOnlyProperty,_INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")], [_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("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("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.")], [_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| pbListScreenBlock(_INTL("Pokémon species"),SpeciesLister.new(selection,false)) { |button,index|

View File

@@ -1182,8 +1182,11 @@ end
class EvolutionsProperty class EvolutionsProperty
def initialize(methods) def initialize
@methods = methods @methods = []
(PBEvolution.maxValue + 1).times do |i|
@methods[i] = getConstantName(PBEvolution, i)
end
end end
def set(_settingname,oldsetting) def set(_settingname,oldsetting)
@@ -1207,12 +1210,18 @@ class EvolutionsProperty
else else
level = realcmds[i][1] level = realcmds[i][1]
param_type = PBEvolution.getFunction(realcmds[i][0], "parameterType") param_type = PBEvolution.getFunction(realcmds[i][0], "parameterType")
has_param = !PBEvolution.hasFunction?(realcmds[i][0], "parameterType") || param_type != nil
if has_param
if param_type if param_type
level = (Object.const_get(param_type).getName(level) rescue getConstantName(param_type, level) rescue level) level = (Object.const_get(param_type).getName(level) rescue getConstantName(param_type, level) rescue level)
end end
level = "" if !level level = "???" if !level
commands.push(_INTL("{1}: {2}, {3}", commands.push(_INTL("{1}: {2}, {3}",
PBSpecies.getName(realcmds[i][2]),@methods[realcmds[i][0]],level.to_s)) 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
end end
cmd[1] = i if oldsel>=0 && realcmds[i][3]==oldsel cmd[1] = i if oldsel>=0 && realcmds[i][3]==oldsel
end end
@@ -1239,8 +1248,10 @@ class EvolutionsProperty
newmethod = pbMessage(_INTL("Choose an evolution method."),@methods,-1) newmethod = pbMessage(_INTL("Choose an evolution method."),@methods,-1)
if newmethod>0 if newmethod>0
newparam = -1 newparam = -1
allow_zero = false
param_type = PBEvolution.getFunction(newmethod, "parameterType") param_type = PBEvolution.getFunction(newmethod, "parameterType")
has_param = !PBEvolution.hasFunction?(newmethod, "parameterType") || param_type != nil
if has_param
allow_zero = false
case param_type case param_type
when :PBItems when :PBItems
newparam = pbChooseItemList newparam = pbChooseItemList
@@ -1260,7 +1271,8 @@ class EvolutionsProperty
params.setCancelValue(-1) params.setCancelValue(-1)
newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params) newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params)
end end
if newparam && (newparam>0 || (allow_zero && newparam == 0)) end
if !has_param || newparam > 0 || (allow_zero && newparam == 0)
havemove = -1 havemove = -1
for i in 0...realcmds.length for i in 0...realcmds.length
havemove = realcmds[i][3] if realcmds[i][0]==newmethod && havemove = realcmds[i][3] if realcmds[i][0]==newmethod &&
@@ -1324,8 +1336,10 @@ class EvolutionsProperty
end end
elsif cmd2==2 # Change parameter elsif cmd2==2 # Change parameter
newparam = -1 newparam = -1
allow_zero = false
param_type = PBEvolution.getFunction(entry[0], "parameterType") param_type = PBEvolution.getFunction(entry[0], "parameterType")
has_param = !PBEvolution.hasFunction?(entry[0], "parameterType") || param_type != nil
if has_param
allow_zero = false
case param_type case param_type
when :PBItems when :PBItems
newparam = pbChooseItemList(entry[1]) newparam = pbChooseItemList(entry[1])
@@ -1346,7 +1360,7 @@ class EvolutionsProperty
params.setCancelValue(-1) params.setCancelValue(-1)
newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params) newparam = pbMessageChooseNumber(_INTL("Choose a parameter."),params)
end end
if newparam && (newparam>0 || (allow_zero && newparam == 0)) if newparam>0 || (allow_zero && newparam == 0)
havemove = -1 havemove = -1
for i in 0...realcmds.length for i in 0...realcmds.length
havemove = realcmds[i][3] if realcmds[i][0]==entry[0] && havemove = realcmds[i][3] if realcmds[i][0]==entry[0] &&
@@ -1363,6 +1377,9 @@ class EvolutionsProperty
end end
refreshlist = true refreshlist = true
end end
else
pbMessage(_INTL("This evolution method doesn't use a parameter."))
end
elsif cmd2==3 # Delete elsif cmd2==3 # Delete
realcmds[cmd[1]] = nil realcmds[cmd[1]] = nil
realcmds.compact! realcmds.compact!