liars_dice 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/liars_dice.gemspec +2 -2
- data/lib/liars_dice/command_line_watcher.rb +1 -0
- data/lib/liars_dice/engine.rb +22 -8
- data/lib/liars_dice/event.rb +9 -0
- data/lib/liars_dice/watcher.rb +8 -2
- data/spec/engine_spec.rb +6 -6
- metadata +2 -2
data/liars_dice.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = 'liars_dice'
|
3
|
-
gem.version = '0.0.
|
4
|
-
gem.date = '2013-07-
|
3
|
+
gem.version = '0.0.3'
|
4
|
+
gem.date = '2013-07-09'
|
5
5
|
gem.summary = "Liar's Dice game"
|
6
6
|
gem.description = "A liar's dice botting environment, developed by Aisle50"
|
7
7
|
gem.authors = ['Ben Schmeckpeper', 'Chris Doyle', 'Max Page', 'Molly Struve']
|
@@ -8,6 +8,7 @@ module LiarsDice
|
|
8
8
|
append_after_bs lambda{|seat| puts "Seat #{seat} calls BS" }
|
9
9
|
append_after_game lambda{|winner| puts "Game over. Seat #{winner} wins." }
|
10
10
|
append_after_round lambda{|loser| puts "Seat #{loser} loses a die" }
|
11
|
+
append_after_invalid_bid lambda{|loser| puts "Seat #{loser} made an invalid bid" }
|
11
12
|
append_after_seats_assigned lambda{|assignments| assignments.each{|number, name| puts "Seat #{number}: #{name}" } }
|
12
13
|
end
|
13
14
|
end
|
data/lib/liars_dice/engine.rb
CHANGED
@@ -25,11 +25,7 @@ module LiarsDice
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def get_bid(seat)
|
28
|
-
|
29
|
-
unless valid_bid?(bid)
|
30
|
-
raise StandardError.new("Invalid Bid")
|
31
|
-
end
|
32
|
-
bid
|
28
|
+
seat.player.bid
|
33
29
|
end
|
34
30
|
|
35
31
|
def next_seat
|
@@ -63,20 +59,32 @@ module LiarsDice
|
|
63
59
|
while true
|
64
60
|
seat = next_seat
|
65
61
|
bid = get_bid(seat)
|
66
|
-
aces_wild = false if bid.face_value == 1
|
67
62
|
|
63
|
+
# An invalid bid ends the round and costs the bidder a die
|
64
|
+
unless valid_bid?(bid)
|
65
|
+
self.loser = seat
|
66
|
+
notify_invalid_bid(seat)
|
67
|
+
break
|
68
|
+
end
|
69
|
+
|
70
|
+
# If someone calls BS, figure out the loser and exit the loop
|
68
71
|
if bid.bs_called?
|
69
72
|
notify_bs(seat)
|
70
73
|
self.loser = bid_is_correct?(previous_bid, aces_wild) ? seat : previous_seat
|
71
|
-
notify_loser(loser)
|
72
|
-
loser.lose_die
|
73
74
|
break
|
74
75
|
end
|
75
76
|
|
77
|
+
# For a valid, non-BS bid, update wilds, record and notify the bid and prepare for the next bid
|
78
|
+
aces_wild = false if bid.face_value == 1
|
76
79
|
self.bids << bid
|
77
80
|
notify_bid(seat, bid)
|
78
81
|
previous_seat = seat
|
79
82
|
end
|
83
|
+
|
84
|
+
# It's an error if we get here without having set a loser
|
85
|
+
raise StandardError.new("Unknown loser") unless loser
|
86
|
+
notify_loser(loser)
|
87
|
+
loser.lose_die
|
80
88
|
end
|
81
89
|
|
82
90
|
def roll_dice
|
@@ -107,6 +115,12 @@ module LiarsDice
|
|
107
115
|
notify_watcher(event)
|
108
116
|
end
|
109
117
|
|
118
|
+
def notify_invalid_bid(seat)
|
119
|
+
event = InvalidBidEvent.new(seat.number)
|
120
|
+
notify_players(event)
|
121
|
+
notify_watcher(event)
|
122
|
+
end
|
123
|
+
|
110
124
|
def notify_loser(seat)
|
111
125
|
dice = seats.map(&:dice)
|
112
126
|
event = LoserEvent.new(seat.number, dice)
|
data/lib/liars_dice/event.rb
CHANGED
@@ -36,6 +36,15 @@ module LiarsDice
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
class InvalidBidEvent < Event
|
40
|
+
attr_accessor :seat_number
|
41
|
+
|
42
|
+
def initialize(seat_number)
|
43
|
+
self.seat_number = seat_number
|
44
|
+
super("Seat #{seat_number} made an invalid bid")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
39
48
|
class LoserEvent < Event
|
40
49
|
attr_accessor :seat_number, :dice
|
41
50
|
|
data/lib/liars_dice/watcher.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module LiarsDice
|
2
2
|
module Watcher
|
3
|
-
attr_reader :after_roll, :after_bid, :after_round, :after_bs, :after_game, :after_dice_rolled, :after_seats_assigned
|
3
|
+
attr_reader :after_roll, :after_bid, :after_round, :after_bs, :after_game, :after_dice_rolled, :after_seats_assigned, :after_invalid_bid
|
4
4
|
|
5
5
|
def append_after_bid(callback)
|
6
6
|
append_callback(:after_bid, callback)
|
@@ -26,6 +26,10 @@ module LiarsDice
|
|
26
26
|
append_callback(:after_seats_assigned, callback)
|
27
27
|
end
|
28
28
|
|
29
|
+
def append_after_invalid_bid(callback)
|
30
|
+
append_callback(:after_invalid_bid, callback)
|
31
|
+
end
|
32
|
+
|
29
33
|
def handle_event(event)
|
30
34
|
if event.is_a? BidMadeEvent
|
31
35
|
fire(:after_bid, event.seat_number, event.bid)
|
@@ -39,12 +43,14 @@ module LiarsDice
|
|
39
43
|
fire(:after_dice_rolled, event.dice)
|
40
44
|
elsif event.is_a? SeatsAssignedEvent
|
41
45
|
fire(:after_seats_assigned, event.seat_assignments)
|
46
|
+
elsif event.is_a? InvalidBidEvent
|
47
|
+
fire(:after_invalid_bid, event.seat_number)
|
42
48
|
end
|
43
49
|
end
|
44
50
|
|
45
51
|
private
|
46
52
|
def allowed_callbacks
|
47
|
-
[:after_bid, :after_bs, :after_dice_rolled, :after_game, :after_round, :after_seats_assigned]
|
53
|
+
[:after_bid, :after_bs, :after_dice_rolled, :after_game, :after_round, :after_seats_assigned, :after_invalid_bid]
|
48
54
|
end
|
49
55
|
|
50
56
|
def append_callback(callback_name, callback)
|
data/spec/engine_spec.rb
CHANGED
@@ -69,6 +69,12 @@ describe "Engine" do
|
|
69
69
|
engine.stub_chain(:loser, :lose_die)
|
70
70
|
end
|
71
71
|
|
72
|
+
it "picks the bidder if the bid was invalid" do
|
73
|
+
engine.stub(:valid_bid?).and_return(false)
|
74
|
+
engine.should_receive(:loser=).with(seat1)
|
75
|
+
engine.run_round
|
76
|
+
end
|
77
|
+
|
72
78
|
it "picks the bidder if the bid was incorrect" do
|
73
79
|
engine.stub(:bid_is_correct?).and_return(false)
|
74
80
|
engine.should_receive(:loser=).with(seat1)
|
@@ -164,14 +170,8 @@ describe "Engine" do
|
|
164
170
|
end
|
165
171
|
|
166
172
|
it "gets a bid from the seat's user" do
|
167
|
-
engine.stub(:valid_bid?).and_return(true)
|
168
173
|
engine.get_bid(seat).should == "bid"
|
169
174
|
end
|
170
|
-
|
171
|
-
it "raises an error if given an invalid bid" do
|
172
|
-
engine.stub(:valid_bid?).and_return(false)
|
173
|
-
expect { engine.get_bid(seat) }.to raise_error
|
174
|
-
end
|
175
175
|
end
|
176
176
|
|
177
177
|
describe "winner?" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: liars_dice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-07-
|
15
|
+
date: 2013-07-09 00:00:00.000000000Z
|
16
16
|
dependencies: []
|
17
17
|
description: A liar's dice botting environment, developed by Aisle50
|
18
18
|
email: dev@aisle50.com
|