dieroll 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/dieroll ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Dice rolling program
4
+ # by Brian Towle -- March 2012
5
+
6
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
7
+ require 'dieroll'
8
+ require 'optparse'
9
+
10
+ usage_string = "Usage: roll [-r] <roll-string>"
11
+
12
+ options = {}
13
+ OptionParser.new do |opts|
14
+ opts.banner = usage_string
15
+
16
+ options[:results] = false
17
+ opts.on('-r','--results','Show full roll results' ) do
18
+ options[:results] = true
19
+ end
20
+
21
+ opts.on('-h','--help','Display this screen') do
22
+ puts opts
23
+ exit
24
+ end
25
+
26
+ end.parse!
27
+
28
+ if(!!ARGV.first)
29
+ dice = Dieroll::Roller.new(ARGV.first)
30
+ else
31
+ abort(usage_string)
32
+ end
33
+
34
+ dice.roll!
35
+ if options[:results]
36
+ puts dice.report
37
+ else
38
+ puts dice.total
39
+ end
@@ -0,0 +1,51 @@
1
+ module Dieroll
2
+ class DiceSet
3
+
4
+ def initialize(number_of_dice, sides, sign='+', drop_string)
5
+ @number_of_dice, @sides, @sign = number_of_dice, sides, sign
6
+ @drop_string = drop_string
7
+ @drops = @drop_string.scan(/[l|h]/) if !!@drop_string
8
+ @dice = []
9
+
10
+ @number_of_dice.times do
11
+ @dice << Dieroll::Die.new(@sides)
12
+ end
13
+
14
+ @last_result = []
15
+ @last_total = nil
16
+ end
17
+
18
+ def roll!
19
+ @last_result = []
20
+ @dice.each do |die|
21
+ @last_result << die.roll!
22
+ end
23
+
24
+ @last_result.sort!
25
+ @last_non_dropped = @last_result.dup
26
+ if !!@drops
27
+ @drops.each do |drop|
28
+ @last_non_dropped.shift if drop == 'l'
29
+ @last_non_dropped.pop if drop == 'h'
30
+ end
31
+ end
32
+
33
+ @last_total = @last_non_dropped.inject(0){|sum, element| sum + element}
34
+ @last_total *= -1 if @sign == '-'
35
+
36
+ @last_total
37
+ end
38
+
39
+ def to_s
40
+ output = "#{@sign}#{@number_of_dice}d#{@sides}"
41
+ output += "/#{@drop_string}" if !!@drop_string
42
+ output += ": "
43
+ @dice.each do |die|
44
+ output += die.to_s + " "
45
+ end
46
+
47
+ output
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,19 @@
1
+ module Dieroll
2
+ class Die
3
+
4
+ def initialize(sides)
5
+ @sides = sides
6
+ @last_result = nil
7
+ end
8
+
9
+ def roll!
10
+ @last_result = rand(1..@sides)
11
+
12
+ @last_result
13
+ end
14
+
15
+ def to_s
16
+ "#{@last_result}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Dieroll
2
+ class Result
3
+ attr_reader :total, :dice, :sides, :string
4
+
5
+ # Create result object
6
+ def initialize(sides, dice)
7
+ @sides, @dice = sides, dice
8
+ @total = dice.inject(0) { |sum, x| sum + x }
9
+ @string = "#{@dice.count}d#{@sides}"
10
+ end
11
+
12
+ # Return result as string
13
+ def to_s
14
+ "#{@total}:#{@string}:#{@dice.join(",")}"
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,124 @@
1
+ module::Dieroll
2
+ class Roller
3
+
4
+ attr_reader :total
5
+
6
+ # Roll 1dX
7
+ def self.d(sides)
8
+ rand(1..sides)
9
+ end
10
+
11
+ # Roll arbitrary 'XdY+Z' string
12
+ def self.from_string(string)
13
+ rolls = [0]
14
+ sets = s_to_set(string)
15
+ sets.each do |set|
16
+ if(set.respond_to?(:count) && set.count == 4)
17
+ rolls << roll(set[0], set[1])
18
+ rolls[0] += rolls.last.total if set[2] == '+'
19
+ rolls[0] -= rolls.last.total if set[2] == '-'
20
+ elsif
21
+ rolls[0] += set
22
+ end
23
+ end
24
+
25
+ rolls
26
+ end
27
+
28
+ # Create roller object
29
+ def initialize(string)
30
+ @string = string
31
+ @sets = Roller.s_to_set(string)
32
+
33
+ @dice_sets = []
34
+ @mods = []
35
+ @total = 0
36
+
37
+ @sets.each do |set|
38
+ if(set.respond_to?(:count))
39
+ @dice_sets << Dieroll::DiceSet.new(set[0], set[1],
40
+ set[2], set[3])
41
+ else
42
+ @mods << set
43
+ end
44
+ end
45
+ end
46
+
47
+ # Determine results of roll
48
+ def roll!
49
+ @total = 0
50
+ @dice_sets.each do |set|
51
+ @total += set.roll!
52
+ end
53
+ @mods.each do |mod|
54
+ @total += mod
55
+ end
56
+
57
+ @total
58
+ end
59
+
60
+ # Return roll result as string
61
+ def report
62
+ output = "#{@total}\n"
63
+ output += "#{@string}:\n"
64
+ @dice_sets.each do |set|
65
+ output += "#{set.to_s}\n"
66
+ end
67
+ @mods.each do |mod|
68
+ output += "+" if mod >= 0
69
+ output += "#{mod}\n"
70
+ end
71
+
72
+ output
73
+ end
74
+
75
+ def to_s
76
+ "#{@total}"
77
+ end
78
+
79
+ def string=(string)
80
+ @string = string
81
+ initialize(@string)
82
+ end
83
+
84
+ private
85
+
86
+ def self.roll(num, sides)
87
+ total = 0
88
+ dice = []
89
+ num.times do
90
+ dice << d(sides)
91
+ end
92
+ Dieroll::Result.new(sides, dice)
93
+ end
94
+
95
+ def self.s_to_set(str)
96
+ sets = []
97
+ set_strings = str.scan(/^[^+|-]+|[+|-][^+|-]+/)
98
+
99
+ set_strings.each do |set_string|
100
+ set_string =~ /^([^\/]+)\/?([^\/]*)$/
101
+ set_string, drop_string = $1, $2
102
+ drop_string = nil if drop_string.empty?
103
+
104
+ set_string =~ /^([+|-]?)(\d+)(d\d+)?/
105
+ sign, num, sides = $1, $2, $3
106
+ sign = '+' if sign.empty?
107
+
108
+ set = []
109
+ if(!!sides)
110
+ sides.delete! "d"
111
+ set = [num.to_i, sides.to_i, sign, drop_string]
112
+ else
113
+ set = num.to_i
114
+ set *= -1 if sign == '-'
115
+ end
116
+
117
+ sets << set
118
+ end
119
+
120
+ sets
121
+ end
122
+
123
+ end
124
+ end
data/lib/dieroll.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'dieroll/roller'
2
+ require 'dieroll/result'
3
+ require 'dieroll/die'
4
+ require 'dieroll/diceset'
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dieroll
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Brian Towle
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-17 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Dieroll allows for rolling dice described by 'XdY+Z' strings
15
+ email:
16
+ executables:
17
+ - dieroll
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/dieroll/roller.rb
22
+ - lib/dieroll/result.rb
23
+ - lib/dieroll/diceset.rb
24
+ - lib/dieroll/die.rb
25
+ - lib/dieroll.rb
26
+ - !binary |-
27
+ YmluL2RpZXJvbGw=
28
+ homepage: https://github.com/btowle/dieroll
29
+ licenses: []
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 1.8.17
49
+ signing_key:
50
+ specification_version: 3
51
+ summary: Simple dice rolling script
52
+ test_files: []