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 CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'liars_dice'
3
- gem.version = '0.0.2'
4
- gem.date = '2013-07-02'
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
@@ -25,11 +25,7 @@ module LiarsDice
25
25
  end
26
26
 
27
27
  def get_bid(seat)
28
- bid = seat.player.bid
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)
@@ -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
 
@@ -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.2
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-02 00:00:00.000000000Z
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