class Oakdex::Pokemon::Factory

Creates Pokemon instance and prefills attributes

Constants

OPTIONAL_ATTRIBUTES
REQUIRED_ATTRIBUTES

Public Class Methods

create(species, options = {}) click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 16
def create(species, options = {})
  factory = new(species, options)
  attributes = Hash[(REQUIRED_ATTRIBUTES +
    OPTIONAL_ATTRIBUTES).map do |attr|
                      [attr, factory.send(attr)]
                    end]
  Pokemon.new(species.names['en'], attributes)
end
new(species, options = {}) click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 26
def initialize(species, options = {})
  @species = species
  @options = options
end

Private Instance Methods

abilities() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 100
def abilities
  @species.abilities.select { |a| !a['hidden'] && !a['mega'] }
end
ability_id() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 92
def ability_id
  if @options[:ability_id]
    @options[:ability_id]
  else
    abilities.sample['name']
  end
end
additional_moves() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 78
def additional_moves
  return [] unless @options[:additional_moves]
  @options[:additional_moves].map do |move_name|
    move_type = Oakdex::Pokedex::Move.find!(move_name)
    Move.new(move_type, move_type.pp, move_type.pp)
  end
end
amie() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 53
def amie
  @options[:amie]
end
available_moves() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 86
def available_moves
  @species.learnset.map do |m|
    m['move'] if m['level'] && m['level'] <= level
  end.compact
end
calculate_gender() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 146
def calculate_gender
  if rand(1..1000) <= @species.gender_ratios['male'] * 10
    'male'
  else
    'female'
  end
end
ev() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 133
def ev
  return @options[:ev] if @options[:ev]
  @ev ||= Hash[Pokemon::BATTLE_STATS.map do |stat|
    [stat, 0]
  end]
end
exp() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 104
def exp
  @options[:exp] || Stat.exp_by_level(
    @species.leveling_rate,
    @options[:level]
  )
end
friendship() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 45
def friendship
  @options[:friendship] || @species.base_friendship
end
gender() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 140
def gender
  return @options[:gender] if @options[:gender]
  return 'neuter' unless @species.gender_ratios
  calculate_gender
end
generate_available_moves() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 71
def generate_available_moves
  available_moves.sample(4).map do |move_name|
    move_type = Oakdex::Pokedex::Move.find!(move_name)
    Move.new(move_type, move_type.pp, move_type.pp)
  end
end
hp() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 115
def hp
  return @options[:hp] if @options[:hp]
  Stat.initial_stat(:hp,
                    level: level,
                    iv: iv,
                    ev: ev,
                    base_stats: @species.base_stats,
                    nature: nature
                   )
end
item_id() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 49
def item_id
  @options[:item_id]
end
iv() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 126
def iv
  return @options[:iv] if @options[:iv]
  @iv ||= Hash[Pokemon::BATTLE_STATS.map do |stat|
    [stat, rand(0..31)]
  end]
end
level() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 111
def level
  Stat.level_by_exp(@species.leveling_rate, exp)
end
moves() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 57
def moves
  if @options[:moves]
    @options[:moves].map do |move_data|
      Move.new(
        Oakdex::Pokedex::Move.find!(move_data[0]),
        move_data[1],
        move_data[2]
      )
    end
  else
    (generate_available_moves + additional_moves).take(4)
  end
end
nature() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 162
def nature
  @nature ||= Oakdex::Pokedex::Nature.find!(nature_id)
end
nature_id() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 154
def nature_id
  @nature_id ||= if @options[:nature_id]
                   @options[:nature_id]
                 else
                   Oakdex::Pokedex::Nature.all.values.sample.names['en']
                 end
end
original_trainer() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 37
def original_trainer
  @options[:original_trainer]
end
primary_status_condition() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 33
def primary_status_condition
  @options[:primary_status_condition]
end
wild() click to toggle source
# File lib/oakdex/pokemon/factory.rb, line 41
def wild
  @options[:wild]
end