class Pbw::Utils::Dice

Attributes

d[RW]
m[RW]
n[RW]

Public Class Methods

demongoize(object) click to toggle source
# File lib/pbw/utils/dice.rb, line 35
def self.demongoize(object)
  read(object.to_s)
end
evolve(object) click to toggle source
# File lib/pbw/utils/dice.rb, line 43
def self.evolve(object)
  object.mongoize if object.is_a?(::Pbw::Utils::Dice)
end
mongoize(object) click to toggle source
# File lib/pbw/utils/dice.rb, line 39
def self.mongoize(object)
  object.mongoize if object.is_a?(::Pbw::Utils::Dice)
end
new(n = 0, d = 0, m = 0) click to toggle source
# File lib/pbw/utils/dice.rb, line 25
def initialize(n = 0, d = 0, m = 0)
  @n = n
  @d = d
  @m = m
end
read(s) click to toggle source
# File lib/pbw/utils/dice.rb, line 7
def self.read(s)
  return nil if s.blank?
  begin
    a = s.include?("+") ? s.split("+") : (s.include?("-") ? s.split("-") : [s])
    b = a[0].split("d")
    n = b[0].to_i
    d = b[1].to_i
    if a.length > 1
      m = s.include?("+") ? m = a[1].to_i : m = 0 - a[1].to_i
    else
      m = 0
    end
    ::Pbw::Utils::Dice.new(n,d,m)
  rescue
    raise "Invalid dice notation"
  end
end

Public Instance Methods

+(d) click to toggle source
# File lib/pbw/utils/dice.rb, line 75
def +(d)
  if d.respond_to?(:roll)
    if d.d == self.d
      ::Pbw::Utils::Dice.new((self.n + d.n), self.d, (self.m + d.m))
    else
      ::Pbw::Utils::Dice.new((self.n), self.d, (self.m + d.average))
    end
  else
    ::Pbw::Utils::Dice.new((self.n), self.d, (self.m + d))
  end
end
-(d) click to toggle source
# File lib/pbw/utils/dice.rb, line 87
def -(d)
  if d.respond_to?(:roll)
    if d.d == self.d
      ::Pbw::Utils::Dice.new((self.n - d.n), self.d, (self.m - d.m))
    else
      ::Pbw::Utils::Dice.new((self.n), self.d, (self.m - d.average))
    end
  else
    ::Pbw::Utils::Dice.new((self.n), self.d, (self.m - d))
  end
end
<(d) click to toggle source
# File lib/pbw/utils/dice.rb, line 51
def <(d)
  if d.is_a?(Dice)
    (self.average < d.average)
  else
    (self.average < d.to_f)
  end
end
<=>(d) click to toggle source
# File lib/pbw/utils/dice.rb, line 71
def <=>(d)
  self.average <=> d.average
      end
==(d) click to toggle source
# File lib/pbw/utils/dice.rb, line 67
def ==(d)
  (self.d == d.d) && (self.n == d.n) && (self.m == d.m)
end
>(d) click to toggle source
# File lib/pbw/utils/dice.rb, line 59
def >(d)
  if d.is_a?(Dice)
    (self.average > d.average)
  else
    (self.average > d.to_f)
  end
end
average() click to toggle source
# File lib/pbw/utils/dice.rb, line 99
def average
  apd = sum_possibilities / d.to_f
  ((apd * n) + m)
end
blank?() click to toggle source
# File lib/pbw/utils/dice.rb, line 47
def blank?
  n == 0 || d == 0
end
max() click to toggle source
# File lib/pbw/utils/dice.rb, line 104
def max
  (n * d) + m
end
min() click to toggle source
# File lib/pbw/utils/dice.rb, line 108
def min
  n + m
end
mongoize() click to toggle source
# File lib/pbw/utils/dice.rb, line 31
    def mongoize
  to_s
end
probabilities() click to toggle source
# File lib/pbw/utils/dice.rb, line 122
def probabilities
  return @probabilities if @probabilities
  @probabilities = {}
  min = n
  max = n * d
  combinations = 1 * d**n

  polys = []

  (1..n).each do |r|
    polys.push(::Pbw::Utils::Polynomial.mkroll(d))
  end

  biggun = ::Pbw::Utils::Polynomial.new([1]) #identity

  polys.each do |p|
    biggun *= p
  end

  (min..max).each do |deg|
    coeff = biggun.coefficients[deg]
    if !(coeff.nil? or coeff == 0)
      px = coeff.to_f / combinations.to_f
      @probabilities[(deg + m)] = px
    end
  end
  @probabilities
end
roll() click to toggle source
# File lib/pbw/utils/dice.rb, line 112
def roll
  t = 0
  n.times{ t += (rand(d) + 1)}
  t + m
end
to_s() click to toggle source
# File lib/pbw/utils/dice.rb, line 118
def to_s
  m == 0 ? "#{self.n}d#{self.d}" : (m > 0 ? "#{self.n}d#{self.d}+#{self.m}" : "#{self.n}d#{self.d}-#{self.m.abs}")
end

Private Instance Methods

sum_possibilities() click to toggle source
# File lib/pbw/utils/dice.rb, line 152
def sum_possibilities
  t = 0
  d.times{|x| t += (x+1)}
  t
end