acpc_poker_types 6.2.3 → 7.0.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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/lib/acpc_poker_types.rb +2 -2
  3. data/lib/acpc_poker_types/dealer_data.rb +9 -0
  4. data/lib/acpc_poker_types/{acpc_dealer_data → dealer_data}/action_messages.rb +10 -10
  5. data/lib/acpc_poker_types/{acpc_dealer_data → dealer_data}/hand_data.rb +4 -4
  6. data/lib/acpc_poker_types/{acpc_dealer_data → dealer_data}/hand_results.rb +8 -8
  7. data/lib/acpc_poker_types/{acpc_dealer_data → dealer_data}/log_file.rb +1 -1
  8. data/lib/acpc_poker_types/{acpc_dealer_data → dealer_data}/match_definition.rb +1 -1
  9. data/lib/acpc_poker_types/{acpc_dealer_data → dealer_data}/poker_match_data.rb +44 -56
  10. data/lib/acpc_poker_types/{player_group.rb → hand_player_group.rb} +1 -1
  11. data/lib/acpc_poker_types/match_state.rb +11 -8
  12. data/lib/acpc_poker_types/player.rb +50 -0
  13. data/lib/acpc_poker_types/players_at_the_table.rb +168 -0
  14. data/lib/acpc_poker_types/version.rb +1 -1
  15. data/spec/{action_messages_spec.rb → dealer_data/action_messages_spec.rb} +60 -61
  16. data/spec/{hand_data_spec.rb → dealer_data/hand_data_spec.rb} +26 -27
  17. data/spec/{hand_results_spec.rb → dealer_data/hand_results_spec.rb} +17 -18
  18. data/spec/{match_definition_spec.rb → dealer_data/match_definition_spec.rb} +10 -11
  19. data/spec/{poker_match_data_spec.rb → dealer_data/poker_match_data_spec.rb} +48 -7
  20. data/spec/{player_group_spec.rb → hand_player_group_spec.rb} +3 -10
  21. data/spec/hand_player_spec.rb +1 -1
  22. data/spec/match_state_spec.rb +118 -76
  23. data/spec/player_spec.rb +45 -0
  24. data/spec/players_at_the_table_spec.rb +133 -0
  25. metadata +60 -136
  26. data/lib/acpc_poker_types/acpc_dealer_data.rb +0 -9
  27. data/spec/coverage/assets/0.7.1/application.css +0 -1110
  28. data/spec/coverage/assets/0.7.1/application.js +0 -626
  29. data/spec/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  30. data/spec/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  31. data/spec/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  32. data/spec/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  33. data/spec/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  34. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  35. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  36. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  37. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  38. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  39. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  40. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  41. data/spec/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  42. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  43. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  44. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  45. data/spec/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  46. data/spec/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  47. data/spec/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  48. data/spec/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  49. data/spec/coverage/assets/0.7.1/favicon_green.png +0 -0
  50. data/spec/coverage/assets/0.7.1/favicon_red.png +0 -0
  51. data/spec/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  52. data/spec/coverage/assets/0.7.1/loading.gif +0 -0
  53. data/spec/coverage/assets/0.7.1/magnify.png +0 -0
  54. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  55. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  56. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  57. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  58. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  59. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  60. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  61. data/spec/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  62. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  63. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  64. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  65. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  66. data/spec/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  67. data/spec/coverage/index.html +0 -72
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 165a5b649ef7d57225688b8a01f008915a316c81
4
- data.tar.gz: 0f817fe61d191d802eaba88c97edd957a9d6075c
3
+ metadata.gz: 78f0bab62893fa563b2b696c90844c647533403e
4
+ data.tar.gz: 3462780103b206dd0c9b1952bb06d5e43760c24b
5
5
  SHA512:
6
- metadata.gz: 8ea2b48f921dbfb58f18e3cf38b963f2f0e7f164d28e3f3b6272428fe88063a6491152714a057bb83702421d3dd43cdb9d730c8c04999fdbd47a39aee8f88986
7
- data.tar.gz: dc253a22ef1eb28b23919134e565ccb4c06dcac52cdc3905646096fd921f28c374f8b54cfda9aa026714c7d69c98425172fcb471678d70612dfdc24bec8d4a4d
6
+ metadata.gz: 4418652bec1d5c84b867e72fabd230132fa50d14b64f6a4f4bf3ed68149f68f947aad717fd533b33e2ed61e49d3a0c5cd03d59e070e15bd832ac4a08e36a186f
7
+ data.tar.gz: ab329609151c04988b321aeb400b2c14a8b09b64722e172ce1438e683ddc2055769614cf857e8d5114e4782117fcdaf3c1b795735b64b896cb0155f2549f8a5d
@@ -5,12 +5,12 @@ require "acpc_poker_types/card"
5
5
  require "acpc_poker_types/chip_stack"
6
6
  require "acpc_poker_types/game_definition"
7
7
  require "acpc_poker_types/hand"
8
- require 'acpc_poker_types/player_group'
8
+ require 'acpc_poker_types/hand_player_group'
9
9
  require "acpc_poker_types/match_state"
10
10
  require "acpc_poker_types/pile_of_cards"
11
11
  require "acpc_poker_types/rank"
12
12
  require "acpc_poker_types/suit"
13
- require "acpc_poker_types/acpc_dealer_data"
13
+ require "acpc_poker_types/dealer_data"
14
14
  require 'acpc_poker_types/seat'
15
15
 
16
16
  module AcpcPokerTypes
@@ -0,0 +1,9 @@
1
+ require 'acpc_poker_types/dealer_data/action_messages'
2
+ require 'acpc_poker_types/dealer_data/hand_data'
3
+ require 'acpc_poker_types/dealer_data/hand_results'
4
+ require 'acpc_poker_types/dealer_data/poker_match_data'
5
+ require 'acpc_poker_types/dealer_data/match_definition'
6
+ require 'acpc_poker_types/dealer_data/log_file'
7
+
8
+ module AcpcPokerTypes::DealerData
9
+ end
@@ -1,10 +1,10 @@
1
1
  require 'acpc_poker_types/match_state'
2
2
  require 'acpc_poker_types/poker_action'
3
3
 
4
- require 'acpc_poker_types/acpc_dealer_data/match_definition'
5
- require 'acpc_poker_types/acpc_dealer_data/log_file'
4
+ require 'acpc_poker_types/dealer_data/match_definition'
5
+ require 'acpc_poker_types/dealer_data/log_file'
6
6
 
7
- module AcpcPokerTypes::AcpcDealerData
7
+ module AcpcPokerTypes::DealerData
8
8
  class ActionMessages
9
9
  attr_reader(
10
10
  :data, :final_score, :match_def
@@ -73,9 +73,9 @@ module AcpcPokerTypes::AcpcDealerData
73
73
  end
74
74
 
75
75
  def self.parse_to_or_from_message(message)
76
- parsed_message = AcpcPokerTypes::AcpcDealerData::ActionMessages.parse_to_message(message)
76
+ parsed_message = AcpcPokerTypes::DealerData::ActionMessages.parse_to_message(message)
77
77
  if parsed_message.nil?
78
- AcpcPokerTypes::AcpcDealerData::ActionMessages.parse_from_message(message)
78
+ AcpcPokerTypes::DealerData::ActionMessages.parse_from_message(message)
79
79
  else
80
80
  parsed_message
81
81
  end
@@ -87,8 +87,8 @@ module AcpcPokerTypes::AcpcDealerData
87
87
  game_def_directory,
88
88
  num_hands=nil
89
89
  )
90
- AcpcPokerTypes::AcpcDealerData::LogFile.open(acpc_log_file_path, 'r') do |file|
91
- AcpcPokerTypes::AcpcDealerData::ActionMessages.parse file, player_names, game_def_directory, num_hands
90
+ AcpcPokerTypes::DealerData::LogFile.open(acpc_log_file_path, 'r') do |file|
91
+ AcpcPokerTypes::DealerData::ActionMessages.parse file, player_names, game_def_directory, num_hands
92
92
  end
93
93
  end
94
94
 
@@ -104,9 +104,9 @@ module AcpcPokerTypes::AcpcDealerData
104
104
  @match_def = nil
105
105
  @data = acpc_log_statements.inject([]) do |accumulating_data, log_line|
106
106
  if @match_def.nil?
107
- @match_def = AcpcPokerTypes::AcpcDealerData::MatchDefinition.parse(log_line, player_names, game_def_directory)
107
+ @match_def = AcpcPokerTypes::DealerData::MatchDefinition.parse(log_line, player_names, game_def_directory)
108
108
  else
109
- parsed_message = AcpcPokerTypes::AcpcDealerData::ActionMessages.parse_to_or_from_message(log_line)
109
+ parsed_message = AcpcPokerTypes::DealerData::ActionMessages.parse_to_or_from_message(log_line)
110
110
  if parsed_message
111
111
  if (
112
112
  accumulating_data.empty? ||
@@ -120,7 +120,7 @@ module AcpcPokerTypes::AcpcDealerData
120
120
  end
121
121
  accumulating_data.last << parsed_message
122
122
  else
123
- @final_score = AcpcPokerTypes::AcpcDealerData::ActionMessages.parse_score(log_line) unless @final_score
123
+ @final_score = AcpcPokerTypes::DealerData::ActionMessages.parse_score(log_line) unless @final_score
124
124
  end
125
125
  end
126
126
 
@@ -1,10 +1,10 @@
1
- require 'acpc_poker_types/acpc_dealer_data/match_definition'
1
+ require 'acpc_poker_types/dealer_data/match_definition'
2
2
 
3
3
  require 'contextual_exceptions'
4
4
  using ContextualExceptions::ClassRefinement
5
5
 
6
6
  # Refinement for easy boundary checking
7
- module AcpcPokerTypes::AcpcDealerData
7
+ module AcpcPokerTypes::DealerData
8
8
  module BoundaryCheckingRefinement
9
9
  refine Array do
10
10
  def in_bounds?(i)
@@ -13,9 +13,9 @@ module AcpcPokerTypes::AcpcDealerData
13
13
  end
14
14
  end
15
15
  end
16
- using AcpcPokerTypes::AcpcDealerData::BoundaryCheckingRefinement
16
+ using AcpcPokerTypes::DealerData::BoundaryCheckingRefinement
17
17
 
18
- module AcpcPokerTypes::AcpcDealerData
18
+ module AcpcPokerTypes::DealerData
19
19
  class HandData
20
20
  exceptions :invalid_data, :names_do_not_match
21
21
 
@@ -1,7 +1,7 @@
1
- require 'acpc_poker_types/acpc_dealer_data/match_definition'
2
- require 'acpc_poker_types/acpc_dealer_data/log_file'
1
+ require 'acpc_poker_types/dealer_data/match_definition'
2
+ require 'acpc_poker_types/dealer_data/log_file'
3
3
 
4
- module AcpcPokerTypes::AcpcDealerData
4
+ module AcpcPokerTypes::DealerData
5
5
  class HandResults
6
6
  attr_reader :data, :final_score, :match_def
7
7
 
@@ -45,8 +45,8 @@ module AcpcPokerTypes::AcpcDealerData
45
45
  game_def_directory,
46
46
  num_hands=nil
47
47
  )
48
- AcpcPokerTypes::AcpcDealerData::LogFile.open(acpc_log_file_path, 'r') do |file|
49
- AcpcPokerTypes::AcpcDealerData::HandResults.parse file, player_names, game_def_directory, num_hands
48
+ AcpcPokerTypes::DealerData::LogFile.open(acpc_log_file_path, 'r') do |file|
49
+ AcpcPokerTypes::DealerData::HandResults.parse file, player_names, game_def_directory, num_hands
50
50
  end
51
51
  end
52
52
 
@@ -58,9 +58,9 @@ module AcpcPokerTypes::AcpcDealerData
58
58
 
59
59
  @data = acpc_log_statements.inject([]) do |accumulating_data, log_line|
60
60
  if @match_def.nil?
61
- @match_def = AcpcPokerTypes::AcpcDealerData::MatchDefinition.parse(log_line, player_names, game_def_directory)
61
+ @match_def = AcpcPokerTypes::DealerData::MatchDefinition.parse(log_line, player_names, game_def_directory)
62
62
  else
63
- parsed_message = AcpcPokerTypes::AcpcDealerData::HandResults.parse_state(log_line)
63
+ parsed_message = AcpcPokerTypes::DealerData::HandResults.parse_state(log_line)
64
64
  if parsed_message
65
65
  # Yes, this causes one more result to be parsed than is saved as long as
66
66
  # the number of hands is less than the total number in the log, but this
@@ -68,7 +68,7 @@ module AcpcPokerTypes::AcpcDealerData
68
68
  break accumulating_data if accumulating_data.length == num_hands
69
69
  accumulating_data << parsed_message
70
70
  else
71
- @final_score = AcpcPokerTypes::AcpcDealerData::HandResults.parse_score(log_line) unless @final_score
71
+ @final_score = AcpcPokerTypes::DealerData::HandResults.parse_score(log_line) unless @final_score
72
72
  end
73
73
  end
74
74
 
@@ -1,5 +1,5 @@
1
1
  # Wrapper class to enable mocking log files in tests
2
- module AcpcPokerTypes::AcpcDealerData
2
+ module AcpcPokerTypes::DealerData
3
3
  class LogFile < File
4
4
  end
5
5
  end
@@ -5,7 +5,7 @@ require 'acpc_poker_types/game_definition'
5
5
  require 'contextual_exceptions'
6
6
  using ContextualExceptions::ClassRefinement
7
7
 
8
- module AcpcPokerTypes::AcpcDealerData
8
+ module AcpcPokerTypes::DealerData
9
9
  class MatchDefinition
10
10
 
11
11
  exceptions :incorrect_number_of_player_names
@@ -1,15 +1,15 @@
1
1
  require 'celluloid/autostart'
2
2
 
3
- require 'acpc_poker_types/acpc_dealer_data/action_messages'
4
- require 'acpc_poker_types/acpc_dealer_data/hand_data'
5
- require 'acpc_poker_types/acpc_dealer_data/hand_results'
6
- require 'acpc_poker_types/acpc_dealer_data/match_definition'
3
+ require 'acpc_poker_types/dealer_data/action_messages'
4
+ require 'acpc_poker_types/dealer_data/hand_data'
5
+ require 'acpc_poker_types/dealer_data/hand_results'
6
+ require 'acpc_poker_types/dealer_data/match_definition'
7
7
 
8
8
  require 'contextual_exceptions'
9
9
  using ContextualExceptions::ClassRefinement
10
10
 
11
11
  module AcpcPokerTypes
12
- module AcpcDealerData
12
+ module DealerData
13
13
 
14
14
  class PokerMatchData
15
15
  exceptions :match_definitions_do_not_match, :final_scores_do_not_match, :data_inconsistent, :names_do_not_match
@@ -23,15 +23,15 @@ class PokerMatchData
23
23
  :match_def,
24
24
  # @returns [Integer] Zero-index turn number within the hand
25
25
  :hand_number,
26
- # @returns [AcpcDealerData::HandData] Data from each hand
26
+ # @returns [DealerData::HandData] Data from each hand
27
27
  :data,
28
- # @returns [Array<AcpcDealerData::PokerMatchData::Player>]
28
+ # @returns [Array<DealerData::PokerMatchData::Player>]
29
29
  :players,
30
30
  # @returns [Integer] Seat of the active player
31
31
  :seat
32
32
  )
33
33
 
34
- # @returns [AcpcDealerData::PokerMatchData]
34
+ # @returns [DealerData::PokerMatchData]
35
35
  def self.parse_files(
36
36
  action_messages_file,
37
37
  result_messages_file,
@@ -40,7 +40,7 @@ class PokerMatchData
40
40
  num_hands=nil
41
41
  )
42
42
  parsed_action_messages = Celluloid::Future.new do
43
- AcpcDealerData::ActionMessages.parse_file(
43
+ DealerData::ActionMessages.parse_file(
44
44
  action_messages_file,
45
45
  player_names,
46
46
  dealer_directory,
@@ -48,7 +48,7 @@ class PokerMatchData
48
48
  )
49
49
  end
50
50
  parsed_hand_results = Celluloid::Future.new do
51
- AcpcDealerData::HandResults.parse_file(
51
+ DealerData::HandResults.parse_file(
52
52
  result_messages_file,
53
53
  player_names,
54
54
  dealer_directory,
@@ -64,7 +64,7 @@ class PokerMatchData
64
64
  )
65
65
  end
66
66
 
67
- # @returns [AcpcDealerData::PokerMatchData]
67
+ # @returns [DealerData::PokerMatchData]
68
68
  def self.parse(
69
69
  action_messages,
70
70
  result_messages,
@@ -73,7 +73,7 @@ class PokerMatchData
73
73
  num_hands=nil
74
74
  )
75
75
  parsed_action_messages = Celluloid::Future.new do
76
- AcpcDealerData::ActionMessages.parse(
76
+ DealerData::ActionMessages.parse(
77
77
  action_messages,
78
78
  player_names,
79
79
  dealer_directory,
@@ -81,7 +81,7 @@ class PokerMatchData
81
81
  )
82
82
  end
83
83
  parsed_hand_results = Celluloid::Future.new do
84
- AcpcDealerData::HandResults.parse(
84
+ DealerData::HandResults.parse(
85
85
  result_messages,
86
86
  player_names,
87
87
  dealer_directory,
@@ -150,10 +150,15 @@ class PokerMatchData
150
150
  self
151
151
  end
152
152
 
153
- def end_hand!
153
+ def distribute_chips!
154
154
  @players.each do |plyr|
155
155
  plyr.balance += hand_player(plyr).balance
156
156
  end
157
+
158
+ self
159
+ end
160
+
161
+ def end_hand!
157
162
  current_hand.end_hand!
158
163
 
159
164
  self
@@ -199,6 +204,8 @@ class PokerMatchData
199
204
  match_state = current_hand.current_match_state(seat)
200
205
  end
201
206
 
207
+ distribute_chips! if current_hand.final_turn?
208
+
202
209
  self
203
210
  end
204
211
 
@@ -211,11 +218,6 @@ class PokerMatchData
211
218
  self
212
219
  end
213
220
 
214
- def match_has_another_round?(current_round, turn_index, turns_taken)
215
- new_round?(current_round, turn_index) ||
216
- players_all_in?(current_round, turn_index, turns_taken)
217
- end
218
-
219
221
  def hand_started?
220
222
  @hand_number &&
221
223
  current_hand.turn_number &&
@@ -223,22 +225,7 @@ class PokerMatchData
223
225
  end
224
226
 
225
227
  def player_acting_sequence
226
- sequence = []
227
-
228
- return sequence unless hand_started?
229
-
230
- turns_taken = current_hand.data[0..current_hand.turn_number-1]
231
- turns_taken.each_with_index do |turn, turn_index|
232
- next unless turn.action_message
233
-
234
- sequence[turn.action_message.state.round] ||= []
235
- sequence[turn.action_message.state.round] << turn.action_message.seat
236
- if match_has_another_round?(sequence.length - 1, turn_index, turns_taken)
237
- sequence << []
238
- end
239
- end
240
-
241
- sequence
228
+ sequence_from_action_messages(:seat)
242
229
  end
243
230
 
244
231
  def current_hand
@@ -273,7 +260,6 @@ class PokerMatchData
273
260
  current_hand.current_match_state(plyr.seat).position_relative_to_dealer
274
261
  end
275
262
 
276
- # @todo Untested
277
263
  # @return [String] player acting sequence as a string.
278
264
  def player_acting_sequence_string
279
265
  (player_acting_sequence.map { |per_round| per_round.join('') }).join('/')
@@ -283,39 +269,40 @@ class PokerMatchData
283
269
  current_hand.next_action.seat == @seat
284
270
  end
285
271
  def betting_sequence
272
+ sequence_from_action_messages(:action)
273
+ end
274
+ def betting_sequence_string
275
+ (betting_sequence.map do |per_round|
276
+ (per_round.map{|action| action.to_acpc}).join('')
277
+ end).join('/')
278
+ end
279
+
280
+ protected
281
+
282
+ def sequence_from_action_messages(attribute)
286
283
  sequence = [[]]
287
284
 
288
- if (
289
- @hand_number.nil? ||
290
- current_hand.turn_number.nil? ||
291
- current_hand.turn_number < 1
292
- )
293
- return sequence
294
- end
285
+ return sequence unless hand_started?
295
286
 
296
287
  turns_taken = current_hand.data[0..current_hand.turn_number-1]
297
288
  turns_taken.each_with_index do |turn, turn_index|
298
289
  next unless turn.action_message
299
290
 
300
- sequence[turn.action_message.state.round] << turn.action_message.action
291
+ sequence[turn.action_message.state.round] ||= []
292
+ sequence[turn.action_message.state.round] << turn.action_message[attribute]
301
293
 
302
- if (
303
- new_round?(sequence.length - 1 , turn_index) ||
304
- players_all_in?(sequence.length - 1, turn_index, turns_taken)
305
- )
294
+ if new_round?(sequence.length - 1, turn_index)
306
295
  sequence << []
307
296
  end
297
+ if players_all_in?(sequence.length - 1, turn_index, turns_taken)
298
+ while sequence.length < @match_def.game_def.number_of_rounds
299
+ sequence << []
300
+ end
301
+ end
308
302
  end
309
303
 
310
304
  sequence
311
305
  end
312
- def betting_sequence_string
313
- (betting_sequence.map do |per_round|
314
- (per_round.map{|action| action.to_acpc}).join('')
315
- end).join('/')
316
- end
317
-
318
- protected
319
306
 
320
307
  def initialize_players!
321
308
  @players = @match_def.player_names.length.times.map do |seat|
@@ -346,7 +333,7 @@ class PokerMatchData
346
333
  def set_data!(parsed_action_messages, parsed_hand_results)
347
334
  @data = []
348
335
  parsed_action_messages.data.zip(parsed_hand_results.data).each do |action_messages_by_hand, hand_result|
349
- @data << AcpcDealerData::HandData.new(
336
+ @data << DealerData::HandData.new(
350
337
  @match_def,
351
338
  action_messages_by_hand,
352
339
  hand_result
@@ -365,6 +352,7 @@ class PokerMatchData
365
352
  end) != @players.length - 1
366
353
  end
367
354
  def new_round?(current_round, turn_index)
355
+ current_hand &&
368
356
  current_hand.data.length > turn_index + 1 &&
369
357
  current_hand.data[turn_index + 1].action_message &&
370
358
  current_hand.data[turn_index + 1].action_message.state.round > current_round
@@ -6,7 +6,7 @@ require 'acpc_poker_types/hand_player'
6
6
  # Model to parse and manage information from a given match state string.
7
7
  module AcpcPokerTypes
8
8
 
9
- class PlayerGroup < DelegateClass(Array)
9
+ class HandPlayerGroup < DelegateClass(Array)
10
10
  attr_reader :players
11
11
 
12
12
  def initialize(all_hands, stacks, blinds)
@@ -4,7 +4,7 @@ require 'acpc_poker_types/rank'
4
4
  require 'acpc_poker_types/suit'
5
5
  require 'acpc_poker_types/poker_action'
6
6
  require 'acpc_poker_types/hand_player'
7
- require 'acpc_poker_types/player_group'
7
+ require 'acpc_poker_types/hand_player_group'
8
8
 
9
9
  module AcpcPokerTypes
10
10
  module Indices
@@ -144,7 +144,7 @@ class MatchState
144
144
  @betting_sequence ||= if @betting_sequence_string.empty?
145
145
  [[]]
146
146
  else
147
- lcl_betting_sequence = @betting_sequence_string.split(
147
+ sequence = @betting_sequence_string.split(
148
148
  BETTING_SEQUENCE_SEPARATOR
149
149
  ).map do |betting_string_per_round|
150
150
  actions_from_acpc_characters(betting_string_per_round).map do |action|
@@ -153,8 +153,10 @@ class MatchState
153
153
  end
154
154
 
155
155
  # Adjust the number of rounds if the last action was the last action in the round
156
- lcl_betting_sequence << [] if first_state_of_round?
157
- lcl_betting_sequence
156
+ while sequence.length <= round
157
+ sequence << []
158
+ end
159
+ sequence
158
160
  end
159
161
  end
160
162
 
@@ -251,14 +253,14 @@ class MatchState
251
253
 
252
254
  # @param stacks [Array<#to_f>]
253
255
  # @param blinds [Array<#to_f>]
254
- # @return [PlayerGroup] The state of the players in this hand at the
256
+ # @return [HandPlayerGroup] The state of the players in this hand at the
255
257
  # when the hand began.
256
258
  def players_at_hand_start(stacks, blinds)
257
- PlayerGroup.new all_hands, stacks, blinds
259
+ HandPlayerGroup.new all_hands, stacks, blinds
258
260
  end
259
261
 
260
262
  # @param game_def [GameDefinition]
261
- # @return [PlayerGroup] The current state of the players.
263
+ # @return [HandPlayerGroup] The current state of the players.
262
264
  def every_action(game_def)
263
265
  @players = players_at_hand_start game_def.chip_stacks, game_def.blinds
264
266
 
@@ -293,7 +295,7 @@ class MatchState
293
295
  def hand_ended?(game_def)
294
296
  return @hand_ended unless @hand_ended.nil?
295
297
 
296
- @hand_ended = reached_showdown? || players(game_def).count { |player| player.inactive? } >= number_of_players - 1
298
+ @hand_ended = reached_showdown? || players(game_def).count { |player| player.folded? } >= number_of_players - 1
297
299
  end
298
300
 
299
301
  def reached_showdown?
@@ -321,6 +323,7 @@ class MatchState
321
323
 
322
324
  def walk_over_betting_sequence!(game_def)
323
325
  last_round = -1
326
+
324
327
  betting_sequence.each_with_index do |actions_per_round, current_round|
325
328
  @min_wager_by = game_def.min_wagers[current_round]
326
329
  @next_to_act = @players.position_of_first_active_player(