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