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