liars_dice 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/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
|