mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
[wip] generate fusions dynamically
This commit is contained in:
@@ -24,12 +24,28 @@ module GameData
|
||||
# @return [self]
|
||||
def get(other)
|
||||
validate other => [Symbol, self, String, Integer]
|
||||
|
||||
return other if other.is_a?(self)
|
||||
other = other.to_sym if other.is_a?(String)
|
||||
# if other.is_a?(Integer)
|
||||
# p "Please switch to symbols, thanks."
|
||||
# end
|
||||
|
||||
if other.to_s.match?(/\AB\d+H\d+\z/)
|
||||
species = GameData::FusedSpecies.new(other)
|
||||
return species
|
||||
end
|
||||
if other.is_a?(Integer) #assume it's a species
|
||||
if other > NB_POKEMON
|
||||
body_id = getBodyID(other)
|
||||
head_id = getHeadID(other,body_id)
|
||||
pokemon_id = getFusedPokemonIdFromDexNum(body_id,head_id)
|
||||
return GameData::FusedSpecies.new(pokemon_id)
|
||||
end
|
||||
end
|
||||
raise "Unknown ID #{other}." unless self::DATA.has_key?(other)
|
||||
|
||||
#if other == :Species
|
||||
|
||||
# end
|
||||
|
||||
return self::DATA[other]
|
||||
end
|
||||
|
||||
|
||||
@@ -59,18 +59,19 @@ module GameData
|
||||
# @param form [Integer]
|
||||
# @return [self, nil]
|
||||
def self.get_species_form(species, form)
|
||||
return nil if !species || !form
|
||||
validate species => [Symbol, self, String, Integer]
|
||||
validate form => Integer
|
||||
# if other.is_a?(Integer)
|
||||
# p "Please switch to symbols, thanks."
|
||||
# end
|
||||
species = species.species if species.is_a?(self)
|
||||
species = DATA[species].species if species.is_a?(Integer)
|
||||
species = species.to_sym if species.is_a?(String)
|
||||
trial = sprintf("%s_%d", species, form).to_sym
|
||||
species_form = (DATA[trial].nil?) ? species : trial
|
||||
return (DATA.has_key?(species_form)) ? DATA[species_form] : nil
|
||||
return GameData::Species.get(species) rescue nil
|
||||
# return nil if !species || !form
|
||||
# validate species => [Symbol, self, String, Integer]
|
||||
# validate form => Integer
|
||||
# # if other.is_a?(Integer)
|
||||
# # p "Please switch to symbols, thanks."
|
||||
# # end
|
||||
# species = species.species if species.is_a?(self)
|
||||
# species = DATA[species].species if species.is_a?(Integer)
|
||||
# species = species.to_sym if species.is_a?(String)
|
||||
# trial = sprintf("%s_%d", species, form).to_sym
|
||||
# species_form = (DATA[trial].nil?) ? species : trial
|
||||
# return (DATA.has_key?(species_form)) ? DATA[species_form] : nil
|
||||
end
|
||||
|
||||
def self.schema(compiling_forms = false)
|
||||
@@ -191,22 +192,26 @@ module GameData
|
||||
end
|
||||
# @return [String] the translated name of this species
|
||||
def name
|
||||
return pbGetMessage(MessageTypes::Species, @id_number)
|
||||
return @real_name
|
||||
#return pbGetMessage(MessageTypes::Species, @id_number)
|
||||
end
|
||||
|
||||
# @return [String] the translated name of this form of this species
|
||||
def form_name
|
||||
return pbGetMessage(MessageTypes::FormNames, @id_number)
|
||||
return @real_form_name
|
||||
#return pbGetMessage(MessageTypes::FormNames, @id_number)
|
||||
end
|
||||
|
||||
# @return [String] the translated Pokédex category of this species
|
||||
def category
|
||||
return pbGetMessage(MessageTypes::Kinds, @id_number)
|
||||
return @real_category
|
||||
#return pbGetMessage(MessageTypes::Kinds, @id_number)
|
||||
end
|
||||
|
||||
# @return [String] the translated Pokédex entry of this species
|
||||
def pokedex_entry
|
||||
return pbGetMessage(MessageTypes::Entries, @id_number)
|
||||
return @real_pokedex_entry
|
||||
#return pbGetMessage(MessageTypes::Entries, @id_number)
|
||||
end
|
||||
|
||||
def is_fusion
|
||||
|
||||
@@ -210,10 +210,10 @@ module GameData
|
||||
species_data = GameData::Species.get(getHeadID(species_data))
|
||||
end
|
||||
|
||||
if form > 0
|
||||
ret = sprintf("Cries/%s_%d", species_data.species, form)
|
||||
return ret if pbResolveAudioSE(ret)
|
||||
end
|
||||
# if form > 0
|
||||
# ret = sprintf("Cries/%s_%d", species_data.species, form)
|
||||
# return ret if pbResolveAudioSE(ret)
|
||||
# end
|
||||
ret = sprintf("Cries/%s", species_data.species)
|
||||
return (pbResolveAudioSE(ret)) ? ret : nil
|
||||
end
|
||||
|
||||
@@ -126,7 +126,8 @@ class Pokemon
|
||||
end
|
||||
|
||||
def species_data
|
||||
return GameData::Species.get_species_form(@species, form_simple)
|
||||
@species_data = GameData::Species.get(@species) if ! @species_data
|
||||
return @species_data #GameData::Species.get(@species)
|
||||
end
|
||||
|
||||
#=============================================================================
|
||||
@@ -142,6 +143,7 @@ class Pokemon
|
||||
new_species_data = GameData::Species.get(species_id)
|
||||
return if @species == new_species_data.species
|
||||
@species = new_species_data.species
|
||||
p @species.name
|
||||
@form = new_species_data.form if new_species_data.form != 0
|
||||
@forced_form = nil
|
||||
@level = nil # In case growth rate is different for the new species
|
||||
@@ -1221,9 +1223,9 @@ class Pokemon
|
||||
# @param withMoves [TrueClass, FalseClass] whether the Pokémon should have moves
|
||||
# @param rechech_form [TrueClass, FalseClass] whether to auto-check the form
|
||||
def initialize(species, level, owner = $Trainer, withMoves = true, recheck_form = true)
|
||||
species_data = GameData::Species.get(species)
|
||||
@species = species_data.species
|
||||
@form = species_data.form
|
||||
@species_data = GameData::Species.get(species)
|
||||
@species = @species_data.species
|
||||
@form = @species_data.form
|
||||
@forced_form = nil
|
||||
@time_form_set = nil
|
||||
self.level = level
|
||||
@@ -1253,7 +1255,7 @@ class Pokemon
|
||||
@sheen = 0
|
||||
@pokerus = 0
|
||||
@name = nil
|
||||
@happiness = species_data.happiness
|
||||
@happiness = @species_data.happiness
|
||||
@poke_ball = :POKEBALL
|
||||
@markings = 0
|
||||
@iv = {}
|
||||
|
||||
@@ -80,12 +80,16 @@ class Player < Trainer
|
||||
end
|
||||
|
||||
def set_seen_fusion(species)
|
||||
initFusionDexArray() if @seen_fusion.length < NB_POKEMON+2
|
||||
|
||||
bodyId = getBodyID(species)
|
||||
headId = getHeadID(species, bodyId)
|
||||
@seen_fusion[headId][bodyId] = true
|
||||
end
|
||||
|
||||
def set_seen_normalDex(species)
|
||||
initStandardDexArray() if @seen_standard.length < NB_POKEMON
|
||||
|
||||
dex_num = getDexNumberForSpecies(species)
|
||||
@seen_standard[dex_num] = true
|
||||
end
|
||||
|
||||
@@ -328,7 +328,9 @@ module Compiler
|
||||
enumer = GameData.const_get(enumer.to_sym)
|
||||
begin
|
||||
if nil_or_empty?(ret) || !enumer.exists?(ret.to_sym)
|
||||
raise _INTL("Undefined value {1} in {2}\r\n{3}", ret, enumer.name, FileLineData.linereport)
|
||||
if enumer != GameData::Species
|
||||
raise _INTL("Undefined value {1} in {2}\r\n{3}", ret, enumer.name, FileLineData.linereport)
|
||||
end
|
||||
end
|
||||
rescue NameError
|
||||
raise _INTL("Incorrect value {1} in {2}\r\n{3}", ret, enumer.name, FileLineData.linereport)
|
||||
|
||||
@@ -458,7 +458,7 @@ def getDexNumFromFilename(filename)
|
||||
head = splitPoke[0].to_i
|
||||
body = splitPoke[1].to_i
|
||||
|
||||
return nil if (body * NB_POKEMON) + head > (NB_POKEMON * NB_POKEMON) + 420
|
||||
return nil if (body * NB_POKEMON) + head > (NB_POKEMON * NB_POKEMON) + NB_POKEMON
|
||||
return (body * NB_POKEMON) + head
|
||||
end
|
||||
|
||||
|
||||
188
Data/Scripts/048_Fusion/FusedSpecies.rb
Normal file
188
Data/Scripts/048_Fusion/FusedSpecies.rb
Normal file
@@ -0,0 +1,188 @@
|
||||
module GameData
|
||||
class FusedSpecies < GameData::Species
|
||||
attr_reader :growth_rate
|
||||
|
||||
def initialize(id)
|
||||
if id.is_a?(Integer)
|
||||
body_id = getBodyID(id)
|
||||
head_id = getHeadID(id,body_id)
|
||||
pokemon_id = getFusedPokemonIdFromDexNum(body_id,head_id)
|
||||
return GameData::FusedSpecies.new(pokemon_id)
|
||||
end
|
||||
head_id = get_head_id_from_symbol(id)
|
||||
body_id = get_body_id_from_symbol(id)
|
||||
|
||||
@body_pokemon = GameData::Species.get(head_id)
|
||||
@head_pokemon = GameData::Species.get(body_id)
|
||||
|
||||
@id = id
|
||||
@id_number = calculate_dex_number()
|
||||
@species = @id
|
||||
@form = 0
|
||||
@real_name = calculate_name() #todo
|
||||
@real_form_name = nil
|
||||
@real_category = "???" #todo
|
||||
@real_pokedex_entry = calculate_dex_entry() #todo
|
||||
@pokedex_form = @form
|
||||
#todo type exceptions
|
||||
@type1 = @head_pokemon.type1
|
||||
@type2 = @body_pokemon.type2
|
||||
|
||||
#Stats
|
||||
@base_stats = calculate_base_stats()
|
||||
@evs = calculate_evs() #todo
|
||||
adjust_stats_with_evs()
|
||||
|
||||
@base_exp = calculate_base_exp()
|
||||
@growth_rate = calculate_growth_rate() #todo
|
||||
@gender_ratio = calculate_gender() #todo
|
||||
@catch_rate = calculate_catch_rate()
|
||||
@happiness = calculate_base_happiness()
|
||||
@moves = calculate_moveset()
|
||||
|
||||
#todo : all below
|
||||
@tutor_moves = [] # hash[:tutor_moves] || []
|
||||
@egg_moves = [] # hash[:egg_moves] || []
|
||||
@abilities = [] # hash[:abilities] || []
|
||||
@hidden_abilities = [] # hash[:hidden_abilities] || []
|
||||
@wild_item_common = [] # hash[:wild_item_common]
|
||||
@wild_item_uncommon = [] # hash[:wild_item_uncommon]
|
||||
@wild_item_rare = [] # hash[:wild_item_rare]
|
||||
@egg_groups = [:Undiscovered] # hash[:egg_groups] || [:Undiscovered]
|
||||
@hatch_steps = 1 # hash[:hatch_steps] || 1
|
||||
@incense = nil #hash[:incense]
|
||||
@evolutions = [] # hash[:evolutions] || []
|
||||
@height = 1 # hash[:height] || 1
|
||||
@weight = 1 #hash[:weight] || 1
|
||||
@color = :Red #hash[:color] || :Red
|
||||
@shape = :Head #hash[:shape] || :Head
|
||||
@habitat = :None #hash[:habitat] || :None
|
||||
@generation = 0 #hash[:generation] || 0
|
||||
@mega_stone = nil
|
||||
@mega_move = nil
|
||||
@unmega_form = 0
|
||||
@mega_message = 0
|
||||
@back_sprite_x = 0 # hash[:back_sprite_x] || 0
|
||||
@back_sprite_y = 0 # hash[:back_sprite_y] || 0
|
||||
@front_sprite_x = 0 # hash[:front_sprite_x] || 0
|
||||
@front_sprite_y = 0 # hash[:front_sprite_y] || 0
|
||||
@front_sprite_altitude = 0 # hash[:front_sprite_altitude] || 0
|
||||
@shadow_x = 0 # hash[:shadow_x] || 0
|
||||
@shadow_size = 2 # hash[:shadow_size] || 2
|
||||
@alwaysUseGeneratedSprite = false
|
||||
end
|
||||
|
||||
def get_body_id_from_symbol(id)
|
||||
return id.to_s.match(/\d+/)[0].to_i
|
||||
end
|
||||
|
||||
def get_head_id_from_symbol(id)
|
||||
return id.to_s.match(/(?<=H)\d+/)[0].to_i
|
||||
end
|
||||
|
||||
def adjust_stats_with_evs
|
||||
GameData::Stat.each_main do |s|
|
||||
@base_stats[s.id] = 1 if !@base_stats[s.id] || @base_stats[s.id] <= 0
|
||||
@evs[s.id] = 0 if !@evs[s.id] || @evs[s.id] < 0
|
||||
end
|
||||
end
|
||||
|
||||
#FUSION CALCULATIONS
|
||||
|
||||
def calculate_dex_number()
|
||||
return (@head_pokemon.id_number * NB_POKEMON) + @body_pokemon.id_number
|
||||
end
|
||||
|
||||
def calculate_base_stats()
|
||||
head_stats = @head_pokemon.base_stats
|
||||
body_stats = @body_pokemon.base_stats
|
||||
|
||||
fused_stats = {}
|
||||
|
||||
#Head dominant stats
|
||||
fused_stats[:HP] = calculate_fused_stats(head_stats[:HP], body_stats[:HP])
|
||||
fused_stats[:SPECIAL_DEFENSE] = calculate_fused_stats(head_stats[:SPECIAL_DEFENSE], body_stats[:SPECIAL_DEFENSE])
|
||||
fused_stats[:SPECIAL_ATTACK] = calculate_fused_stats(head_stats[:SPECIAL_ATTACK], body_stats[:SPECIAL_ATTACK])
|
||||
|
||||
#Body dominant stats
|
||||
fused_stats[:ATTACK] = calculate_fused_stats(body_stats[:ATTACK], head_stats[:ATTACK])
|
||||
fused_stats[:DEFENSE] = calculate_fused_stats(body_stats[:DEFENSE], head_stats[:DEFENSE])
|
||||
fused_stats[:SPEED] = calculate_fused_stats(body_stats[:SPEED], head_stats[:SPEED])
|
||||
|
||||
return fused_stats
|
||||
end
|
||||
|
||||
def calculate_base_exp()
|
||||
head_exp = @head_pokemon.base_exp
|
||||
body_exp = @body_pokemon.base_exp
|
||||
return average_values(head_exp, body_exp)
|
||||
end
|
||||
|
||||
def calculate_catch_rate
|
||||
return get_lowest_value(@body_pokemon.catch_rate, @head_pokemon.catch_rate)
|
||||
end
|
||||
|
||||
def calculate_base_happiness
|
||||
return @head_pokemon.happiness
|
||||
end
|
||||
|
||||
def calculate_moveset
|
||||
return combine_arrays(@body_pokemon.moves, @head_pokemon.moves)
|
||||
end
|
||||
|
||||
#todo
|
||||
def calculate_name()
|
||||
return @body_pokemon.name + "/" + @head_pokemon.name
|
||||
end
|
||||
|
||||
#todo
|
||||
def calculate_evs()
|
||||
return {}
|
||||
end
|
||||
|
||||
#todo
|
||||
def calculate_growth_rate
|
||||
return :Medium
|
||||
end
|
||||
|
||||
#todo
|
||||
def calculate_dex_entry
|
||||
return "this is a fused pokemon bro"
|
||||
end
|
||||
|
||||
#todo
|
||||
def calculate_gender
|
||||
return :Genderless
|
||||
end
|
||||
|
||||
#UTILS
|
||||
#
|
||||
def calculate_fused_stats(dominantStat, otherStat)
|
||||
return ((2 * dominantStat) / 3) + (otherStat / 3).floor
|
||||
end
|
||||
|
||||
def average_values(value1, value2)
|
||||
return ((value1 + value2) / 2).floor
|
||||
end
|
||||
|
||||
def average_map_values(map1, map2)
|
||||
averaged_map = map1.merge(map2) do |key, value1, value2|
|
||||
((value1 + value2) / 2.0).floor
|
||||
end
|
||||
return averaged_map
|
||||
end
|
||||
|
||||
def get_highest_value(value1, value2)
|
||||
return value1 > value2 ? value1 : value2
|
||||
end
|
||||
|
||||
def get_lowest_value(value1, value2)
|
||||
return value1 < value2 ? value1 : value2
|
||||
end
|
||||
|
||||
def combine_arrays(array1, array2)
|
||||
return array1 + array2
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -14,8 +14,8 @@
|
||||
# PokemonFusion
|
||||
#
|
||||
|
||||
NB_POKEMON = 420 #351 #aussi CONST_NB_POKE
|
||||
|
||||
NB_POKEMON = 809#420 #351 #aussi CONST_NB_POKE
|
||||
CONST_NB_POKE = NB_POKEMON
|
||||
def pbPokemonBitmapFile(species)
|
||||
# Used by the Pokédex
|
||||
# Load normal bitmap
|
||||
|
||||
@@ -146,8 +146,24 @@ def getDexNumberForSpecies(species)
|
||||
return dexNum
|
||||
end
|
||||
|
||||
def getFusedPokemonIdFromDexNum(body_dex, head_dex)
|
||||
return ("B" + body_dex.to_s + "H" + head_dex.to_s).to_sym
|
||||
end
|
||||
|
||||
def getPokemon(dexNum)
|
||||
return GameData::Species.get(dexNum)
|
||||
if dexNum.is_a?(Integer)
|
||||
if dexNum > NB_POKEMON
|
||||
body_id = getBodyID(dexNum)
|
||||
head_id = getHeadID(dexNum,body_id)
|
||||
pokemon_id = getFusedPokemonIdFromDexNum(body_id,head_id)
|
||||
else
|
||||
pokemon_id = dexNum
|
||||
end
|
||||
else
|
||||
pokemon_id = dexNum
|
||||
end
|
||||
|
||||
return GameData::Species.get(pokemon_id)
|
||||
end
|
||||
|
||||
def getSpecies(dexnum)
|
||||
@@ -238,19 +254,30 @@ def getRandomCustomFusion(returnRandomPokemonIfNoneFound = true, customPokeList
|
||||
return randPoke
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
def getBodyID(species)
|
||||
dexNum = getDexNumberForSpecies(species)
|
||||
if species.is_a?(Integer)
|
||||
dexNum = species
|
||||
else
|
||||
dexNum = getDexNumberForSpecies(species)
|
||||
end
|
||||
if dexNum % NB_POKEMON == 0
|
||||
return (dexNum / NB_POKEMON) - 1
|
||||
end
|
||||
return (dexNum / NB_POKEMON).round
|
||||
end
|
||||
|
||||
def getHeadID(species, bodyId = nil)
|
||||
if species.is_a?(Integer)
|
||||
fused_dexNum = species
|
||||
else
|
||||
fused_dexNum = getDexNumberForSpecies(species)
|
||||
end
|
||||
|
||||
if bodyId == nil
|
||||
bodyId = getBodyID(species)
|
||||
end
|
||||
fused_dexNum = getDexNumberForSpecies(species)
|
||||
body_dexNum = getDexNumberForSpecies(bodyId)
|
||||
|
||||
calculated_number = (fused_dexNum - (body_dexNum * NB_POKEMON)).round
|
||||
|
||||
@@ -1393,6 +1393,9 @@ def pbDNASplicing(pokemon, scene, supersplicers = false, superSplicer = false)
|
||||
end
|
||||
|
||||
def selectFusion(pokemon, poke2, supersplicers = false)
|
||||
p pokemon
|
||||
p poke2
|
||||
|
||||
return nil if !pokemon.is_a?(Pokemon) || !poke2.is_a?(Pokemon)
|
||||
return nil if pokemon.egg? || poke2.egg?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user