dicebag 3.3.1 → 3.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c9b311916035f1eaf3e31fd09c0eba523bc426875ca25ea0929d131215df709
4
- data.tar.gz: 3c7c973630fdc29c654f3b90009d32652da06763a2e6a44fc5d2edb643215b96
3
+ metadata.gz: e374abd6451fc02ee28e17e0a87a2833a785643d89962708903717766c8ad8df
4
+ data.tar.gz: 6e339459b5f5aaa5d2dc5f26f55dc8331e1a976e2da9452f3fc2f2bfd9c9f00f
5
5
  SHA512:
6
- metadata.gz: 735fae23c00f6c883f4370bd8ca2a9451b6747264664b820f6f2b36ea062c8f3167197be28e17c83978d82a887c2d71cf5236af5519865913f23a0773145d087
7
- data.tar.gz: 8c9c8fbc7ad416cf954da26a9118e040863a8cfb8b2ca0e71b9e8b0248d282ef0ff17bb66646433e93c6d55d8c359fc95962ceaba0205f8889500319271cd479
6
+ metadata.gz: d8f484c21149db59bec30f3c3935aeeb1f39001a4ab3c746dec41d1c87d7bfab2bef4c8c3ba5a70ed2efff6b598cb50811185b393b94941cbcee00d25991f080
7
+ data.tar.gz: e1c68214264adaf8b3023f4ae34309c862ba4fe707d562971eb73461bd866f1319106c4e9cdc7014f0762c72fff665477d3ad06f2ddec7877ae043fa8c34bf0f
data/bin/dicebag CHANGED
@@ -1,12 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'optparse'
4
- # require 'dicebag'
4
+
5
5
  require_relative '../lib/dicebag'
6
6
 
7
7
  # Define the Dicebag CLI app
8
8
  class DiceBagCLI
9
9
  attr_reader :params
10
+ attr_reader :dstr
10
11
 
11
12
  def self.call
12
13
  new.perform
@@ -18,7 +19,13 @@ class DiceBagCLI
18
19
 
19
20
  def opts
20
21
  @opts ||= OptionParser.new do |args|
21
- args.banner = 'Usage: dicebag [-n | --notes] <dice string>'
22
+ args.banner = 'Usage: dicebag [-n|--notes] [--avg|--max|--min] <string>'
23
+
24
+ args.on '--avg', 'Display the average for the roll.'
25
+
26
+ args.on '--max', 'Display the maximum for the roll.'
27
+
28
+ args.on '--min', 'Display the minimum for the roll.'
22
29
 
23
30
  args.on '-n', '--notes', 'Display any notes for the roll.'
24
31
 
@@ -35,7 +42,28 @@ class DiceBagCLI
35
42
 
36
43
  nonopts = opts.parse! into: params
37
44
 
38
- dstr = nonopts.join(' ')
45
+ @dstr = nonopts.join(' ')
46
+
47
+ return do_average if params[:avg]
48
+ return do_maximum if params[:max]
49
+ return do_minimum if params[:min]
50
+
51
+ do_roll
52
+ end
53
+
54
+ def do_average
55
+ puts DiceBag.average dstr
56
+ end
57
+
58
+ def do_maximum
59
+ puts DiceBag.maximum dstr
60
+ end
61
+
62
+ def do_minimum
63
+ puts DiceBag.minimum dstr
64
+ end
65
+
66
+ def do_roll
39
67
  roll = DiceBag::Roll.new dstr
40
68
  result = roll.roll
41
69
 
@@ -0,0 +1,59 @@
1
+ module DiceBag
2
+ # This is service class to calculate the Maximum/Minimum for the given
3
+ # Roll.
4
+ class MinMaxCalc
5
+ attr_reader :roll
6
+ attr_reader :method
7
+ attr_reader :opposite
8
+
9
+ def self.average(roll)
10
+ (maximum(roll) + minimum(roll)) / 2.0
11
+ end
12
+
13
+ def self.maximum(roll)
14
+ call roll, :maximum
15
+ end
16
+
17
+ def self.minimum(roll)
18
+ call roll, :minimum
19
+ end
20
+
21
+ def self.call(roll, method)
22
+ new(roll, method).perform
23
+ end
24
+
25
+ def initialize(roll, method)
26
+ @roll = roll
27
+ @method = method
28
+ @opposite = opposite_method
29
+ @total = 0
30
+ end
31
+
32
+ def perform
33
+ roll.tree.each do |op, part|
34
+ next unless part.is_a?(RollPart) || part.is_a?(StaticPart)
35
+
36
+ calculate op, part
37
+ end
38
+
39
+ @total
40
+ end
41
+
42
+ # Update the total based on the oper. For 'additive' operations, we
43
+ # use the method, but if it's 'subtractive' then it uses the
44
+ # opposite method.
45
+ def calculate(oper, part)
46
+ case oper
47
+ when :start then @total = part.send(method)
48
+ when :add then @total += part.send(method)
49
+ when :sub then @total -= part.send(opposite)
50
+ when :mul then @total *= part.send(method)
51
+ when :div then @total /= part.send(opposite)
52
+ end
53
+ end
54
+
55
+ def opposite_method
56
+ method == :maximum ? :minimum : :maximum
57
+ end
58
+ end
59
+ end
@@ -6,11 +6,11 @@ module DiceBag
6
6
  # Base rules.
7
7
  rule(:space?) { str(' ').repeat }
8
8
 
9
- # Numbers are limited to 3 digit places.
9
+ # Numbers are limited to 4 digit places.
10
10
  #
11
11
  # Why? To prevent abuse from people rolling: 999999999D999999999 and
12
12
  # 'DOS'-ing the app.
13
- rule(:number) { match('[0-9]').repeat(1, 3) }
13
+ rule(:number) { match('[0-9]').repeat(1, 4) }
14
14
  rule(:number?) { number.maybe }
15
15
 
16
16
  # Label rule
data/lib/dicebag/roll.rb CHANGED
@@ -20,10 +20,10 @@ module DiceBag
20
20
  arr = []
21
21
  fmt = "For %s: %s\n"
22
22
 
23
- tree.each do |_op, part|
24
- if part.is_a?(RollPart) && !part.notes.empty?
25
- arr.push format(fmt, part, part.notes)
26
- end
23
+ tree.each_value do |part|
24
+ next unless part.is_a?(RollPart) && !part.notes.empty?
25
+
26
+ arr.push format(fmt, part, part.notes)
27
27
  end
28
28
 
29
29
  arr
@@ -51,12 +51,25 @@ module DiceBag
51
51
  @result = Result.new(@label, @total, @sections)
52
52
  end
53
53
 
54
+ def average
55
+ MinMaxCalc.average self
56
+ end
57
+
58
+ def maximum
59
+ MinMaxCalc.maximum self
60
+ end
61
+
62
+ def minimum
63
+ MinMaxCalc.minimum self
64
+ end
65
+
54
66
  private
55
67
 
56
68
  def handle_tree
57
69
  tree.each do |op, part|
58
70
  if op == :label
59
71
  @label = part.value
72
+
60
73
  next
61
74
  end
62
75
 
@@ -12,7 +12,7 @@ module DiceBag
12
12
  attr_reader :reroll_count
13
13
 
14
14
  def initialize(part)
15
- super part
15
+ super(part)
16
16
 
17
17
  @total = nil
18
18
  @tally = []
@@ -44,7 +44,7 @@ module DiceBag
44
44
 
45
45
  # Checks to see if this instance has rolled yet or not.
46
46
  def rolled?
47
- @total.nil? ? false : true
47
+ !@total.nil?
48
48
  end
49
49
 
50
50
  def roll
@@ -87,6 +87,18 @@ module DiceBag
87
87
  @total
88
88
  end
89
89
 
90
+ def average
91
+ (minimum + maximum) / 2.0
92
+ end
93
+
94
+ def maximum
95
+ count * sides
96
+ end
97
+
98
+ def minimum
99
+ count
100
+ end
101
+
90
102
  def <=>(other)
91
103
  total <=> other.total
92
104
  end
@@ -111,10 +123,10 @@ module DiceBag
111
123
  def roll_die
112
124
  num = __roll_die
113
125
 
126
+ return num unless options[:reroll].positive?
127
+
114
128
  # Handle Reroll
115
- if options[:reroll].positive?
116
- num = __roll_die while num <= @options[:reroll]
117
- end
129
+ num = __roll_die while num <= @options[:reroll]
118
130
 
119
131
  num
120
132
  end
@@ -5,13 +5,18 @@ module DiceBag
5
5
  def initialize(num)
6
6
  num = num.to_i if num.is_a?(String)
7
7
 
8
- super num
8
+ super(num)
9
9
  end
10
10
 
11
11
  def total
12
12
  value
13
13
  end
14
14
 
15
+ # These are all just the same for this part.
16
+ alias average total
17
+ alias maximum total
18
+ alias minimum total
19
+
15
20
  def to_s
16
21
  value.to_s
17
22
  end
@@ -50,7 +50,7 @@ class D20Advantage < D20
50
50
  r1 = @roll.roll
51
51
  r2 = @roll.roll
52
52
 
53
- r1 > r2 ? r1 : r2
53
+ [r1, r2].max
54
54
  end
55
55
  end
56
56
 
@@ -60,6 +60,6 @@ class D20Disadvantage < D20
60
60
  r1 = @roll.roll
61
61
  r2 = @roll.roll
62
62
 
63
- r1 < r2 ? r1 : r2
63
+ [r1, r2].min
64
64
  end
65
65
  end
@@ -46,9 +46,7 @@ module Fudge
46
46
  def to_s
47
47
  base = "#{@number}dF"
48
48
 
49
- "#{base} #{tally_to_s} => #{@total}" if @total
50
-
51
- base
49
+ @total ? "#{base} #{tally_to_s} => #{@total}" : base
52
50
  end
53
51
 
54
52
  private
data/lib/dicebag.rb CHANGED
@@ -15,11 +15,26 @@ module DiceBag
15
15
  Normalize.call ast
16
16
  end
17
17
 
18
- ### Main Syntatic Sugar Interface
18
+ ###
19
+ # Main Syntatic Sugar Interface Methodds
20
+ ###
21
+
19
22
  def self.roll(dstr)
20
23
  DiceBag::Roll.new(dstr).roll
21
24
  end
22
25
 
26
+ def self.average(dstr)
27
+ DiceBag::Roll.new(dstr).average
28
+ end
29
+
30
+ def self.maximum(dstr)
31
+ DiceBag::Roll.new(dstr).maximum
32
+ end
33
+
34
+ def self.minimum(dstr)
35
+ DiceBag::Roll.new(dstr).minimum
36
+ end
37
+
23
38
  # The default roll if one is not given.
24
39
  def self.default_roll
25
40
  '1d6'
@@ -27,14 +42,15 @@ module DiceBag
27
42
  end
28
43
 
29
44
  # Our sub-modules.
30
- require_relative './dicebag/normalize'
31
- require_relative './dicebag/roll_string'
32
- require_relative './dicebag/roll_part_string'
33
- require_relative './dicebag/parser'
34
- require_relative './dicebag/transform'
35
- require_relative './dicebag/simple_part'
36
- require_relative './dicebag/label_part'
37
- require_relative './dicebag/static_part'
38
- require_relative './dicebag/roll_part'
39
- require_relative './dicebag/roll'
40
- require_relative './dicebag/result'
45
+ require_relative 'dicebag/normalize'
46
+ require_relative 'dicebag/min_max_calc'
47
+ require_relative 'dicebag/roll_string'
48
+ require_relative 'dicebag/roll_part_string'
49
+ require_relative 'dicebag/parser'
50
+ require_relative 'dicebag/transform'
51
+ require_relative 'dicebag/simple_part'
52
+ require_relative 'dicebag/label_part'
53
+ require_relative 'dicebag/static_part'
54
+ require_relative 'dicebag/roll_part'
55
+ require_relative 'dicebag/roll'
56
+ require_relative 'dicebag/result'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dicebag
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.1
4
+ version: 3.3.3
5
5
  platform: ruby
6
6
  authors:
7
- - SynTruth
7
+ - Randy "syntruth" Carnahan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-25 00:00:00.000000000 Z
11
+ date: 2024-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
@@ -40,6 +40,7 @@ files:
40
40
  - bin/dicebag
41
41
  - lib/dicebag.rb
42
42
  - lib/dicebag/label_part.rb
43
+ - lib/dicebag/min_max_calc.rb
43
44
  - lib/dicebag/normalize.rb
44
45
  - lib/dicebag/parser.rb
45
46
  - lib/dicebag/result.rb
@@ -59,7 +60,8 @@ files:
59
60
  homepage: https://github.com/syntruth/Dice-Bag
60
61
  licenses:
61
62
  - MIT
62
- metadata: {}
63
+ metadata:
64
+ rubygems_mfa_required: 'true'
63
65
  post_install_message:
64
66
  rdoc_options: []
65
67
  require_paths:
@@ -76,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
78
  - !ruby/object:Gem::Version
77
79
  version: '0'
78
80
  requirements: []
79
- rubygems_version: 3.1.2
81
+ rubygems_version: 3.3.26
80
82
  signing_key:
81
83
  specification_version: 4
82
84
  summary: 'Dice Bag: Ruby Dice Rolling Library'