dieroll 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []