dicebag 3.2.0 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dicebag.rb +31 -40
- data/lib/dicebag/parser.rb +4 -17
- data/lib/dicebag/roll_part_string.rb +15 -14
- data/lib/dicebag/roll_string.rb +17 -10
- data/lib/dicebag/transform.rb +14 -19
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc6f9c347f892aeb166fcae63db74f852f4f78d5
|
4
|
+
data.tar.gz: 4b719b9fa625bef4c4cc5a9bf531249d1cd366b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78bf99b571914d1a28c26f964cdaf23ffbdb1bbb923527bacf1f613785f46b82cbfba283471cc080bdcc53a5c95263550472294ee4e3c22f6e5eaa77d3907769
|
7
|
+
data.tar.gz: da473d03f4524f4e0824d02b2875b705a2ef41c5254f6ad002ec1816696f2d78e348a5fe1ed3b636199b91587e6d8da4614b5d70f2ec6f2e67eedf03b84d8b03
|
data/lib/dicebag.rb
CHANGED
@@ -40,32 +40,16 @@ module DiceBag
|
|
40
40
|
# happens in the Roll class. It will convert all
|
41
41
|
# values into the correct *Part class.
|
42
42
|
def self.normalize_tree(tree)
|
43
|
-
tree.
|
44
|
-
case part
|
45
|
-
when Hash
|
46
|
-
normalize_hash part
|
47
|
-
when Array
|
48
|
-
normalize_array part
|
49
|
-
else
|
50
|
-
part
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.normalize_hash(part)
|
56
|
-
return [:label, LabelPart.new(part[:label])] if part.key? :label
|
57
|
-
|
58
|
-
if part.key? :start
|
59
|
-
xdx = normalize_xdx(part[:start])
|
43
|
+
tree = [tree] unless tree.first.is_a? Array
|
60
44
|
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
part
|
45
|
+
tree.map { |part| normalize part }
|
65
46
|
end
|
66
47
|
|
67
|
-
def self.
|
68
|
-
[
|
48
|
+
def self.normalize(part)
|
49
|
+
[
|
50
|
+
normalize_op(part.first),
|
51
|
+
normalize_value(part.last)
|
52
|
+
]
|
69
53
|
end
|
70
54
|
|
71
55
|
def self.normalize_op(op)
|
@@ -84,40 +68,47 @@ module DiceBag
|
|
84
68
|
end
|
85
69
|
|
86
70
|
def self.normalize_value(val)
|
87
|
-
|
71
|
+
case val
|
72
|
+
when String
|
73
|
+
LabelPart.new val
|
74
|
+
when Hash
|
75
|
+
RollPart.new normalize_xdx(val)
|
76
|
+
else
|
77
|
+
StaticPart.new val
|
78
|
+
end
|
88
79
|
end
|
89
80
|
|
90
81
|
# This further massages the xDx hashes.
|
91
|
-
def self.normalize_xdx(
|
92
|
-
count =
|
93
|
-
sides =
|
82
|
+
def self.normalize_xdx(hash)
|
83
|
+
count = hash[:xdx][:count]
|
84
|
+
sides = hash[:xdx][:sides]
|
94
85
|
|
95
86
|
# Delete the no longer needed :xdx key.
|
96
|
-
|
87
|
+
hash.delete(:xdx)
|
97
88
|
|
98
89
|
# Default to at least 1 die.
|
99
90
|
count = 1 if count.zero? || count.nil?
|
100
91
|
|
101
92
|
# Set the :count and :sides keys directly
|
102
93
|
# and set the notes array.
|
103
|
-
|
104
|
-
|
105
|
-
|
94
|
+
hash[:count] = count
|
95
|
+
hash[:sides] = sides
|
96
|
+
hash[:notes] = []
|
106
97
|
|
107
|
-
normalize_options
|
98
|
+
normalize_options hash
|
108
99
|
end
|
109
100
|
|
110
|
-
def self.normalize_options(
|
111
|
-
if
|
112
|
-
|
101
|
+
def self.normalize_options(hash)
|
102
|
+
if hash[:options].empty?
|
103
|
+
hash.delete(:options)
|
113
104
|
else
|
114
|
-
normalize_explode
|
115
|
-
normalize_reroll
|
116
|
-
normalize_drop_keep
|
117
|
-
normalize_target
|
105
|
+
normalize_explode hash
|
106
|
+
normalize_reroll hash
|
107
|
+
normalize_drop_keep hash
|
108
|
+
normalize_target hash
|
118
109
|
end
|
119
110
|
|
120
|
-
|
111
|
+
hash
|
121
112
|
end
|
122
113
|
|
123
114
|
# Prevent Explosion abuse.
|
data/lib/dicebag/parser.rb
CHANGED
@@ -5,16 +5,6 @@ module DiceBag
|
|
5
5
|
# components. To understand this code, please refer to
|
6
6
|
# the Parslet library's documentation.
|
7
7
|
class Parser < Parslet::Parser
|
8
|
-
# We override the #parse method, so that we can
|
9
|
-
# assure that we always return an Array.
|
10
|
-
def parse(dstr)
|
11
|
-
result = super dstr
|
12
|
-
|
13
|
-
result = [result] unless result.is_a? Array
|
14
|
-
|
15
|
-
result
|
16
|
-
end
|
17
|
-
|
18
8
|
# Base rules.
|
19
9
|
rule(:space?) { str(' ').repeat }
|
20
10
|
|
@@ -64,10 +54,11 @@ module DiceBag
|
|
64
54
|
# This allows options to be defined in any order and
|
65
55
|
# even have more than one of the same option, however
|
66
56
|
# only the last option of a given key will be kept.
|
67
|
-
rule(:
|
68
|
-
|
57
|
+
rule(:option) do
|
58
|
+
(drop | explode | keep | reroll | target)
|
69
59
|
end
|
70
60
|
|
61
|
+
rule(:options) { space? >> option.repeat >> space? }
|
71
62
|
rule(:options?) { options.maybe.as(:options) }
|
72
63
|
|
73
64
|
# Part Operators.
|
@@ -81,11 +72,7 @@ module DiceBag
|
|
81
72
|
# A part is an operator, followed by either an xDx
|
82
73
|
# string or a static number value.
|
83
74
|
rule(:part) do
|
84
|
-
space? >>
|
85
|
-
op >>
|
86
|
-
space? >>
|
87
|
-
(xdx | number).as(:value) >>
|
88
|
-
space?
|
75
|
+
space? >> op >> space? >> (xdx | number).as(:value) >> space?
|
89
76
|
end
|
90
77
|
|
91
78
|
# All parts of a dice roll MUST start with an xDx
|
@@ -7,8 +7,7 @@ module RollPartString
|
|
7
7
|
# string. Optionally, passing true to the method will
|
8
8
|
# remove spaces form the finished string.
|
9
9
|
def to_s(no_spaces = false)
|
10
|
-
@
|
11
|
-
@space = (no_spaces ? '' : ' ')
|
10
|
+
@parts = []
|
12
11
|
|
13
12
|
to_s_xdx
|
14
13
|
to_s_explode
|
@@ -17,7 +16,9 @@ module RollPartString
|
|
17
16
|
to_s_reroll
|
18
17
|
to_s_target
|
19
18
|
|
20
|
-
|
19
|
+
join_str = no_spaces ? '' : ' '
|
20
|
+
|
21
|
+
@parts.join join_str
|
21
22
|
end
|
22
23
|
|
23
24
|
private
|
@@ -26,38 +27,38 @@ module RollPartString
|
|
26
27
|
c = count.zero? ? '' : count.to_s
|
27
28
|
s = sides.to_s
|
28
29
|
|
29
|
-
@
|
30
|
+
@parts.push format('%sd%s', c, s)
|
30
31
|
end
|
31
32
|
|
32
33
|
def to_s_explode
|
33
|
-
return
|
34
|
+
return if @options[:explode].zero?
|
34
35
|
|
35
36
|
e = (@options[:explode] == sides) ? @options[:explode] : ''
|
36
37
|
|
37
|
-
@
|
38
|
+
@parts.push format('e%s', e)
|
38
39
|
end
|
39
40
|
|
40
41
|
def to_s_drop
|
41
|
-
return
|
42
|
+
return if @options[:drop].zero?
|
42
43
|
|
43
|
-
@
|
44
|
+
@parts.push format('d%d', @options[:drop])
|
44
45
|
end
|
45
46
|
|
46
47
|
def to_s_keep
|
47
|
-
return
|
48
|
+
return if @options[:keep].zero?
|
48
49
|
|
49
|
-
@
|
50
|
+
@parts.push format('k%s', @options[:keep])
|
50
51
|
end
|
51
52
|
|
52
53
|
def to_s_reroll
|
53
|
-
return
|
54
|
+
return if @options[:reroll].zero?
|
54
55
|
|
55
|
-
@
|
56
|
+
@parts.push format('r%s', @options[:reroll])
|
56
57
|
end
|
57
58
|
|
58
59
|
def to_s_target
|
59
|
-
return
|
60
|
+
return if @options[:target].zero?
|
60
61
|
|
61
|
-
@
|
62
|
+
@parts.push format('t%s', @options[:target])
|
62
63
|
end
|
63
64
|
end
|
data/lib/dicebag/roll_string.rb
CHANGED
@@ -4,41 +4,48 @@
|
|
4
4
|
# generation methods.
|
5
5
|
module RollString
|
6
6
|
def to_s(no_spaces = false)
|
7
|
-
@
|
8
|
-
@space = no_spaces ? '' : ' '
|
7
|
+
@parts = []
|
9
8
|
|
10
9
|
to_s_tree
|
11
10
|
|
12
|
-
@
|
11
|
+
str = @parts.join ' '
|
12
|
+
|
13
|
+
no_spaces ? str.tr(' ', '') : str
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
16
17
|
|
17
18
|
def to_s_tree
|
18
|
-
tree.each
|
19
|
+
tree.each do |op, value|
|
20
|
+
@parts.push send("to_s_#{op}", value)
|
21
|
+
end
|
19
22
|
end
|
20
23
|
|
21
24
|
def to_s_label(value)
|
22
|
-
|
25
|
+
value.to_s
|
23
26
|
end
|
24
27
|
|
25
28
|
def to_s_start(value)
|
26
|
-
|
29
|
+
value.to_s
|
27
30
|
end
|
28
31
|
|
29
32
|
def to_s_add(value)
|
30
|
-
|
33
|
+
_op_value '+', value
|
31
34
|
end
|
32
35
|
|
33
36
|
def to_s_sub(value)
|
34
|
-
|
37
|
+
_op_value '-', value
|
35
38
|
end
|
36
39
|
|
37
40
|
def to_s_mul(value)
|
38
|
-
|
41
|
+
_op_value '*', value
|
39
42
|
end
|
40
43
|
|
41
44
|
def to_s_div(value)
|
42
|
-
|
45
|
+
_op_value '/', value
|
46
|
+
end
|
47
|
+
|
48
|
+
def _op_value(op, value)
|
49
|
+
"#{op}#{value}"
|
43
50
|
end
|
44
51
|
end
|
data/lib/dicebag/transform.rb
CHANGED
@@ -9,7 +9,7 @@ module DiceBag
|
|
9
9
|
def self.hashify_options(options)
|
10
10
|
opts = {}
|
11
11
|
|
12
|
-
options.each { |
|
12
|
+
options.each { |val| opts.update val } if options.respond_to? :each
|
13
13
|
|
14
14
|
opts
|
15
15
|
end
|
@@ -18,16 +18,14 @@ module DiceBag
|
|
18
18
|
# 2-element arrays ('tagged arrays'), which is then
|
19
19
|
# hashified later. (There is no way to update the
|
20
20
|
# options when these rules are matched.)
|
21
|
-
rule(drop: simple(:x)) {
|
22
|
-
rule(keep: simple(:x)) {
|
23
|
-
rule(reroll: simple(:x)) {
|
24
|
-
rule(target: simple(:x)) {
|
21
|
+
rule(drop: simple(:x)) { { drop: Integer(x) } }
|
22
|
+
rule(keep: simple(:x)) { { keep: Integer(x) } }
|
23
|
+
rule(reroll: simple(:x)) { { reroll: Integer(x) } }
|
24
|
+
rule(target: simple(:x)) { { target: Integer(x) } }
|
25
25
|
|
26
26
|
# Explode is special, in that if it is nil, then it
|
27
27
|
# must remain that way.
|
28
|
-
rule(explode: simple(:x))
|
29
|
-
[:explode, (x ? Integer(x) : nil)]
|
30
|
-
end
|
28
|
+
rule(explode: simple(:x)) { { explode: (x ? Integer(x) : nil) } }
|
31
29
|
|
32
30
|
# Parts {:ops => (:xdx | :number)}
|
33
31
|
# These are first-match, so the simple number will
|
@@ -56,27 +54,24 @@ module DiceBag
|
|
56
54
|
end
|
57
55
|
|
58
56
|
# Match a label by itself.
|
59
|
-
rule(label: simple(:s)) {
|
57
|
+
rule(label: simple(:s)) { [:label, String(s)] }
|
60
58
|
|
61
59
|
# Match a label followed by a :start subtree.
|
62
60
|
rule(label: simple(:s), start: subtree(:part)) do
|
63
|
-
label
|
64
|
-
xdx = part[:xdx]
|
65
|
-
options = Transform.hashify_options(part[:options])
|
61
|
+
label = String(s)
|
66
62
|
|
67
|
-
[
|
63
|
+
[[:label, label], [:start, part]]
|
68
64
|
end
|
69
65
|
|
70
66
|
# Match a :start subtree, with the label not present.
|
71
67
|
# Note that this returns a hash, but the final output
|
72
68
|
# will still be in an array.
|
73
69
|
rule(start: subtree(:part)) do
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
}
|
70
|
+
[:start, part]
|
71
|
+
end
|
72
|
+
|
73
|
+
rule(xdx: subtree(:xdx), options: subtree(:opts)) do
|
74
|
+
{ xdx: xdx, options: Transform.hashify_options(opts) }
|
80
75
|
end
|
81
76
|
|
82
77
|
# Convert the count and sides of an :xdx part.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dicebag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SynTruth
|
@@ -14,6 +14,9 @@ dependencies:
|
|
14
14
|
name: parslet
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.4'
|
17
20
|
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 1.4.0
|
@@ -21,6 +24,9 @@ dependencies:
|
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.4'
|
24
30
|
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 1.4.0
|
@@ -42,7 +48,8 @@ files:
|
|
42
48
|
- lib/dicebag/static_part.rb
|
43
49
|
- lib/dicebag/transform.rb
|
44
50
|
homepage: https://github.com/syntruth/Dice-Bag
|
45
|
-
licenses:
|
51
|
+
licenses:
|
52
|
+
- MIT
|
46
53
|
metadata: {}
|
47
54
|
post_install_message:
|
48
55
|
rdoc_options: []
|