acpc_table_manager 3.0.18 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|