tabletop 0.3.0 → 0.4.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/.gitignore CHANGED
@@ -3,4 +3,5 @@ Gemfile.lock
3
3
  pkg/
4
4
  doc/
5
5
  *.gem
6
- .idea/
6
+ .idea/
7
+ coverage/
data/README.markdown CHANGED
@@ -124,7 +124,22 @@ So, possible results for our cool AW roll:
124
124
  open_brain.roll
125
125
  puts open_brain.result #=> 10
126
126
  puts open_brain.effects #=> ["the MC will tell you something new and interesting about the current situation", "...and it's a good detail"]
127
-
127
+
128
+ ### Decks
129
+
130
+ Decks are essentially weighted hashes with a random #draw method. You can put whatever hashable object you like in a
131
+ deck (there's no Card class yet) as a key to a value that indicates the number of copies of that object in the deck.
132
+
133
+ #draw returns another deck, and reduces the number of cards in the original deck appropriately.
134
+
135
+ d = Deck.new
136
+ d["card A"] = 20
137
+ d["card B"] = 19
138
+ d.deck_size #=> 39
139
+ hand = d.draw(3) #=> {"card A"=>1, "card B" =>2}
140
+ d #=> {"card A" => 19, "card B"=>17}
141
+ d << hand #=> {"card A" => 20, "card B"=>19}
142
+
128
143
  ### Coming Soon
129
144
 
130
145
  That's already enough functionality to do many different kinds of rolls, but there's a lot more in store.
data/lib/tabletop.rb CHANGED
@@ -3,4 +3,5 @@ require_relative 'tabletop/randomizers'
3
3
  require_relative 'tabletop/pool'
4
4
  require_relative 'tabletop/roll'
5
5
  require_relative 'tabletop/token'
6
- require_relative 'tabletop/condition'
6
+ require_relative 'tabletop/condition'
7
+ require_relative 'tabletop/deck'
@@ -0,0 +1,111 @@
1
+ module Tabletop
2
+ class DrawMoreCardsThanDeckHasError < StandardError
3
+ end
4
+
5
+ class Deck < Hash
6
+ def initialize
7
+ super(0)
8
+ end
9
+
10
+ def << object
11
+ if object.respond_to? :merge
12
+ merge(object) {|card,ours,new| ours+new}
13
+ else
14
+ self[object] = 1
15
+ end
16
+ end
17
+
18
+ def deck_size
19
+ self.values.inject(:+)
20
+ end
21
+
22
+ def draw(cards=1)
23
+ raise DrawMoreCardsThanDeckHasError if cards > self.deck_size
24
+ drawable_cards = self.clone
25
+ if block_given?
26
+ drawable_cards = drawable_cards.keep_if {|card,copies| yield(card,copies) }
27
+ return nil if drawable_cards.empty?
28
+ # can't use select here, since that returns a Hash instead of a Deck
29
+ end
30
+ drawn = Deck.new
31
+ cards.times do
32
+ running_weight = 0
33
+ n = rand*drawable_cards.deck_size
34
+ drawable_cards.each do |card, weight|
35
+ if running_weight < n && n <= running_weight + weight
36
+ self[card] -= 1
37
+ drawable_cards[card] -= 1
38
+ drawn << card
39
+ end
40
+ running_weight += weight
41
+ end
42
+ end
43
+ drawn
44
+ end
45
+
46
+ def possible_starting_hands(hand_size=7)
47
+
48
+ # at any moment, there is some set of cards A that have the highest values, countA
49
+ # (ie, there's the most of them in the deck)
50
+ # there may also be some set of cards B that have the next-highest values, countB
51
+ #
52
+ # in the case of there only being As
53
+ # the most likely combinations are equal numbers of each of them, or as close to that as possible.
54
+ # if A.size is 1, and countA is greater than hand_size
55
+ # the first and last combination would be {A1=>hand_size}
56
+ # if A.size is 1, and countA is less than hand_size...
57
+ # then raise an exception, of course
58
+ # if A.size is 2, and countA is greater than hand_size
59
+ # the first combination would be {A1=>hand}
60
+ # if A.size is 2, and 2*countA is greater than hand_size
61
+ # if A.size is 2, and 2*countA is less than hand_size, then again, exception
62
+ #
63
+ # So the first set of combinations has as it's left term
64
+ # countA-countB of each card in A
65
+ # and as it's right term,
66
+ #
67
+ # they are likely
68
+ # n = copies of most popular card - copies of next most popular card
69
+ #
70
+ # first_hand = n copies of most popular card, up to seven
71
+ # now there is some number A>=2 of cards that are equally likely
72
+ # If A >= 7-n
73
+ # first_hand << unique (k-n)-combinations of those A cards
74
+ # if A < 7-n (that is, if )
75
+ cards_uniq = self.keys
76
+ Enumerator.new do |hands|
77
+
78
+ counts = self.values.uniq.sort
79
+
80
+ cards_uniq.repeated_combination(hand_size).each do |a|
81
+ hands << a if self.possible_hand?(a)
82
+ end
83
+ end
84
+ end
85
+
86
+ def possible_hand?(array)
87
+ hand = Hash.new(0)
88
+ array.each { |e| hand[e] +=1 }
89
+ hand.each {|card, number| return false if (self[card].nil? or self[card] < number) }
90
+ true
91
+ end
92
+
93
+ def chance_to_draw(cards)
94
+ if Array === cards
95
+ copy = self.clone
96
+ odds = 1
97
+ cards.each do |card|
98
+ odds *= copy.chance_to_draw(card)
99
+ copy[card] -= 1
100
+ end
101
+ odds
102
+ else
103
+ if self[cards] and self[cards] != 0
104
+ Float(self[cards])/self.deck_size
105
+ else
106
+ 0
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
data/lib/tabletop/pool.rb CHANGED
@@ -77,7 +77,7 @@ module Tabletop
77
77
  end
78
78
 
79
79
  # Returns a string of the pool's dice in d-notation
80
- def dice
80
+ def d_notation
81
81
  fudge = nil
82
82
  result = {}
83
83
  each do |die|
@@ -100,9 +100,26 @@ module Tabletop
100
100
  end
101
101
 
102
102
  # Rolls every die in the pool, and returns the Pool.
103
- def roll
103
+ def roll(params={})
104
104
  each do |die|
105
- die.roll
105
+
106
+ meets_all_conditions = true
107
+
108
+ params.each do |condition, term|
109
+ attribute, comparison = condition.to_s.split("_")
110
+ die_att = die.send(attribute.to_sym)
111
+
112
+ case comparison
113
+ when "under"
114
+ meets_all_conditions = false unless die_att < term
115
+ when "over"
116
+ meets_all_conditions = false unless die_att > term
117
+ when "equals"
118
+ meets_all_conditions = false unless die_att == term
119
+ end
120
+ end
121
+
122
+ die.roll if meets_all_conditions
106
123
  end
107
124
  self
108
125
  end
@@ -167,13 +184,13 @@ module Tabletop
167
184
  # of values) passed.
168
185
  def drop(to_drop)
169
186
  to_drop = [to_drop].flatten #turn it into an array if it isn't one.
170
- kept = reject{|die| to_drop.any?{|drop_value| die.value == drop_value }}
187
+ kept = reject{|die| to_drop.include?{die.value}}
171
188
  Pool.new(kept)
172
189
  end
173
190
 
174
191
  private
175
192
  def new_union(array)
176
- union = [self, array].flatten
193
+ union = [self, array].flatten # avoid using + in implementation of +
177
194
  new_pool =[]
178
195
  union.each do |die|
179
196
  new_pool << die.class.new(sides:die.sides, value:die.value)
@@ -1,3 +1,3 @@
1
1
  module Tabletop
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
data/spec/deck_spec.rb ADDED
@@ -0,0 +1,155 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ module Tabletop
5
+ describe Deck do
6
+ let(:d) do
7
+ deck = Deck.new
8
+ deck["Forest"] = 8
9
+ deck["Mountain"] = 3
10
+ deck["Island"] = 3
11
+ deck["Rootbound Crag"] = 4
12
+ deck["Hinterland Harbor"] = 4
13
+ deck["Llanowar Elves"] = 3
14
+ deck["Birds of Paradise"] = 4
15
+ deck["Phantasmal Image"] = 4
16
+ deck["Viridian Emissary"] = 4
17
+ deck["Phyrexian Metamorph"] = 4
18
+ deck["Acidic Slime"] = 4
19
+ deck["Inferno Titan"] = 4
20
+ deck["Wurmcoil Engine"] = 4
21
+ deck["Rampant Growth"] = 4
22
+ deck["Lead the Stampede"] = 3
23
+ deck
24
+ end
25
+ it "defaults to having zero of things" do
26
+ subject["Random Object"].should == 0
27
+ end
28
+ describe "#deck_size" do
29
+ it "counts all the cards" do
30
+ d.deck_size.should == 60
31
+ end
32
+ end
33
+ describe "<<" do
34
+ it "merges, summing together the values of collisions" do
35
+ deck_a = Deck.new()
36
+ deck_a["card A"] =1
37
+ deck_a["card B"] = 1
38
+ deck_b = Deck.new()
39
+ deck_b["card B"] =2
40
+ deck_b["card C"] =2
41
+ merged_deck = deck_a.merge(deck_b) {|k,o,n| o+n}
42
+ (deck_a << deck_b).should == merged_deck
43
+ end
44
+ end
45
+ describe "#draw" do
46
+ it "returns a deck containing a random card and decrements that card's copy count in the calling object" do
47
+ srand(1841922)
48
+ d.draw.should == {"Acidic Slime"=>1}
49
+ d["Acidic Slime"].should == 3
50
+ end
51
+ context "with one parameter" do
52
+ it "returns that many cards" do
53
+ d.draw(3).length.should == 3
54
+ end
55
+ it "raises an exception when you try to draw too many" do
56
+ expect {d.draw(61)}.to raise_error DrawMoreCardsThanDeckHasError
57
+ end
58
+ end
59
+ context "when passed a block " do
60
+ it "returns a random card for which the block returns true" do
61
+ srand(1841922)
62
+ d.draw {|card, copies| true}.should == {"Acidic Slime"=>1}
63
+ srand(1841922)
64
+ d.draw do |card, copies|
65
+ card == "Forest" or card == "Island" or card == "Mountain"
66
+ end.should == {"Mountain"=> 1}
67
+ end
68
+ it "returns nil if the card is not present" do
69
+ srand(1841922)
70
+ d.draw {|card, copies| false}.should be_nil
71
+ d.draw do |card, copies|
72
+ card == "Sir Not Appearing in this Test"
73
+ end.should be_nil
74
+ end
75
+ end
76
+ end
77
+ describe "#chance_to_draw" do
78
+ context "when passed a card" do
79
+ it "returns the odds of drawing that card from the deck" do
80
+ size = d.deck_size
81
+ d.each do |card,copies|
82
+ d.chance_to_draw(card).should == Float(copies)/size
83
+ end
84
+ d.chance_to_draw("A Card it Doesn't Have").should == 0
85
+ end
86
+ end
87
+ context "when passed an array of cards" do
88
+ it "returns the odds of drawing all the cards in the array from a draw of {array.length} cards" do
89
+ d.chance_to_draw(["Acidic Slime"]).should == d.chance_to_draw("Acidic Slime")
90
+ d.chance_to_draw(["Acidic Slime", "Phyrexian Metamorph"]).should == Float(4*4)/(60*59)
91
+ end
92
+ end
93
+ end
94
+ describe "#possible_starting_hands" do
95
+ def factorial(number)
96
+ (1..number).inject(:*)
97
+ end
98
+ def combinations(n,k)
99
+ factorial(n) / (factorial(k) * factorial(n-k))
100
+ end
101
+ def check_psh(deck, hand_size)
102
+ number_of_unique_cards = deck.length
103
+ guess_hands = combinations(hand_size+number_of_unique_cards-1, hand_size)
104
+ # Important note: the following only calculates combinations which have too many of any single card
105
+ # for a hand of size N, there are some combinations of K cards (c1, c2, ... ck) which are impossible
106
+ # how many integers between 2 and N are there which add to N?
107
+ # make a recursive function for that, tail case
108
+ # answer << [self]
109
+ # if == 2, return 1, 1
110
+ # then return (1..self-1).each {|v| add_up_to(self-v).each {|w| [v,w]}}
111
+ unless hand_size == 1
112
+ deck.each do |card, copies|
113
+ if copies == hand_size-1
114
+ guess_hands -= 1 #there is only one impossible hand in that case: a full hand of the card in question
115
+ elsif copies < hand_size # that is, if more copies of the card than exist might be in a possible hand
116
+ guess_hands -= combinations(hand_size - (copies+1) + number_of_unique_cards - 1,
117
+ hand_size - (copies+1))
118
+ end
119
+ end
120
+ end
121
+
122
+ if hand_size == 7
123
+ deck.possible_starting_hands.to_a.length.should == guess_hands
124
+ else
125
+ deck.possible_starting_hands(hand_size).to_a.length.should == guess_hands
126
+ end
127
+ end
128
+ it "enumerates all possible hand of a passed size (default 7)" do
129
+ 7.downto(1).each do |hand|
130
+ check_psh(d, hand)
131
+ end
132
+ deck = Deck.new
133
+ deck["card a"] = 20
134
+ deck["card b"] = 20
135
+ thing = []
136
+ deck.possible_starting_hands.each do |hand|
137
+ thing << [-1*deck.chance_to_draw(hand), hand]
138
+ end
139
+ p thing.sort
140
+ end
141
+ it "enumerates in descending order of likelihood" do
142
+ pending "discovery of the algorithm"
143
+ best_odds = 1
144
+ deck = Deck.new
145
+ deck["card a"] = 20
146
+ deck["card b"] = 20
147
+ deck.possible_starting_hands.each do |hand|
148
+ chance = deck.chance_to_draw(hand)
149
+ chance.should <= best_odds
150
+ best_odds = chance
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
data/spec/fixnum_spec.rb CHANGED
@@ -5,7 +5,7 @@ module Tabletop
5
5
  describe "#dX" do
6
6
  it "generates a pool of the appropriate size and type" do
7
7
  1.d6.should be_instance_of(Pool)
8
- 4.d7.dice.should == ["4d7"]
8
+ 4.d7.d_notation.should == ["4d7"]
9
9
  10.d100.should be_instance_of(Pool)
10
10
  end
11
11
 
@@ -23,7 +23,7 @@ module Tabletop
23
23
  sotc = 4.dF
24
24
  sotc.should be_instance_of(Pool)
25
25
  sotc.all? { |d| d.instance_of?(FudgeDie) }.should be_true
26
- sotc.dice.should == ["4dF"]
26
+ sotc.d_notation.should == ["4dF"]
27
27
  end
28
28
  end
29
29
  end
data/spec/pool_spec.rb CHANGED
@@ -33,9 +33,9 @@ module Tabletop
33
33
  end
34
34
  end
35
35
 
36
- describe "#dice" do
36
+ describe "#d_notation" do
37
37
  it "should return an array of dice notation" do
38
- Pool.new("d20 2dF 2d10").dice.should == ["2d10","d20", "2dF"]
38
+ Pool.new("d20 2dF 2d10").d_notation.should == ["2d10","d20", "2dF"]
39
39
  end
40
40
  end
41
41
 
@@ -48,42 +48,39 @@ module Tabletop
48
48
  end
49
49
 
50
50
  describe "+" do
51
- before(:each) do
52
- @a = 5.d6
53
- end
54
51
  context "adding a number" do
55
52
  it "should return the pool's sum plus the number" do
56
- (@a + 5).should == @a.sum + 5
53
+ (d6_set + 5).should == d6_set.sum + 5
57
54
  end
58
55
  end
59
56
  context "adding a randomizer" do
60
57
  it "adds to the pool" do
61
- mixed = @a + Die.new
62
- mixed.length.should == 6
58
+ (d6_set + Die.new).length.should == 7
63
59
  end
64
60
  it "preserves class" do
65
- (@a + FudgeDie.new(value:-1))[-1].value.should == -1
66
- (@a + Coin.new)[-1].should respond_to :flip
61
+ (d6_set + FudgeDie.new(value:-1))[-1].value.should == -1
62
+ (d6_set + Coin.new)[-1].should respond_to :flip
67
63
  end
68
64
  end
69
65
  context "adding another pool" do
70
- before(:each) do
71
- @b = 4.d4
72
- @merge = @a+@b
73
- end
66
+ let(:d4_set) { 4.d4 }
67
+ let(:merge) { d6_set+d4_set }
74
68
  it "should make a union of the pools" do
75
- @merge.values.should == @a.values + @b.values
69
+ merge.values.should == d6_set.values + d4_set.values
76
70
  end
77
71
  it "should make new die objects" do
78
- @merge.roll
79
- @merge.values.should_not == @a.values + @b.values
72
+ a = 1.d6
73
+ b = 1.d4
74
+ merge = a+b
75
+ merge.roll
76
+ merge.values.should_not == a.values + b.values
80
77
  end
81
78
  it "should persist die types" do
82
79
  (Pool.new("d6")+Pool.new("dF"))[1].should be_instance_of(FudgeDie)
83
80
  (Pool.new("d6")+Pool.new([Coin.new]))[1].should respond_to(:flip)
84
81
  end
85
82
  it "should alter #dice accordingly" do
86
- (Pool.new("2d17 d6")+Pool.new("3d17")).dice.should == ["d6", "5d17"]
83
+ (Pool.new("2d17 d6")+Pool.new("3d17")).d_notation.should == ["d6", "5d17"]
87
84
  end
88
85
  end
89
86
  context "adding anything else" do
@@ -121,6 +118,13 @@ module Tabletop
121
118
  end
122
119
 
123
120
  describe "#roll" do
121
+ before :each do
122
+ @d1, @d2, @d3= double("a die"), double("a die"), double("a die")
123
+ @d1.stub(:value).and_return(1)
124
+ @d2.stub(:value).and_return(2)
125
+ @d3.stub(:value).and_return(3)
126
+ @p = Pool.new([@d1, @d2, @d3])
127
+ end
124
128
  it "should return the Pool itself" do
125
129
  actual = d6_set.roll
126
130
  d6_set.length.times do |i|
@@ -128,15 +132,34 @@ module Tabletop
128
132
  actual[i].sides.should == d6_set[i].sides
129
133
  end
130
134
  end
131
-
135
+
132
136
  it "calls roll on its contents" do
133
- d = double("a die")
134
- d.should_receive(:roll)
135
- Pool.new([d]).roll
137
+ @d1.should_receive(:roll)
138
+ @d2.should_receive(:roll)
139
+ @d3.should_receive(:roll)
140
+ @p.roll
141
+ end
142
+ it "can roll only dice less than a certain value" do
143
+ @d1.should_receive(:roll)
144
+ @d2.should_not_receive(:roll)
145
+ @d3.should_not_receive(:roll)
146
+
147
+ @p.roll(:value_under=>2)
148
+ end
149
+ it "can roll only dice above a certain value" do
150
+ @d1.should_not_receive(:roll)
151
+ @d2.should_not_receive(:roll)
152
+ @d3.should_receive(:roll)
153
+
154
+ @p.roll(:value_over=>2)
155
+ end
156
+ it "can roll only dice equal to a certain value" do
157
+ @d1.should_not_receive(:roll)
158
+ @d2.should_receive(:roll)
159
+ @d3.should_not_receive(:roll)
160
+
161
+ @p.roll(:value_equals=>2)
136
162
  end
137
- it "can roll only dice below a certain value"
138
- it "can roll only dice above a certain value"
139
- it "can roll only dice equal to a certain value"
140
163
  end
141
164
 
142
165
  describe "#roll_if" do
data/spec/spec_helper.rb CHANGED
@@ -1,15 +1,4 @@
1
- require 'bundler'
2
- begin
3
- Bundler.setup
4
- rescue Bundler::BundlerError => e
5
- $stderr.puts e.message
6
- $stderr.puts "Run `bundle install` to install missing gems"
7
- exit e.status_code
8
- end
9
-
1
+ require 'simplecov'
2
+ SimpleCov.start
10
3
  require 'rspec'
11
- require 'tabletop'
12
-
13
- # Requires supporting files with custom matchers and macros, etc,
14
- # in ./support/ and its subdirectories.
15
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
4
+ require 'tabletop'
data/tabletop.gemspec CHANGED
@@ -31,5 +31,6 @@ Gem::Specification.new do |s|
31
31
  s.add_development_dependency 'bundler'
32
32
  s.add_development_dependency 'rake'
33
33
  s.add_development_dependency 'rdoc'
34
+ s.add_development_dependency 'simplecov'
34
35
  end
35
36
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: tabletop
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.0
5
+ version: 0.4.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nick Novitski
@@ -67,6 +67,17 @@ dependencies:
67
67
  type: :development
68
68
  prerelease: false
69
69
  version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
72
+ requirement: &id006 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *id006
70
81
  description: Tabletop aims to provide a simple way of describing, automating and tracking the tools and tasks involved in "analog" games, determining results from the motions and properties of various dice and chips.
71
82
  email: nicknovitski@gmail.com
72
83
  executables: []
@@ -77,6 +88,56 @@ extra_rdoc_files:
77
88
  - LICENSE
78
89
  - README.markdown
79
90
  files:
91
+ - coverage/assets/0.5.3/app.js
92
+ - coverage/assets/0.5.3/fancybox/blank.gif
93
+ - coverage/assets/0.5.3/fancybox/fancy_close.png
94
+ - coverage/assets/0.5.3/fancybox/fancy_loading.png
95
+ - coverage/assets/0.5.3/fancybox/fancy_nav_left.png
96
+ - coverage/assets/0.5.3/fancybox/fancy_nav_right.png
97
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_e.png
98
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_n.png
99
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png
100
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png
101
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_s.png
102
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_se.png
103
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png
104
+ - coverage/assets/0.5.3/fancybox/fancy_shadow_w.png
105
+ - coverage/assets/0.5.3/fancybox/fancy_title_left.png
106
+ - coverage/assets/0.5.3/fancybox/fancy_title_main.png
107
+ - coverage/assets/0.5.3/fancybox/fancy_title_over.png
108
+ - coverage/assets/0.5.3/fancybox/fancy_title_right.png
109
+ - coverage/assets/0.5.3/fancybox/fancybox-x.png
110
+ - coverage/assets/0.5.3/fancybox/fancybox-y.png
111
+ - coverage/assets/0.5.3/fancybox/fancybox.png
112
+ - coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css
113
+ - coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js
114
+ - coverage/assets/0.5.3/favicon_green.png
115
+ - coverage/assets/0.5.3/favicon_red.png
116
+ - coverage/assets/0.5.3/favicon_yellow.png
117
+ - coverage/assets/0.5.3/highlight.css
118
+ - coverage/assets/0.5.3/highlight.pack.js
119
+ - coverage/assets/0.5.3/jquery-1.6.2.min.js
120
+ - coverage/assets/0.5.3/jquery.dataTables.min.js
121
+ - coverage/assets/0.5.3/jquery.timeago.js
122
+ - coverage/assets/0.5.3/jquery.url.js
123
+ - coverage/assets/0.5.3/loading.gif
124
+ - coverage/assets/0.5.3/magnify.png
125
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
126
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
127
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
128
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
129
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png
130
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
131
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
132
+ - coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
133
+ - coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png
134
+ - coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png
135
+ - coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png
136
+ - coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png
137
+ - coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png
138
+ - coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css
139
+ - coverage/assets/0.5.3/stylesheet.css
140
+ - coverage/index.html
80
141
  - doc/created.rid
81
142
  - doc/Fixnum.html
82
143
  - doc/images/brick.png
@@ -124,6 +185,7 @@ files:
124
185
  - Gemfile
125
186
  - lib/fixnum.rb
126
187
  - lib/tabletop/condition.rb
188
+ - lib/tabletop/deck.rb
127
189
  - lib/tabletop/pool.rb
128
190
  - lib/tabletop/randomizers.rb
129
191
  - lib/tabletop/roll.rb
@@ -134,6 +196,57 @@ files:
134
196
  - Rakefile
135
197
  - README.markdown
136
198
  - spec/condition_spec.rb
199
+ - spec/coverage/assets/0.5.3/app.js
200
+ - spec/coverage/assets/0.5.3/fancybox/blank.gif
201
+ - spec/coverage/assets/0.5.3/fancybox/fancy_close.png
202
+ - spec/coverage/assets/0.5.3/fancybox/fancy_loading.png
203
+ - spec/coverage/assets/0.5.3/fancybox/fancy_nav_left.png
204
+ - spec/coverage/assets/0.5.3/fancybox/fancy_nav_right.png
205
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_e.png
206
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_n.png
207
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png
208
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png
209
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_s.png
210
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_se.png
211
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png
212
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_w.png
213
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_left.png
214
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_main.png
215
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_over.png
216
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_right.png
217
+ - spec/coverage/assets/0.5.3/fancybox/fancybox-x.png
218
+ - spec/coverage/assets/0.5.3/fancybox/fancybox-y.png
219
+ - spec/coverage/assets/0.5.3/fancybox/fancybox.png
220
+ - spec/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css
221
+ - spec/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js
222
+ - spec/coverage/assets/0.5.3/favicon_green.png
223
+ - spec/coverage/assets/0.5.3/favicon_red.png
224
+ - spec/coverage/assets/0.5.3/favicon_yellow.png
225
+ - spec/coverage/assets/0.5.3/highlight.css
226
+ - spec/coverage/assets/0.5.3/highlight.pack.js
227
+ - spec/coverage/assets/0.5.3/jquery-1.6.2.min.js
228
+ - spec/coverage/assets/0.5.3/jquery.dataTables.min.js
229
+ - spec/coverage/assets/0.5.3/jquery.timeago.js
230
+ - spec/coverage/assets/0.5.3/jquery.url.js
231
+ - spec/coverage/assets/0.5.3/loading.gif
232
+ - spec/coverage/assets/0.5.3/magnify.png
233
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
234
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
235
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
236
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
237
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png
238
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
239
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
240
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
241
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png
242
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png
243
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png
244
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png
245
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png
246
+ - spec/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css
247
+ - spec/coverage/assets/0.5.3/stylesheet.css
248
+ - spec/coverage/index.html
249
+ - spec/deck_spec.rb
137
250
  - spec/fixnum_spec.rb
138
251
  - spec/pool_spec.rb
139
252
  - spec/randomizers_spec.rb
@@ -155,7 +268,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
268
  requirements:
156
269
  - - ">="
157
270
  - !ruby/object:Gem::Version
158
- hash: 302190484113960974
271
+ hash: -2442987682132944901
159
272
  segments:
160
273
  - 0
161
274
  version: "0"
@@ -174,6 +287,57 @@ specification_version: 3
174
287
  summary: An RPG and tabletop game library
175
288
  test_files:
176
289
  - spec/condition_spec.rb
290
+ - spec/coverage/assets/0.5.3/app.js
291
+ - spec/coverage/assets/0.5.3/fancybox/blank.gif
292
+ - spec/coverage/assets/0.5.3/fancybox/fancy_close.png
293
+ - spec/coverage/assets/0.5.3/fancybox/fancy_loading.png
294
+ - spec/coverage/assets/0.5.3/fancybox/fancy_nav_left.png
295
+ - spec/coverage/assets/0.5.3/fancybox/fancy_nav_right.png
296
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_e.png
297
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_n.png
298
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png
299
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png
300
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_s.png
301
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_se.png
302
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png
303
+ - spec/coverage/assets/0.5.3/fancybox/fancy_shadow_w.png
304
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_left.png
305
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_main.png
306
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_over.png
307
+ - spec/coverage/assets/0.5.3/fancybox/fancy_title_right.png
308
+ - spec/coverage/assets/0.5.3/fancybox/fancybox-x.png
309
+ - spec/coverage/assets/0.5.3/fancybox/fancybox-y.png
310
+ - spec/coverage/assets/0.5.3/fancybox/fancybox.png
311
+ - spec/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css
312
+ - spec/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js
313
+ - spec/coverage/assets/0.5.3/favicon_green.png
314
+ - spec/coverage/assets/0.5.3/favicon_red.png
315
+ - spec/coverage/assets/0.5.3/favicon_yellow.png
316
+ - spec/coverage/assets/0.5.3/highlight.css
317
+ - spec/coverage/assets/0.5.3/highlight.pack.js
318
+ - spec/coverage/assets/0.5.3/jquery-1.6.2.min.js
319
+ - spec/coverage/assets/0.5.3/jquery.dataTables.min.js
320
+ - spec/coverage/assets/0.5.3/jquery.timeago.js
321
+ - spec/coverage/assets/0.5.3/jquery.url.js
322
+ - spec/coverage/assets/0.5.3/loading.gif
323
+ - spec/coverage/assets/0.5.3/magnify.png
324
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
325
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
326
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
327
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
328
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png
329
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
330
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
331
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
332
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png
333
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png
334
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png
335
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png
336
+ - spec/coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png
337
+ - spec/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css
338
+ - spec/coverage/assets/0.5.3/stylesheet.css
339
+ - spec/coverage/index.html
340
+ - spec/deck_spec.rb
177
341
  - spec/fixnum_spec.rb
178
342
  - spec/pool_spec.rb
179
343
  - spec/randomizers_spec.rb