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 +39 -0
- data/lib/dieroll/diceset.rb +51 -0
- data/lib/dieroll/die.rb +19 -0
- data/lib/dieroll/result.rb +18 -0
- data/lib/dieroll/roller.rb +124 -0
- data/lib/dieroll.rb +4 -0
- metadata +52 -0
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
|
data/lib/dieroll/die.rb
ADDED
|
@@ -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
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: []
|