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 :base_exp
attr_reader :growth_rate
attr_reader :gender_rate
attr_reader :gender_ratio
attr_reader :catch_rate
attr_reader :happiness
attr_reader :moves
@@ -119,7 +119,7 @@ module GameData
ret["InternalName"] = [0, "n"]
ret["Name"] = [0, "s"]
ret["GrowthRate"] = [0, "e", :PBGrowthRates]
ret["GenderRate"] = [0, "e", :PBGenderRates]
ret["GenderRate"] = [0, "e", :GenderRatio]
ret["Incense"] = [0, "e", :Item]
ret["Evolutions"] = [0, "*ses", nil, :PBEvolution, nil]
end
@@ -142,7 +142,7 @@ module GameData
@evs = hash[:evs] || [0, 0, 0, 0, 0, 0]
@base_exp = hash[:base_exp] || 100
@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
@happiness = hash[:happiness] || 70
@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)
def gender
if !@gender
gender_rate = species_data.gender_rate
case gender_rate
when PBGenderRates::AlwaysMale then @gender = 0
when PBGenderRates::AlwaysFemale then @gender = 1
when PBGenderRates::Genderless then @gender = 2
gender_ratio = species_data.gender_ratio
case gender_ratio
when :AlwaysMale then @gender = 0
when :AlwaysFemale then @gender = 1
when :Genderless then @gender = 2
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
return @gender
@@ -350,9 +351,8 @@ class Pokemon
# @return [Boolean] whether this Pokémon species is restricted to only ever being one
# gender (or genderless)
def singleGendered?
gender_rate = species_data.gender_rate
return [PBGenderRates::AlwaysMale, PBGenderRates::AlwaysFemale,
PBGenderRates::Genderless].include?(gender_rate)
gender_ratio = species_data.gender_ratio
return [:AlwaysMale, :AlwaysFemale, :Genderless].include?(gender_ratio)
end
alias isSingleGendered? singleGendered?

View File

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

View File

@@ -598,9 +598,8 @@ DebugMenuCommands.register("fillboxes", {
if f == 0
$Trainer.set_seen(sp)
$Trainer.set_owned(sp)
if [PBGenderRates::AlwaysMale, PBGenderRates::AlwaysFemale,
PBGenderRates::Genderless].include?(species_data.gender_rate)
g = (species_data.gender_rate == PBGenderRates::AlwaysFemale) ? 1 : 0
if [:AlwaysMale, :AlwaysFemale, :Genderless].include?(species_data.gender_ratio)
g = (species_data.gender_ratio == :AlwaysFemale) ? 1 : 0
$Trainer.seen_forms[sp][g][f] = true
$Trainer.last_seen_forms[sp] = [g, f] if f == 0
else # Both male and female
@@ -609,7 +608,7 @@ DebugMenuCommands.register("fillboxes", {
$Trainer.last_seen_forms[sp] = [0, f] if f == 0
end
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
end
# 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("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("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("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.")],
@@ -1027,7 +1027,7 @@ def pbPokemonEditor
spec.evs.clone,
spec.base_exp,
spec.growth_rate,
spec.gender_rate,
spec.gender_ratio,
spec.catch_rate,
spec.happiness,
moves,
@@ -1084,7 +1084,7 @@ def pbPokemonEditor
:evs => data[8],
:base_exp => data[9],
:growth_rate => data[10],
:gender_rate => data[11],
:gender_ratio => data[11],
:catch_rate => data[12],
:happiness => data[13],
:moves => data[14],

View File

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

View File

@@ -273,7 +273,7 @@ module Compiler
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("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("BaseEXP = %d\r\n", species.base_exp))
f.write(sprintf("EffortPoints = %s\r\n", species.evs.join(",")))