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:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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?
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Data/items.dat
BIN
Data/items.dat
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user