class Lairs

Constants

AVAILABLE_ENCOUNTER_LEVEL
MIN_PARTY_LEVEL_MUL

Attributes

lair_type[R]

Public Class Methods

from_hash( hash ) click to toggle source
# File lib/encounters/lairs.rb, line 36
def self.from_hash( hash )
  hash = hash.map { |k, v| [k.to_sym, v] }.to_h
  Lairs.new( hash[ :encounter_level ].to_sym, hash[ :hero_levels ], hash[ :lair_type ].to_sym )
end
new( encounter_level, hero_levels, lair_type = nil) click to toggle source

encounter_level : :easy, :medium, :hard, :deadly

# File lib/encounters/lairs.rb, line 15
def initialize( encounter_level, hero_levels, lair_type = nil)

  @encounters = Encounters.new
  @encounter_level = encounter_level
  @hero_levels = hero_levels
  check_params

  @party_xp_level = hero_levels.map{ |hl| XP_DIFFICULTY_TABLE[hl][@encounter_level] }.reduce(&:+)

  @lair_type = lair_type ? lair_type : get_available_lairs.sample
end

Public Instance Methods

encounter() click to toggle source
# File lib/encounters/lairs.rb, line 27
def encounter
  encounter_id = get_available_encounters.sample
  @encounters.by_id encounter_id
end
to_hash() click to toggle source
# File lib/encounters/lairs.rb, line 32
def to_hash
  { encounter_level: @encounter_level, hero_levels: @hero_levels, lair_type: @lair_type }
end

Private Instance Methods

check_params() click to toggle source
# File lib/encounters/lairs.rb, line 51
def check_params
  raise 'Empty party is not valid. Please provide at least one hero' if @hero_levels.empty?

  raise "Bad encounter level : #{@encounter_level.inspect}. Available encounter level : #{AVAILABLE_ENCOUNTER_LEVEL.inspect}" unless AVAILABLE_ENCOUNTER_LEVEL.include?( @encounter_level )
  raise 'Party too weak. Minimum 3 members' if @hero_levels.count < 3

  @hero_levels.each do |level|
    raise "Hero level should be an integer currently : #{level.class.to_s}" unless level.class == Integer
    raise "Bad hero level : #{level}. Should be between 1 .. 20" if level < 1 || level > 20
  end
end
get_available_encounters() click to toggle source
# File lib/encounters/lairs.rb, line 47
def get_available_encounters
  LAIRS_DATA[:lairs][@lair_type][:by_encounters_xp].select{ |k, _| k >= @party_xp_level*MIN_PARTY_LEVEL_MUL && k <= @party_xp_level }.values.flatten.uniq
end
get_available_lairs() click to toggle source
# File lib/encounters/lairs.rb, line 43
def get_available_lairs
  LAIRS_DATA[:by_xp_lair].select{ |k, _| k >= @party_xp_level*MIN_PARTY_LEVEL_MUL && k <= @party_xp_level }.values.flatten.uniq
end