diceroller 0.0.2 → 0.0.3
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/.gitignore +1 -0
- data/.travis.yml +5 -0
- data/README.txt +9 -1
- data/lib/diceroller.rb +1 -1
- data/lib/roller/die.rb +19 -0
- data/lib/roller/roll.rb +54 -0
- data/lib/roller/ruleset/base_ruleset.rb +16 -0
- data/lib/roller/version.rb +1 -1
- data/spec/{roll_spec.rb → roller/base_ruleset_spec.rb} +10 -42
- data/spec/roller/roll_spec.rb +47 -0
- metadata +41 -41
- data/lib/roll.rb +0 -48
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.txt
CHANGED
@@ -5,4 +5,12 @@ Currently it supports the following:
|
|
5
5
|
- Creating a new roll with dice of one size and a number of dice
|
6
6
|
- Rerolling all dice of a certain value
|
7
7
|
- Exploding all dice of a certain value (this creates a die with a value of original roll + the value of another die)
|
8
|
-
This makes it possible to roll a 16 on a ten-sided die
|
8
|
+
This makes it possible to roll a 16 on a ten-sided die (for those systems that need to support this mechanic)
|
9
|
+
|
10
|
+
CONTRIBUTION GUIDELINES:
|
11
|
+
|
12
|
+
I want 'em.
|
13
|
+
|
14
|
+
I'd love to talk with you about building the right specs and the right API. I'm available as
|
15
|
+
twitter - emonical
|
16
|
+
email - solrane.altari@gmail.com (though this is subject to change)
|
data/lib/diceroller.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require 'roll'
|
1
|
+
require 'roller/roll'
|
data/lib/roller/die.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class Die
|
2
|
+
attr_reader :value
|
3
|
+
|
4
|
+
def initialize(value)
|
5
|
+
@value = value
|
6
|
+
end
|
7
|
+
|
8
|
+
def ==(other_die)
|
9
|
+
if other_die.respond_to?(:value)
|
10
|
+
@value == other_die.value
|
11
|
+
else
|
12
|
+
@value == other_die
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def +(other_die)
|
17
|
+
Die.new(@value + other_die.value)
|
18
|
+
end
|
19
|
+
end
|
data/lib/roller/roll.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative 'die'
|
2
|
+
require_relative 'ruleset/base_ruleset'
|
3
|
+
|
4
|
+
class Roll
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
attr_reader :dice
|
8
|
+
|
9
|
+
def initialize(num_of_dice, options = {})
|
10
|
+
@options = default_options.merge(options)
|
11
|
+
@rand_generator = @options[:rand_generator]
|
12
|
+
@dice = roll(num_of_dice)
|
13
|
+
unless @options[:ruleset].nil?
|
14
|
+
self.extend(@options[:ruleset])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def size
|
19
|
+
@dice.count
|
20
|
+
end
|
21
|
+
|
22
|
+
def ==(other)
|
23
|
+
@dice == other
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def each
|
29
|
+
@dice.each { |die| yield die }
|
30
|
+
end
|
31
|
+
|
32
|
+
def default_options
|
33
|
+
{ :die_size => 10, :rand_generator => Random, :ruleset => Ruleset::BaseRuleset}
|
34
|
+
end
|
35
|
+
|
36
|
+
def roll(number)
|
37
|
+
number.times.collect { roll_die }
|
38
|
+
end
|
39
|
+
|
40
|
+
def roll_die
|
41
|
+
Die.new(@rand_generator.rand(@options[:die_size]))
|
42
|
+
end
|
43
|
+
|
44
|
+
def each_die_that_matches(values)
|
45
|
+
@dice.map! do |die|
|
46
|
+
last_die = die
|
47
|
+
while values.any? { |value| last_die == value }
|
48
|
+
die, last_die = yield(die)
|
49
|
+
last_die = (last_die.nil? && die) || last_die
|
50
|
+
end
|
51
|
+
die
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ruleset
|
2
|
+
module BaseRuleset
|
3
|
+
def reroll(*values)
|
4
|
+
each_die_that_matches(values) { roll_die }
|
5
|
+
self
|
6
|
+
end
|
7
|
+
|
8
|
+
def explode(*values)
|
9
|
+
each_die_that_matches(values) do |die|
|
10
|
+
last_die = roll_die
|
11
|
+
[die + last_die, last_die]
|
12
|
+
end
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/roller/version.rb
CHANGED
@@ -1,82 +1,50 @@
|
|
1
1
|
require 'rspec'
|
2
|
-
require 'roll'
|
3
|
-
|
4
|
-
describe Roll do
|
2
|
+
require 'roller/roll'
|
5
3
|
|
4
|
+
describe "roll with base ruleset" do
|
6
5
|
let(:rand_generator) do
|
7
6
|
rand_generator = double('rand_gen').as_null_object
|
8
7
|
rand_generator.stub(:rand).and_return(1,2,3,4,5,6,7,8,9,10)
|
9
8
|
rand_generator
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
unless Roll.respond_to?(:size)
|
14
|
-
class Roll
|
15
|
-
def size
|
16
|
-
@dice.count
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "roll" do
|
23
|
-
it "should have <parameters> elements" do
|
24
|
-
roll = Roll.new(2, rand_generator)
|
25
|
-
roll.should have(2).items
|
26
|
-
end
|
27
|
-
|
28
|
-
it "returns a list of numbers" do
|
29
|
-
roll = Roll.new(10, rand_generator)
|
30
|
-
roll.should == [1,2,3,4,5,6,7,8,9,10]
|
31
|
-
end
|
11
|
+
let(:mock_obj_hash) { Hash[:rand_generator, rand_generator] }
|
32
12
|
|
33
|
-
|
34
|
-
Random.should_receive(:rand).exactly(5)
|
35
|
-
roll = Roll.new(5)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "calls Random with default value of 10 when no options provided" do
|
39
|
-
Random.should_receive(:rand).with(10).exactly(5)
|
40
|
-
roll = Roll.new(5)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe "reroll" do
|
13
|
+
describe "rerolls" do
|
45
14
|
it "rerolls all dice that match the parameter" do
|
46
|
-
roll = Roll.new(5,
|
15
|
+
roll = Roll.new(5, mock_obj_hash)
|
47
16
|
roll.reroll(3).should == [1,2,6,4,5]
|
48
17
|
end
|
49
18
|
|
50
19
|
it "rerolls all dice that match any of the parameters" do
|
51
|
-
roll = Roll.new(5,
|
20
|
+
roll = Roll.new(5, mock_obj_hash)
|
52
21
|
roll.reroll(3,4).should == [1,2,6,7,5]
|
53
22
|
end
|
54
23
|
|
55
24
|
it "applies until it can't" do
|
56
25
|
rand_generator = double('rand_gen').as_null_object
|
57
26
|
rand_generator.stub(:rand).and_return(1,1,1,4)
|
58
|
-
roll = Roll.new(1, rand_generator)
|
27
|
+
roll = Roll.new(1, Hash[:rand_generator, rand_generator])
|
59
28
|
roll.reroll(1).should == [4]
|
60
29
|
end
|
61
30
|
end
|
62
31
|
|
63
32
|
describe "explode" do
|
64
33
|
it "adds die to the result of all dice that match the parameter" do
|
65
|
-
roll = Roll.new(5,
|
34
|
+
roll = Roll.new(5, mock_obj_hash)
|
66
35
|
roll.explode(3).should == [1,2,9,4,5]
|
67
36
|
end
|
68
37
|
|
69
38
|
it "adds die to the result of all dice that match any of the parameters" do
|
70
|
-
roll = Roll.new(5,
|
39
|
+
roll = Roll.new(5, mock_obj_hash)
|
71
40
|
roll.explode(3,4).should == [1,2,9,11,5]
|
72
41
|
end
|
73
42
|
|
74
43
|
it "applies until it can't" do
|
75
44
|
rand_generator = double('rand_gen').as_null_object
|
76
45
|
rand_generator.stub(:rand).and_return(10,10,10,9)
|
77
|
-
roll = Roll.new(1, rand_generator)
|
46
|
+
roll = Roll.new(1, Hash[:rand_generator, rand_generator])
|
78
47
|
roll.explode(10).should == [39]
|
79
48
|
end
|
80
49
|
end
|
81
|
-
|
82
50
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'roller/roll'
|
3
|
+
|
4
|
+
describe Roll do
|
5
|
+
let(:rand_generator) do
|
6
|
+
rand_generator = double('rand_gen').as_null_object
|
7
|
+
rand_generator.stub(:rand).and_return(1,2,3,4,5,6,7,8,9,10)
|
8
|
+
rand_generator
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:mock_obj_hash) { Hash[:rand_generator, rand_generator] }
|
12
|
+
|
13
|
+
describe "by default" do
|
14
|
+
it "uses the base ruleset" do
|
15
|
+
roll = Roll.new(1)
|
16
|
+
roll.is_a?(Ruleset::BaseRuleset).should be_true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "roll" do
|
21
|
+
it "should have <parameters> elements" do
|
22
|
+
roll = Roll.new(2, mock_obj_hash)
|
23
|
+
roll.should have(2).items
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns a list of numbers" do
|
27
|
+
roll = Roll.new(10, mock_obj_hash)
|
28
|
+
roll.should == [1,2,3,4,5,6,7,8,9,10]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "calls Random once for each call" do
|
32
|
+
Random.should_receive(:rand).exactly(5)
|
33
|
+
roll = Roll.new(5)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "calls Random with default value of 10 when no options provided" do
|
37
|
+
Random.should_receive(:rand).with(10).exactly(5)
|
38
|
+
roll = Roll.new(5)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "calls Random with specified value if options provided" do
|
42
|
+
options = { :die_size => 8, :rand_generator => Random }
|
43
|
+
Random.should_receive(:rand).with(8).exactly(5)
|
44
|
+
roll = Roll.new(5, options)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -1,78 +1,78 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: diceroller
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
4
5
|
prerelease:
|
5
|
-
version: 0.0.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Edward Monical-Vuylsteke
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-11-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: rspec
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 2.6.0
|
24
22
|
type: :development
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.6.0
|
30
|
+
description: ! "A dice rolling gem that provides an effective\n and
|
31
|
+
hopefully extensible API to meet the extensive\n needs of the
|
32
|
+
roleplaying game community"
|
33
|
+
email:
|
31
34
|
- solrane.altari@gmail.com
|
32
35
|
executables: []
|
33
|
-
|
34
36
|
extensions: []
|
35
|
-
|
36
37
|
extra_rdoc_files: []
|
37
|
-
|
38
|
-
files:
|
38
|
+
files:
|
39
39
|
- .gitignore
|
40
40
|
- .rspec
|
41
|
+
- .travis.yml
|
41
42
|
- Gemfile
|
42
43
|
- Gemfile.lock
|
43
44
|
- README.txt
|
44
45
|
- Rakefile
|
45
46
|
- lib/diceroller.rb
|
46
|
-
- lib/
|
47
|
+
- lib/roller/die.rb
|
48
|
+
- lib/roller/roll.rb
|
49
|
+
- lib/roller/ruleset/base_ruleset.rb
|
47
50
|
- lib/roller/version.rb
|
48
51
|
- roller.gemspec
|
49
|
-
- spec/
|
52
|
+
- spec/roller/base_ruleset_spec.rb
|
53
|
+
- spec/roller/roll_spec.rb
|
50
54
|
homepage: https://github.com/emonical/roller
|
51
55
|
licenses: []
|
52
|
-
|
53
56
|
post_install_message:
|
54
57
|
rdoc_options: []
|
55
|
-
|
56
|
-
require_paths:
|
58
|
+
require_paths:
|
57
59
|
- lib
|
58
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
61
|
none: false
|
60
|
-
requirements:
|
61
|
-
- -
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version:
|
64
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
67
|
none: false
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version:
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
70
72
|
requirements: []
|
71
|
-
|
72
73
|
rubyforge_project:
|
73
|
-
rubygems_version: 1.8.
|
74
|
+
rubygems_version: 1.8.24
|
74
75
|
signing_key:
|
75
76
|
specification_version: 3
|
76
77
|
summary: Dice roller for roleplaying games
|
77
78
|
test_files: []
|
78
|
-
|
data/lib/roll.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
class Roll
|
2
|
-
include Enumerable
|
3
|
-
|
4
|
-
def initialize(num_of_dice, options = { :die_size => 10, :rand_generator => Random})
|
5
|
-
@options = options
|
6
|
-
@rand_generator = @options[:rand_generator]
|
7
|
-
@dice = roll(num_of_dice)
|
8
|
-
end
|
9
|
-
|
10
|
-
def reroll(*values)
|
11
|
-
each_die_that_matches(values) { roll_die }
|
12
|
-
self
|
13
|
-
end
|
14
|
-
|
15
|
-
def explode(*values)
|
16
|
-
each_die_that_matches(values) { |die| last_die = roll_die; [die + last_die, last_die] }
|
17
|
-
self
|
18
|
-
end
|
19
|
-
|
20
|
-
def ==(other)
|
21
|
-
@dice == other
|
22
|
-
end
|
23
|
-
|
24
|
-
def each
|
25
|
-
@dice.each { |die| yield die }
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def roll(number)
|
31
|
-
number.times.collect { roll_die }
|
32
|
-
end
|
33
|
-
|
34
|
-
def roll_die
|
35
|
-
@rand_generator.rand(@options[:die_size])
|
36
|
-
end
|
37
|
-
|
38
|
-
def each_die_that_matches(values)
|
39
|
-
@dice.map! do |die|
|
40
|
-
last_die = die
|
41
|
-
while values.any? { |value| value == last_die}
|
42
|
-
die, last_die = yield(die)
|
43
|
-
last_die = (last_die.nil? && die) || last_die
|
44
|
-
end
|
45
|
-
die
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|