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