acpc_table_manager 3.0.18 → 4.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +2 -0
- data/README.md +8 -21
- data/Rakefile +1 -0
- data/acpc_table_manager.gemspec +11 -23
- data/exe/acpc_proxy +146 -58
- data/exe/acpc_table_manager +45 -26
- data/exe/acpc_testing_bot +115 -0
- data/lib/acpc_table_manager.rb +635 -13
- data/lib/acpc_table_manager/config.rb +31 -141
- data/lib/acpc_table_manager/match.rb +52 -79
- data/lib/acpc_table_manager/proxy_utils.rb +290 -0
- data/lib/acpc_table_manager/version.rb +1 -1
- metadata +39 -127
- data/lib/acpc_table_manager/dealer.rb +0 -59
- data/lib/acpc_table_manager/maintainer.rb +0 -31
- data/lib/acpc_table_manager/match_slice.rb +0 -194
- data/lib/acpc_table_manager/match_view.rb +0 -203
- data/lib/acpc_table_manager/opponents.rb +0 -62
- data/lib/acpc_table_manager/proxy.rb +0 -346
- data/lib/acpc_table_manager/table_queue.rb +0 -240
metadata
CHANGED
@@ -1,143 +1,101 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acpc_table_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dustin Morrill
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pony
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: origin
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: moped
|
43
15
|
requirement: !ruby/object:Gem::Requirement
|
44
16
|
requirements:
|
45
17
|
- - "~>"
|
46
18
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
19
|
+
version: '1.11'
|
48
20
|
type: :runtime
|
49
21
|
prerelease: false
|
50
22
|
version_requirements: !ruby/object:Gem::Requirement
|
51
23
|
requirements:
|
52
24
|
- - "~>"
|
53
25
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: mongoid
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '3.1'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3.1'
|
26
|
+
version: '1.11'
|
69
27
|
- !ruby/object:Gem::Dependency
|
70
28
|
name: redis
|
71
29
|
requirement: !ruby/object:Gem::Requirement
|
72
30
|
requirements:
|
73
31
|
- - "~>"
|
74
32
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3.
|
33
|
+
version: '3.3'
|
76
34
|
type: :runtime
|
77
35
|
prerelease: false
|
78
36
|
version_requirements: !ruby/object:Gem::Requirement
|
79
37
|
requirements:
|
80
38
|
- - "~>"
|
81
39
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3.
|
40
|
+
version: '3.3'
|
83
41
|
- !ruby/object:Gem::Dependency
|
84
42
|
name: acpc_poker_types
|
85
43
|
requirement: !ruby/object:Gem::Requirement
|
86
44
|
requirements:
|
87
|
-
- - "
|
45
|
+
- - "~>"
|
88
46
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
47
|
+
version: '7.8'
|
90
48
|
type: :runtime
|
91
49
|
prerelease: false
|
92
50
|
version_requirements: !ruby/object:Gem::Requirement
|
93
51
|
requirements:
|
94
|
-
- - "
|
52
|
+
- - "~>"
|
95
53
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
54
|
+
version: '7.8'
|
97
55
|
- !ruby/object:Gem::Dependency
|
98
56
|
name: acpc_dealer
|
99
57
|
requirement: !ruby/object:Gem::Requirement
|
100
58
|
requirements:
|
101
59
|
- - "~>"
|
102
60
|
- !ruby/object:Gem::Version
|
103
|
-
version: '3.
|
61
|
+
version: '3.1'
|
104
62
|
type: :runtime
|
105
63
|
prerelease: false
|
106
64
|
version_requirements: !ruby/object:Gem::Requirement
|
107
65
|
requirements:
|
108
66
|
- - "~>"
|
109
67
|
- !ruby/object:Gem::Version
|
110
|
-
version: '3.
|
68
|
+
version: '3.1'
|
111
69
|
- !ruby/object:Gem::Dependency
|
112
70
|
name: acpc_poker_player_proxy
|
113
71
|
requirement: !ruby/object:Gem::Requirement
|
114
72
|
requirements:
|
115
73
|
- - "~>"
|
116
74
|
- !ruby/object:Gem::Version
|
117
|
-
version: '1.
|
75
|
+
version: '1.6'
|
118
76
|
type: :runtime
|
119
77
|
prerelease: false
|
120
78
|
version_requirements: !ruby/object:Gem::Requirement
|
121
79
|
requirements:
|
122
80
|
- - "~>"
|
123
81
|
- !ruby/object:Gem::Version
|
124
|
-
version: '1.
|
82
|
+
version: '1.6'
|
125
83
|
- !ruby/object:Gem::Dependency
|
126
84
|
name: rusen
|
127
85
|
requirement: !ruby/object:Gem::Requirement
|
128
86
|
requirements:
|
129
|
-
- - "
|
87
|
+
- - "~>"
|
130
88
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
89
|
+
version: '0.1'
|
132
90
|
type: :runtime
|
133
91
|
prerelease: false
|
134
92
|
version_requirements: !ruby/object:Gem::Requirement
|
135
93
|
requirements:
|
136
|
-
- - "
|
94
|
+
- - "~>"
|
137
95
|
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
96
|
+
version: '0.1'
|
139
97
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
98
|
+
name: contextual_exceptions
|
141
99
|
requirement: !ruby/object:Gem::Requirement
|
142
100
|
requirements:
|
143
101
|
- - "~>"
|
@@ -150,62 +108,34 @@ dependencies:
|
|
150
108
|
- - "~>"
|
151
109
|
- !ruby/object:Gem::Version
|
152
110
|
version: '0.0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: contextual_exceptions
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :runtime
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
111
|
- !ruby/object:Gem::Dependency
|
168
112
|
name: awesome_print
|
169
113
|
requirement: !ruby/object:Gem::Requirement
|
170
114
|
requirements:
|
171
|
-
- - "
|
115
|
+
- - "~>"
|
172
116
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
117
|
+
version: '1.7'
|
174
118
|
type: :runtime
|
175
119
|
prerelease: false
|
176
120
|
version_requirements: !ruby/object:Gem::Requirement
|
177
121
|
requirements:
|
178
|
-
- - "
|
122
|
+
- - "~>"
|
179
123
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
124
|
+
version: '1.7'
|
181
125
|
- !ruby/object:Gem::Dependency
|
182
126
|
name: zaru
|
183
127
|
requirement: !ruby/object:Gem::Requirement
|
184
128
|
requirements:
|
185
|
-
- - "
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
version: '0'
|
188
|
-
type: :runtime
|
189
|
-
prerelease: false
|
190
|
-
version_requirements: !ruby/object:Gem::Requirement
|
191
|
-
requirements:
|
192
|
-
- - ">="
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version: '0'
|
195
|
-
- !ruby/object:Gem::Dependency
|
196
|
-
name: hescape
|
197
|
-
requirement: !ruby/object:Gem::Requirement
|
198
|
-
requirements:
|
199
|
-
- - ">="
|
129
|
+
- - "~>"
|
200
130
|
- !ruby/object:Gem::Version
|
201
|
-
version: '0'
|
131
|
+
version: '0.1'
|
202
132
|
type: :runtime
|
203
133
|
prerelease: false
|
204
134
|
version_requirements: !ruby/object:Gem::Requirement
|
205
135
|
requirements:
|
206
|
-
- - "
|
136
|
+
- - "~>"
|
207
137
|
- !ruby/object:Gem::Version
|
208
|
-
version: '0'
|
138
|
+
version: '0.1'
|
209
139
|
- !ruby/object:Gem::Dependency
|
210
140
|
name: bundler
|
211
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,44 +168,30 @@ dependencies:
|
|
238
168
|
name: minitest
|
239
169
|
requirement: !ruby/object:Gem::Requirement
|
240
170
|
requirements:
|
241
|
-
- - "
|
242
|
-
- !ruby/object:Gem::Version
|
243
|
-
version: '0'
|
244
|
-
type: :development
|
245
|
-
prerelease: false
|
246
|
-
version_requirements: !ruby/object:Gem::Requirement
|
247
|
-
requirements:
|
248
|
-
- - ">="
|
249
|
-
- !ruby/object:Gem::Version
|
250
|
-
version: '0'
|
251
|
-
- !ruby/object:Gem::Dependency
|
252
|
-
name: mocha
|
253
|
-
requirement: !ruby/object:Gem::Requirement
|
254
|
-
requirements:
|
255
|
-
- - ">="
|
171
|
+
- - "~>"
|
256
172
|
- !ruby/object:Gem::Version
|
257
|
-
version: '
|
173
|
+
version: '5.10'
|
258
174
|
type: :development
|
259
175
|
prerelease: false
|
260
176
|
version_requirements: !ruby/object:Gem::Requirement
|
261
177
|
requirements:
|
262
|
-
- - "
|
178
|
+
- - "~>"
|
263
179
|
- !ruby/object:Gem::Version
|
264
|
-
version: '
|
180
|
+
version: '5.10'
|
265
181
|
- !ruby/object:Gem::Dependency
|
266
182
|
name: pry
|
267
183
|
requirement: !ruby/object:Gem::Requirement
|
268
184
|
requirements:
|
269
|
-
- - "
|
185
|
+
- - "~>"
|
270
186
|
- !ruby/object:Gem::Version
|
271
|
-
version: '0'
|
187
|
+
version: '0.10'
|
272
188
|
type: :development
|
273
189
|
prerelease: false
|
274
190
|
version_requirements: !ruby/object:Gem::Requirement
|
275
191
|
requirements:
|
276
|
-
- - "
|
192
|
+
- - "~>"
|
277
193
|
- !ruby/object:Gem::Version
|
278
|
-
version: '0'
|
194
|
+
version: '0.10'
|
279
195
|
description: Backend components to the ACPC Poker GUI Client. Includes a player that
|
280
196
|
saves states from the dealer to persistent storage, and components to start, stop,
|
281
197
|
and manage match components.
|
@@ -284,6 +200,7 @@ email:
|
|
284
200
|
executables:
|
285
201
|
- acpc_proxy
|
286
202
|
- acpc_table_manager
|
203
|
+
- acpc_testing_bot
|
287
204
|
extensions: []
|
288
205
|
extra_rdoc_files: []
|
289
206
|
files:
|
@@ -298,18 +215,13 @@ files:
|
|
298
215
|
- bin/setup
|
299
216
|
- exe/acpc_proxy
|
300
217
|
- exe/acpc_table_manager
|
218
|
+
- exe/acpc_testing_bot
|
301
219
|
- lib/acpc_table_manager.rb
|
302
220
|
- lib/acpc_table_manager/config.rb
|
303
|
-
- lib/acpc_table_manager/dealer.rb
|
304
|
-
- lib/acpc_table_manager/maintainer.rb
|
305
221
|
- lib/acpc_table_manager/match.rb
|
306
|
-
- lib/acpc_table_manager/match_slice.rb
|
307
|
-
- lib/acpc_table_manager/match_view.rb
|
308
222
|
- lib/acpc_table_manager/monkey_patches.rb
|
309
|
-
- lib/acpc_table_manager/
|
310
|
-
- lib/acpc_table_manager/proxy.rb
|
223
|
+
- lib/acpc_table_manager/proxy_utils.rb
|
311
224
|
- lib/acpc_table_manager/simple_logging.rb
|
312
|
-
- lib/acpc_table_manager/table_queue.rb
|
313
225
|
- lib/acpc_table_manager/utils.rb
|
314
226
|
- lib/acpc_table_manager/version.rb
|
315
227
|
homepage: https://github.com/dmorrill10/acpc_table_manager
|
@@ -332,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
332
244
|
version: '0'
|
333
245
|
requirements: []
|
334
246
|
rubyforge_project:
|
335
|
-
rubygems_version: 2.
|
247
|
+
rubygems_version: 2.5.1
|
336
248
|
signing_key:
|
337
249
|
specification_version: 4
|
338
250
|
summary: Backend components to the ACPC Poker GUI Client
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'acpc_dealer'
|
2
|
-
require 'timeout'
|
3
|
-
require 'zaru'
|
4
|
-
require_relative 'config'
|
5
|
-
require_relative 'simple_logging'
|
6
|
-
|
7
|
-
module AcpcTableManager
|
8
|
-
module Dealer
|
9
|
-
extend SimpleLogging
|
10
|
-
|
11
|
-
@logger = nil
|
12
|
-
|
13
|
-
# @return [Hash<Symbol, Object>] The dealer information
|
14
|
-
# @note Saves the actual port numbers used by the dealer instance in +match+
|
15
|
-
def self.start(match, port_numbers: nil)
|
16
|
-
@logger ||= ::AcpcTableManager.new_log 'dealer.log'
|
17
|
-
log __method__, match: match
|
18
|
-
|
19
|
-
dealer_arguments = {
|
20
|
-
match_name: match.sanitized_name,
|
21
|
-
game_def_file_name: Shellwords.escape(match.game_definition_file_name),
|
22
|
-
hands: Shellwords.escape(match.number_of_hands),
|
23
|
-
random_seed: Shellwords.escape(match.random_seed.to_s),
|
24
|
-
player_names: match.player_names.map { |name| Shellwords.escape(name.gsub(/\s+/, '_')) }.join(' '),
|
25
|
-
options: match.dealer_options
|
26
|
-
}
|
27
|
-
|
28
|
-
log __method__, {
|
29
|
-
match_id: match.id,
|
30
|
-
match_name: match.name,
|
31
|
-
dealer_arguments: dealer_arguments,
|
32
|
-
log_directory: ::AcpcTableManager.config.match_log_directory,
|
33
|
-
port_numbers: port_numbers,
|
34
|
-
command: AcpcDealer::DealerRunner.command(dealer_arguments, port_numbers)
|
35
|
-
}
|
36
|
-
|
37
|
-
dealer_info = Timeout::timeout(3) do
|
38
|
-
AcpcDealer::DealerRunner.start(
|
39
|
-
dealer_arguments,
|
40
|
-
::AcpcTableManager.config.match_log_directory,
|
41
|
-
port_numbers
|
42
|
-
)
|
43
|
-
end
|
44
|
-
|
45
|
-
match.dealer_pid = dealer_info[:pid]
|
46
|
-
match.port_numbers = dealer_info[:port_numbers].map { |e| e.to_i }
|
47
|
-
match.save!
|
48
|
-
|
49
|
-
log __method__, {
|
50
|
-
match_id: match.id,
|
51
|
-
match_name: match.name,
|
52
|
-
dealer_pid: match.dealer_pid,
|
53
|
-
saved_port_numbers: match.port_numbers
|
54
|
-
}
|
55
|
-
|
56
|
-
dealer_info
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require_relative 'table_queue'
|
2
|
-
require_relative 'simple_logging'
|
3
|
-
using AcpcTableManager::SimpleLogging::MessageFormatting
|
4
|
-
|
5
|
-
module AcpcTableManager
|
6
|
-
class Maintainer
|
7
|
-
include SimpleLogging
|
8
|
-
|
9
|
-
def initialize(logger_ = AcpcTableManager.new_log('table_manager.log'))
|
10
|
-
@logger = logger_
|
11
|
-
log(__method__)
|
12
|
-
|
13
|
-
@table_queues = {}
|
14
|
-
::AcpcTableManager.exhibition_config.games.keys.each do |game_definition_key|
|
15
|
-
@table_queues[game_definition_key] = ::AcpcTableManager::TableQueue.new(game_definition_key)
|
16
|
-
end
|
17
|
-
maintain!
|
18
|
-
end
|
19
|
-
|
20
|
-
def maintain!
|
21
|
-
log __method__, msg: "Starting maintenance"
|
22
|
-
|
23
|
-
@table_queues.each do |key, queue|
|
24
|
-
log(__method__, {queue: key})
|
25
|
-
queue.check!
|
26
|
-
end
|
27
|
-
|
28
|
-
log __method__, msg: "Finished maintenance"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,194 +0,0 @@
|
|
1
|
-
require 'mongoid'
|
2
|
-
require_relative 'config'
|
3
|
-
|
4
|
-
module AcpcTableManager
|
5
|
-
class MatchSlice
|
6
|
-
include Mongoid::Document
|
7
|
-
include Mongoid::Timestamps::Updated
|
8
|
-
|
9
|
-
embedded_in :match, inverse_of: :slices
|
10
|
-
|
11
|
-
field :hand_has_ended, type: Boolean
|
12
|
-
field :match_has_ended, type: Boolean
|
13
|
-
field :seat_with_dealer_button, type: Integer
|
14
|
-
field :seat_next_to_act, type: Integer
|
15
|
-
field :state_string, type: String
|
16
|
-
# Not necessary to be in the database, but more performant than processing on the
|
17
|
-
# Rails server
|
18
|
-
field :betting_sequence, type: String
|
19
|
-
field :pot_at_start_of_round, type: Integer
|
20
|
-
field :players, type: Array
|
21
|
-
field :minimum_wager_to, type: Integer
|
22
|
-
field :chip_contribution_after_calling, type: Integer
|
23
|
-
field :pot_after_call, type: Integer
|
24
|
-
field :is_users_turn_to_act, type: Boolean
|
25
|
-
field :legal_actions, type: Array
|
26
|
-
field :amount_to_call, type: Integer
|
27
|
-
field :messages, type: Array
|
28
|
-
|
29
|
-
def self.from_players_at_the_table!(patt, match_has_ended, match)
|
30
|
-
match.slices.create!(
|
31
|
-
hand_has_ended: patt.hand_ended?,
|
32
|
-
match_has_ended: match_has_ended,
|
33
|
-
seat_with_dealer_button: patt.dealer_player.seat.to_i,
|
34
|
-
seat_next_to_act: if patt.next_player_to_act
|
35
|
-
patt.next_player_to_act.seat.to_i
|
36
|
-
end,
|
37
|
-
state_string: patt.match_state.to_s,
|
38
|
-
# Not necessary to be in the database, but more performant than processing on the
|
39
|
-
# Rails server
|
40
|
-
betting_sequence: betting_sequence(patt.match_state, patt.game_def),
|
41
|
-
pot_at_start_of_round: pot_at_start_of_round(patt.match_state, patt.game_def).to_i,
|
42
|
-
players: players(patt, match.player_names),
|
43
|
-
minimum_wager_to: minimum_wager_to(patt.match_state, patt.game_def).to_i,
|
44
|
-
chip_contribution_after_calling: chip_contribution_after_calling(patt.match_state, patt.game_def).to_i,
|
45
|
-
pot_after_call: pot_after_call(patt.match_state, patt.game_def).to_i,
|
46
|
-
all_in: all_in(patt.match_state, patt.game_def).to_i,
|
47
|
-
is_users_turn_to_act: patt.users_turn_to_act?,
|
48
|
-
legal_actions: patt.legal_actions.map { |action| action.to_s },
|
49
|
-
amount_to_call: amount_to_call(patt.match_state, patt.game_def).to_i
|
50
|
-
)
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.betting_sequence(match_state, game_def)
|
54
|
-
sequence = ''
|
55
|
-
match_state.betting_sequence(game_def).each_with_index do |actions_per_round, round|
|
56
|
-
actions_per_round.each_with_index do |action, action_index|
|
57
|
-
adjusted_action = adjust_action_amount(
|
58
|
-
action,
|
59
|
-
round,
|
60
|
-
match_state,
|
61
|
-
game_def
|
62
|
-
)
|
63
|
-
|
64
|
-
sequence << if (
|
65
|
-
match_state.player_acting_sequence(game_def)[round][action_index].to_i ==
|
66
|
-
match_state.position_relative_to_dealer
|
67
|
-
)
|
68
|
-
adjusted_action.capitalize
|
69
|
-
else
|
70
|
-
adjusted_action
|
71
|
-
end
|
72
|
-
end
|
73
|
-
sequence << '/' unless round == match_state.betting_sequence(game_def).length - 1
|
74
|
-
end
|
75
|
-
sequence
|
76
|
-
end
|
77
|
-
|
78
|
-
def self.pot_at_start_of_round(match_state, game_def)
|
79
|
-
return 0 if match_state.round == 0
|
80
|
-
|
81
|
-
match_state.players(game_def).inject(0) do |sum, pl|
|
82
|
-
sum += pl.contributions[0..match_state.round - 1].inject(:+)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# @return [Array<Hash>] Player information ordered by seat.
|
87
|
-
# Each player hash should contain
|
88
|
-
# values for the following keys:
|
89
|
-
# 'name',
|
90
|
-
# 'seat'
|
91
|
-
# 'chip_stack'
|
92
|
-
# 'chip_contributions'
|
93
|
-
# 'chip_balance'
|
94
|
-
# 'hole_cards'
|
95
|
-
# 'winnings'
|
96
|
-
def self.players(patt, player_names)
|
97
|
-
player_names_queue = player_names.dup
|
98
|
-
patt.players.map do |player|
|
99
|
-
hole_cards = if !(player.hand.empty? || player.folded?)
|
100
|
-
player.hand.to_acpc
|
101
|
-
elsif player.folded?
|
102
|
-
''
|
103
|
-
else
|
104
|
-
'_' * patt.game_def.number_of_hole_cards
|
105
|
-
end
|
106
|
-
|
107
|
-
{
|
108
|
-
'name' => player_names_queue.shift,
|
109
|
-
'seat' => player.seat,
|
110
|
-
'chip_stack' => player.stack.to_i,
|
111
|
-
'chip_contributions' => player.contributions.map { |contrib| contrib.to_i },
|
112
|
-
'chip_balance' => player.balance,
|
113
|
-
'hole_cards' => hole_cards,
|
114
|
-
'winnings' => player.winnings.to_f
|
115
|
-
}
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# Over round
|
120
|
-
def self.minimum_wager_to(state, game_def)
|
121
|
-
return 0 unless state.next_to_act(game_def)
|
122
|
-
|
123
|
-
(
|
124
|
-
state.min_wager_by(game_def) +
|
125
|
-
chip_contribution_after_calling(state, game_def)
|
126
|
-
).ceil
|
127
|
-
end
|
128
|
-
|
129
|
-
# Over round
|
130
|
-
def self.chip_contribution_after_calling(state, game_def)
|
131
|
-
return 0 unless state.next_to_act(game_def)
|
132
|
-
|
133
|
-
(
|
134
|
-
(
|
135
|
-
state.players(game_def)[
|
136
|
-
state.next_to_act(game_def)
|
137
|
-
].contributions[state.round] || 0
|
138
|
-
) + amount_to_call(state, game_def)
|
139
|
-
)
|
140
|
-
end
|
141
|
-
|
142
|
-
# Over round
|
143
|
-
def self.pot_after_call(state, game_def)
|
144
|
-
return state.pot(game_def) if state.hand_ended?(game_def)
|
145
|
-
|
146
|
-
state.pot(game_def) + state.players(game_def).amount_to_call(state.next_to_act(game_def))
|
147
|
-
end
|
148
|
-
|
149
|
-
# Over round
|
150
|
-
def self.all_in(state, game_def)
|
151
|
-
return 0 if state.hand_ended?(game_def)
|
152
|
-
|
153
|
-
(
|
154
|
-
state.players(game_def)[state.next_to_act(game_def)].stack +
|
155
|
-
(
|
156
|
-
state.players(game_def)[state.next_to_act(game_def)]
|
157
|
-
.contributions[state.round] || 0
|
158
|
-
)
|
159
|
-
).floor
|
160
|
-
end
|
161
|
-
|
162
|
-
def self.amount_to_call(state, game_def)
|
163
|
-
return 0 if state.next_to_act(game_def).nil?
|
164
|
-
|
165
|
-
state.players(game_def).amount_to_call(state.next_to_act(game_def))
|
166
|
-
end
|
167
|
-
|
168
|
-
def users_turn_to_act?
|
169
|
-
self.is_users_turn_to_act
|
170
|
-
end
|
171
|
-
def hand_ended?
|
172
|
-
self.hand_has_ended
|
173
|
-
end
|
174
|
-
def match_ended?
|
175
|
-
self.match_has_ended
|
176
|
-
end
|
177
|
-
|
178
|
-
private
|
179
|
-
|
180
|
-
def self.adjust_action_amount(action, round, match_state, game_def)
|
181
|
-
amount_to_over_hand = action.modifier
|
182
|
-
if amount_to_over_hand.blank?
|
183
|
-
action
|
184
|
-
else
|
185
|
-
amount_to_over_round = (
|
186
|
-
amount_to_over_hand.to_i - match_state.players(game_def)[
|
187
|
-
match_state.position_relative_to_dealer
|
188
|
-
].contributions_before(round).to_i
|
189
|
-
)
|
190
|
-
"#{action[0]}#{amount_to_over_round}"
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|