Added class GameData::GenderRatio

This commit is contained in:
Maruno17
2021-02-06 23:11:48 +00:00
parent 2e125019a9
commit eda301b57b
9 changed files with 141 additions and 93 deletions

View File

@@ -15,7 +15,7 @@ module GameData
attr_reader :evs attr_reader :evs
attr_reader :base_exp attr_reader :base_exp
attr_reader :growth_rate attr_reader :growth_rate
attr_reader :gender_rate attr_reader :gender_ratio
attr_reader :catch_rate attr_reader :catch_rate
attr_reader :happiness attr_reader :happiness
attr_reader :moves attr_reader :moves
@@ -119,7 +119,7 @@ module GameData
ret["InternalName"] = [0, "n"] ret["InternalName"] = [0, "n"]
ret["Name"] = [0, "s"] ret["Name"] = [0, "s"]
ret["GrowthRate"] = [0, "e", :PBGrowthRates] ret["GrowthRate"] = [0, "e", :PBGrowthRates]
ret["GenderRate"] = [0, "e", :PBGenderRates] ret["GenderRate"] = [0, "e", :GenderRatio]
ret["Incense"] = [0, "e", :Item] ret["Incense"] = [0, "e", :Item]
ret["Evolutions"] = [0, "*ses", nil, :PBEvolution, nil] ret["Evolutions"] = [0, "*ses", nil, :PBEvolution, nil]
end end
@@ -142,7 +142,7 @@ module GameData
@evs = hash[:evs] || [0, 0, 0, 0, 0, 0] @evs = hash[:evs] || [0, 0, 0, 0, 0, 0]
@base_exp = hash[:base_exp] || 100 @base_exp = hash[:base_exp] || 100
@growth_rate = hash[:growth_rate] || PBGrowthRates::Medium @growth_rate = hash[:growth_rate] || PBGrowthRates::Medium
@gender_rate = hash[:gender_rate] || PBGenderRates::Female50Percent @gender_ratio = hash[:gender_ratio] || :Female50Percent
@catch_rate = hash[:catch_rate] || 255 @catch_rate = hash[:catch_rate] || 255
@happiness = hash[:happiness] || 70 @happiness = hash[:happiness] || 70
@moves = hash[:moves] || [] @moves = hash[:moves] || []

View File

@@ -0,0 +1,75 @@
# If a Pokémon's gender ratio is none of :AlwaysMale, :AlwaysFemale or
# :Genderless, then it will choose a random number between 0 and 255 inclusive,
# and compare it to the @female_chance. If the random number is lower than this
# chance, it will be female; otherwise, it will be male.
module GameData
class GenderRatio
attr_reader :id
attr_reader :real_name
attr_reader :female_chance
DATA = {}
extend ClassMethodsSymbols
include InstanceMethods
def self.load; end
def self.save; end
def initialize(hash)
@id = hash[:id]
@real_name = hash[:name] || "Unnamed"
@female_chance = hash[:female_chance]
end
# @return [String] the translated name of this gender ratio
def name
return _INTL(@real_name)
end
end
end
GameData::GenderRatio.register({
:id => :AlwaysMale,
:name => _INTL("Always Male")
})
GameData::GenderRatio.register({
:id => :AlwaysFemale,
:name => _INTL("Always Female")
})
GameData::GenderRatio.register({
:id => :Genderless,
:name => _INTL("Genderless")
})
GameData::GenderRatio.register({
:id => :FemaleOneEighth,
:name => _INTL("Female One Eighth"),
:female_chance => 32
})
GameData::GenderRatio.register({
:id => :Female25Percent,
:name => _INTL("Female 25 Percent"),
:female_chance => 64
})
GameData::GenderRatio.register({
:id => :Female50Percent,
:name => _INTL("Female 50 Percent"),
:female_chance => 128
})
GameData::GenderRatio.register({
:id => :Female75Percent,
:name => _INTL("Female 75 Percent"),
:female_chance => 192
})
GameData::GenderRatio.register({
:id => :FemaleSevenEighths,
:name => _INTL("Female Seven Eighths"),
:female_chance => 224
})

View File

@@ -1,26 +0,0 @@
module PBGenderRates
Genderless = 0
AlwaysMale = 1
FemaleOneEighth = 2
Female25Percent = 3
Female50Percent = 4
Female75Percent = 5
FemaleSevenEighths = 6
AlwaysFemale = 7
def self.maxValue; return 7; end
def self.genderByte(gender)
case gender
when AlwaysMale then return 0
when FemaleOneEighth then return 32
when Female25Percent then return 64
when Female50Percent then return 128
when Female75Percent then return 192
when FemaleSevenEighths then return 224
when AlwaysFemale then return 254
when Genderless then return 255
end
return 255 # Default value (genderless)
end
end

View File

@@ -310,13 +310,14 @@ class Pokemon
# @return [0, 1, 2] this Pokémon's gender (0 = male, 1 = female, 2 = genderless) # @return [0, 1, 2] this Pokémon's gender (0 = male, 1 = female, 2 = genderless)
def gender def gender
if !@gender if !@gender
gender_rate = species_data.gender_rate gender_ratio = species_data.gender_ratio
case gender_rate case gender_ratio
when PBGenderRates::AlwaysMale then @gender = 0 when :AlwaysMale then @gender = 0
when PBGenderRates::AlwaysFemale then @gender = 1 when :AlwaysFemale then @gender = 1
when PBGenderRates::Genderless then @gender = 2 when :Genderless then @gender = 2
else else
@gender = ((@personalID & 0xFF) < PBGenderRates.genderByte(gender_rate)) ? 1 : 0 female_chance = GameData::GenderRatio.get(gender_ratio).female_chance
@gender = ((@personalID & 0xFF) < female_chance) ? 1 : 0
end end
end end
return @gender return @gender
@@ -350,9 +351,8 @@ class Pokemon
# @return [Boolean] whether this Pokémon species is restricted to only ever being one # @return [Boolean] whether this Pokémon species is restricted to only ever being one
# gender (or genderless) # gender (or genderless)
def singleGendered? def singleGendered?
gender_rate = species_data.gender_rate gender_ratio = species_data.gender_ratio
return [PBGenderRates::AlwaysMale, PBGenderRates::AlwaysFemale, return [:AlwaysMale, :AlwaysFemale, :Genderless].include?(gender_ratio)
PBGenderRates::Genderless].include?(gender_rate)
end end
alias isSingleGendered? singleGendered? alias isSingleGendered? singleGendered?

View File

@@ -150,11 +150,11 @@ class PokemonPokedexInfo_Scene
next if sp.pokedex_form != sp.form next if sp.pokedex_form != sp.form
multiple_forms = true if sp.form > 0 multiple_forms = true if sp.form > 0
$Trainer.seen_forms[@species] = [[], []] if !$Trainer.seen_forms[@species] $Trainer.seen_forms[@species] = [[], []] if !$Trainer.seen_forms[@species]
case sp.gender_rate case sp.gender_ratio
when PBGenderRates::AlwaysMale, PBGenderRates::AlwaysFemale, PBGenderRates::Genderless when :AlwaysMale, :AlwaysFemale, :Genderless
real_gender = (sp.gender_rate == PBGenderRates::AlwaysFemale) ? 1 : 0 real_gender = (sp.gender_ratio == :AlwaysFemale) ? 1 : 0
next if !$Trainer.seen_forms[@species][real_gender][sp.form] && !Settings::DEX_SHOWS_ALL_FORMS next if !$Trainer.seen_forms[@species][real_gender][sp.form] && !Settings::DEX_SHOWS_ALL_FORMS
real_gender = 2 if sp.gender_rate == PBGenderRates::Genderless real_gender = 2 if sp.gender_ratio == :Genderless
ret.push([sp.form_name, real_gender, sp.form]) ret.push([sp.form_name, real_gender, sp.form])
else # Both male and female else # Both male and female
for real_gender in 0...2 for real_gender in 0...2

View File

@@ -598,9 +598,8 @@ DebugMenuCommands.register("fillboxes", {
if f == 0 if f == 0
$Trainer.set_seen(sp) $Trainer.set_seen(sp)
$Trainer.set_owned(sp) $Trainer.set_owned(sp)
if [PBGenderRates::AlwaysMale, PBGenderRates::AlwaysFemale, if [:AlwaysMale, :AlwaysFemale, :Genderless].include?(species_data.gender_ratio)
PBGenderRates::Genderless].include?(species_data.gender_rate) g = (species_data.gender_ratio == :AlwaysFemale) ? 1 : 0
g = (species_data.gender_rate == PBGenderRates::AlwaysFemale) ? 1 : 0
$Trainer.seen_forms[sp][g][f] = true $Trainer.seen_forms[sp][g][f] = true
$Trainer.last_seen_forms[sp] = [g, f] if f == 0 $Trainer.last_seen_forms[sp] = [g, f] if f == 0
else # Both male and female else # Both male and female
@@ -609,7 +608,7 @@ DebugMenuCommands.register("fillboxes", {
$Trainer.last_seen_forms[sp] = [0, f] if f == 0 $Trainer.last_seen_forms[sp] = [0, f] if f == 0
end end
elsif species_data.real_form_name && !species_data.real_form_name.empty? elsif species_data.real_form_name && !species_data.real_form_name.empty?
g = (species_data.gender_rate == PBGenderRates::AlwaysFemale) ? 1 : 0 g = (species_data.gender_ratio == :AlwaysFemale) ? 1 : 0
$Trainer.seen_forms[sp][g][f] = true $Trainer.seen_forms[sp][g][f] = true
end end
# Add Pokémon (if form 0) # Add Pokémon (if form 0)

View File

@@ -959,7 +959,7 @@ def pbPokemonEditor
[_INTL("EffortPoints"), EffortValuesProperty, _INTL("Effort Value points earned when this species is defeated.")], [_INTL("EffortPoints"), EffortValuesProperty, _INTL("Effort Value points earned when this species is defeated.")],
[_INTL("BaseEXP"), LimitProperty.new(9999), _INTL("Base experience earned when this species is defeated.")], [_INTL("BaseEXP"), LimitProperty.new(9999), _INTL("Base experience earned when this species is defeated.")],
[_INTL("GrowthRate"), EnumProperty2.new(PBGrowthRates), _INTL("Pokémon's growth rate.")], [_INTL("GrowthRate"), EnumProperty2.new(PBGrowthRates), _INTL("Pokémon's growth rate.")],
[_INTL("GenderRate"), EnumProperty2.new(PBGenderRates), _INTL("Proportion of males to females for this species.")], [_INTL("GenderRate"), GameDataProperty.new(:GenderRatio), _INTL("Proportion of males to females for this species.")],
[_INTL("Rareness"), LimitProperty.new(255), _INTL("Catch rate of this species (0-255).")], [_INTL("Rareness"), LimitProperty.new(255), _INTL("Catch rate of this species (0-255).")],
[_INTL("Happiness"), LimitProperty.new(255), _INTL("Base happiness of this species (0-255).")], [_INTL("Happiness"), LimitProperty.new(255), _INTL("Base happiness of this species (0-255).")],
[_INTL("Moves"), MovePoolProperty, _INTL("Moves which the Pokémon learns while levelling up.")], [_INTL("Moves"), MovePoolProperty, _INTL("Moves which the Pokémon learns while levelling up.")],
@@ -1027,7 +1027,7 @@ def pbPokemonEditor
spec.evs.clone, spec.evs.clone,
spec.base_exp, spec.base_exp,
spec.growth_rate, spec.growth_rate,
spec.gender_rate, spec.gender_ratio,
spec.catch_rate, spec.catch_rate,
spec.happiness, spec.happiness,
moves, moves,
@@ -1084,7 +1084,7 @@ def pbPokemonEditor
:evs => data[8], :evs => data[8],
:base_exp => data[9], :base_exp => data[9],
:growth_rate => data[10], :growth_rate => data[10],
:gender_rate => data[11], :gender_ratio => data[11],
:catch_rate => data[12], :catch_rate => data[12],
:happiness => data[13], :happiness => data[13],
:moves => data[14], :moves => data[14],

View File

@@ -459,7 +459,7 @@ module Compiler
:evs => contents["EffortPoints"], :evs => contents["EffortPoints"],
:base_exp => contents["BaseEXP"], :base_exp => contents["BaseEXP"],
:growth_rate => contents["GrowthRate"], :growth_rate => contents["GrowthRate"],
:gender_rate => contents["GenderRate"], :gender_ratio => contents["GenderRate"],
:catch_rate => contents["Rareness"], :catch_rate => contents["Rareness"],
:happiness => contents["Happiness"], :happiness => contents["Happiness"],
:moves => contents["Moves"], :moves => contents["Moves"],

View File

@@ -273,7 +273,7 @@ module Compiler
f.write(sprintf("Type1 = %s\r\n", species.type1)) f.write(sprintf("Type1 = %s\r\n", species.type1))
f.write(sprintf("Type2 = %s\r\n", species.type2)) if species.type2 != species.type1 f.write(sprintf("Type2 = %s\r\n", species.type2)) if species.type2 != species.type1
f.write(sprintf("BaseStats = %s\r\n", species.base_stats.join(","))) f.write(sprintf("BaseStats = %s\r\n", species.base_stats.join(",")))
f.write(sprintf("GenderRate = %s\r\n", getConstantName(PBGenderRates, species.gender_rate))) f.write(sprintf("GenderRate = %s\r\n", species.gender_ratio))
f.write(sprintf("GrowthRate = %s\r\n", getConstantName(PBGrowthRates, species.growth_rate))) f.write(sprintf("GrowthRate = %s\r\n", getConstantName(PBGrowthRates, species.growth_rate)))
f.write(sprintf("BaseEXP = %d\r\n", species.base_exp)) f.write(sprintf("BaseEXP = %d\r\n", species.base_exp))
f.write(sprintf("EffortPoints = %s\r\n", species.evs.join(","))) f.write(sprintf("EffortPoints = %s\r\n", species.evs.join(",")))