mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
Rewrote evolution methods to make them modular
This commit is contained in:
@@ -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<pokemon.defense
|
||||
when PBEvolution::Silcoon
|
||||
return poke if pokemon.level>=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)
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user