texas-poker-core 1.4.1 → 1.4.2

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.
package/README.md CHANGED
@@ -405,4 +405,8 @@ bufix
405
405
  新增角色枚举
406
406
 
407
407
  ## 1.4.1
408
- 重命名变量
408
+
409
+ 重命名变量
410
+
411
+ ## 1.4.2
412
+ 分离职责到业务层
@@ -5,8 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = exports.StageEnum = void 0;
8
- var _TexasError = _interopRequireDefault(require("../TexasError"));
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ var _TexasEngineContext = require("../TexasEngineContext");
9
+ var _TexasError = _interopRequireWildcard(require("../TexasError"));
10
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
11
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
12
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
11
13
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
12
14
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
@@ -36,12 +38,19 @@ var StageEnum = exports.StageEnum = /*#__PURE__*/function (StageEnum) {
36
38
  return StageEnum;
37
39
  }({});
38
40
  var stages = [StageEnum.PRE_FLOP, StageEnum.FLOP, StageEnum.TURN, StageEnum.RIVER];
41
+
42
+ /**
43
+ * 控制器唯一状态:一手牌从「可开局」到「结束待清理」的完整生命周期。
44
+ * - `idle`:无进行中的手牌(上一手已 `reset` 之后、下一手 `start` 之前;**局间等待下一手**也在此)
45
+ * - `in_hand`:本手进行中
46
+ * - `in_hand_paused`:本手暂停
47
+ * - `hand_complete`:本手已结束(至调用 `reset` 之前;业务可在此期间做摊牌展示、奖池结算、`settle` 等)
48
+ * - `aborted`:异常终止(预留)
49
+ */
39
50
  var _status = /*#__PURE__*/new WeakMap();
40
51
  var _stage = /*#__PURE__*/new WeakMap();
41
52
  var _endAt = /*#__PURE__*/new WeakMap();
42
53
  var _activePlayer = /*#__PURE__*/new WeakMap();
43
- var _timer = /*#__PURE__*/new WeakMap();
44
- var _count = /*#__PURE__*/new WeakMap();
45
54
  var _dealer = /*#__PURE__*/new WeakMap();
46
55
  var _callbackOfEnd = /*#__PURE__*/new WeakMap();
47
56
  var _callbackOnNextStage = /*#__PURE__*/new WeakMap();
@@ -50,27 +59,24 @@ var _defaultBets = /*#__PURE__*/new WeakMap();
50
59
  var _Controller_brand = /*#__PURE__*/new WeakSet();
51
60
  var Controller = /*#__PURE__*/function () {
52
61
  function Controller(dealer) {
53
- var reportError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (error) {
62
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (error) {
54
63
  throw error;
55
64
  };
56
65
  _classCallCheck(this, Controller);
57
66
  _classPrivateMethodInitSpec(this, _Controller_brand);
58
- _classPrivateFieldInitSpec(this, _status, 'waiting');
67
+ _classPrivateFieldInitSpec(this, _status, 'idle');
59
68
  _classPrivateFieldInitSpec(this, _stage, StageEnum.PRE_FLOP);
60
69
  // 游戏在哪个极端结束的, 比如翻牌圈其他玩家都弃牌, 游戏在这个阶段就结束了
61
70
  _classPrivateFieldInitSpec(this, _endAt, StageEnum.PRE_FLOP);
62
71
  _classPrivateFieldInitSpec(this, _activePlayer, null);
63
- _classPrivateFieldInitSpec(this, _timer, null);
64
- // 记录游戏的进行时间,单位 second
65
- _classPrivateFieldInitSpec(this, _count, 0);
66
72
  _classPrivateFieldInitSpec(this, _dealer, void 0);
67
73
  _classPrivateFieldInitSpec(this, _callbackOfEnd, void 0);
68
74
  _classPrivateFieldInitSpec(this, _callbackOnNextStage, void 0);
69
75
  _classPrivateFieldInitSpec(this, _callbackOfGameStart, void 0);
70
76
  _classPrivateFieldInitSpec(this, _defaultBets, []);
71
- _defineProperty(this, "reportError", void 0);
77
+ _defineProperty(this, "fail", void 0);
72
78
  _classPrivateFieldSet(_dealer, this, dealer);
73
- this.reportError = reportError;
79
+ this.fail = fail;
74
80
  }
75
81
  return _createClass(Controller, [{
76
82
  key: "status",
@@ -105,7 +111,7 @@ var Controller = /*#__PURE__*/function () {
105
111
  * @param player
106
112
  */
107
113
  function transferControlTo(player) {
108
- if (_classPrivateFieldGet(_activePlayer, this) === player) this.reportError(new _TexasError.default(2100, '无法重复获得控制权'));
114
+ if (_classPrivateFieldGet(_activePlayer, this) === player) return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.CTRL_DUPLICATE_CONTROL));
109
115
  _classPrivateFieldSet(_activePlayer, this, player);
110
116
  player === null || player === void 0 || player.getControl();
111
117
  }
@@ -133,7 +139,13 @@ var Controller = /*#__PURE__*/function () {
133
139
  currentStage: _classPrivateFieldGet(_stage, this),
134
140
  showHandPokes: false
135
141
  });
136
- console.log('游戏结束(otherPlayersFold):', _classPrivateFieldGet(_endAt, this));
142
+ _TexasEngineContext.TexasEngineContext.emitTrace({
143
+ channel: 'controller',
144
+ name: 'hand_end_fold_win',
145
+ data: {
146
+ endAt: _classPrivateFieldGet(_endAt, this)
147
+ }
148
+ });
137
149
  return true;
138
150
  }
139
151
 
@@ -156,7 +168,13 @@ var Controller = /*#__PURE__*/function () {
156
168
  bestPokes: pokes,
157
169
  bestRankCategory: rankCategory
158
170
  });
159
- console.log('游戏结束(shouldEndGame):', _classPrivateFieldGet(_endAt, this));
171
+ _TexasEngineContext.TexasEngineContext.emitTrace({
172
+ channel: 'controller',
173
+ name: 'hand_end_showdown',
174
+ data: {
175
+ endAt: _classPrivateFieldGet(_endAt, this)
176
+ }
177
+ });
160
178
  return true;
161
179
  }
162
180
  return false;
@@ -175,7 +193,6 @@ var Controller = /*#__PURE__*/function () {
175
193
  });
176
194
  if (canPushToNextStage) {
177
195
  var _classPrivateFieldGet5, _classPrivateFieldGet6;
178
- console.log('推进到下个阶段, 触发人', (_classPrivateFieldGet5 = _classPrivateFieldGet(_activePlayer, this)) === null || _classPrivateFieldGet5 === void 0 ? void 0 : _classPrivateFieldGet5.getUserInfo().name);
179
196
  var index = stages.findIndex(function (stage) {
180
197
  return stage === _classPrivateFieldGet(_stage, _this);
181
198
  });
@@ -185,12 +202,20 @@ var Controller = /*#__PURE__*/function () {
185
202
  _classPrivateFieldGet(_dealer, this).resetCurrentStageTotalAmount();
186
203
  _classPrivateFieldGet(_dealer, this).resetActionsOfPlayers();
187
204
  _classPrivateFieldGet(_dealer, this).resetActionsHistory();
188
- (_classPrivateFieldGet6 = _classPrivateFieldGet(_callbackOnNextStage, this)) === null || _classPrivateFieldGet6 === void 0 || _classPrivateFieldGet6.call(this, {
205
+ (_classPrivateFieldGet5 = _classPrivateFieldGet(_callbackOnNextStage, this)) === null || _classPrivateFieldGet5 === void 0 || _classPrivateFieldGet5.call(this, {
189
206
  stage: nextStage,
190
207
  lastStage: currentStage,
191
208
  commonPokes: this.getCommonPokes(currentStage, nextStage)
192
209
  });
193
- console.log('游戏进入下一个阶段 => ', _classPrivateFieldGet(_stage, this));
210
+ _TexasEngineContext.TexasEngineContext.emitTrace({
211
+ channel: 'controller',
212
+ name: 'stage_changed',
213
+ data: {
214
+ from: currentStage,
215
+ to: nextStage,
216
+ byUserId: (_classPrivateFieldGet6 = _classPrivateFieldGet(_activePlayer, this)) === null || _classPrivateFieldGet6 === void 0 ? void 0 : _classPrivateFieldGet6.getUserInfo().id
217
+ }
218
+ });
194
219
  this.resetActivePlayer();
195
220
  this.transferControlTo(_classPrivateFieldGet(_dealer, this).getTheFirstPlayerToAct());
196
221
  return true;
@@ -282,7 +307,7 @@ var Controller = /*#__PURE__*/function () {
282
307
  _context2.next = 11;
283
308
  break;
284
309
  case 10:
285
- this.reportError(new _TexasError.default(2000, '游戏进程异常'));
310
+ return _context2.abrupt("return", this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.CTRL_START_NO_ACTIVE)));
286
311
  case 11:
287
312
  case "end":
288
313
  return _context2.stop();
@@ -305,17 +330,15 @@ var Controller = /*#__PURE__*/function () {
305
330
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
306
331
  while (1) switch (_context3.prev = _context3.next) {
307
332
  case 0:
308
- _classPrivateFieldSet(_status, this, 'on');
333
+ _classPrivateFieldSet(_status, this, 'in_hand');
309
334
  _classPrivateFieldSet(_stage, this, StageEnum.PRE_FLOP);
310
335
  _classPrivateFieldSet(_endAt, this, StageEnum.PRE_FLOP);
311
-
312
- // 测试环境保持玩家balance起始不变
313
- if (process.env.PROJECT_ENV === 'dev') _classPrivateFieldGet(_dealer, this).reset();
336
+ if (_TexasEngineContext.TexasEngineContext.simulation().resetDealerBeforeHandStart) {
337
+ _classPrivateFieldGet(_dealer, this).reset();
338
+ }
314
339
  _context3.next = 6;
315
340
  return this.takeActionInPreFlop();
316
341
  case 6:
317
- this.startTimer();
318
- case 7:
319
342
  case "end":
320
343
  return _context3.stop();
321
344
  }
@@ -331,17 +354,6 @@ var Controller = /*#__PURE__*/function () {
331
354
  value: function onGameStart(callback) {
332
355
  _classPrivateFieldSet(_callbackOfGameStart, this, callback);
333
356
  }
334
- }, {
335
- key: "startTimer",
336
- value: function startTimer() {
337
- var _this3 = this;
338
- // 避免重复开启计时器
339
- if (_classPrivateFieldGet(_timer, this)) return;
340
- _classPrivateFieldSet(_timer, this, setInterval(function () {
341
- var _this$count, _this$count2;
342
- _classPrivateFieldSet(_count, _this3, (_this$count = _classPrivateFieldGet(_count, _this3), _this$count2 = _this$count++, _this$count)), _this$count2;
343
- }, 1000));
344
- }
345
357
 
346
358
  /**
347
359
  * @description 继续游戏
@@ -350,18 +362,9 @@ var Controller = /*#__PURE__*/function () {
350
362
  key: "continue",
351
363
  value: function _continue() {
352
364
  var _classPrivateFieldGet8;
353
- if (_classPrivateFieldGet(_status, this) !== 'pause') this.reportError(new _TexasError.default(2100, '游戏不是暂停状态,无法继续'));
354
- _classPrivateFieldSet(_status, this, 'on');
365
+ if (_classPrivateFieldGet(_status, this) !== 'in_hand_paused') return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.CTRL_NOT_PAUSED));
366
+ _classPrivateFieldSet(_status, this, 'in_hand');
355
367
  (_classPrivateFieldGet8 = _classPrivateFieldGet(_activePlayer, this)) === null || _classPrivateFieldGet8 === void 0 || _classPrivateFieldGet8.continue();
356
- this.startTimer();
357
- }
358
- }, {
359
- key: "clearTimer",
360
- value: function clearTimer() {
361
- if (_classPrivateFieldGet(_timer, this)) {
362
- clearInterval(_classPrivateFieldGet(_timer, this));
363
- _classPrivateFieldSet(_timer, this, null);
364
- }
365
368
  }
366
369
 
367
370
  /**
@@ -370,9 +373,8 @@ var Controller = /*#__PURE__*/function () {
370
373
  }, {
371
374
  key: "end",
372
375
  value: function end() {
373
- if (this.status !== 'on') this.reportError(new _TexasError.default(2100, '游戏不在进行中, 无法结束'));
374
- this.clearTimer();
375
- _classPrivateFieldSet(_status, this, 'end');
376
+ if (this.status !== 'in_hand') return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.CTRL_END_NOT_IN_HAND));
377
+ _classPrivateFieldSet(_status, this, 'hand_complete');
376
378
  this.resetActivePlayer();
377
379
  }
378
380
  }, {
@@ -388,11 +390,9 @@ var Controller = /*#__PURE__*/function () {
388
390
  }, {
389
391
  key: "reset",
390
392
  value: function reset() {
391
- this.clearTimer();
392
393
  this.resetActivePlayer();
393
- _classPrivateFieldSet(_count, this, 0);
394
394
  _classPrivateFieldSet(_defaultBets, this, []);
395
- _classPrivateFieldSet(_status, this, 'waiting');
395
+ _classPrivateFieldSet(_status, this, 'idle');
396
396
  _classPrivateFieldSet(_endAt, this, StageEnum.PRE_FLOP);
397
397
  _classPrivateFieldSet(_stage, this, StageEnum.PRE_FLOP);
398
398
  }
@@ -404,8 +404,7 @@ var Controller = /*#__PURE__*/function () {
404
404
  key: "pause",
405
405
  value: function pause() {
406
406
  var _this$activePlayer;
407
- _classPrivateFieldSet(_status, this, 'pause');
408
- this.clearTimer();
407
+ _classPrivateFieldSet(_status, this, 'in_hand_paused');
409
408
  (_this$activePlayer = this.activePlayer) === null || _this$activePlayer === void 0 || _this$activePlayer.pause();
410
409
  }
411
410
  }]);
@@ -424,7 +423,7 @@ function _getSmallBindAndBigBind() {
424
423
  var result = [smallBind, smallBind === null || smallBind === void 0 ? void 0 : smallBind.getNextPlayer()];
425
424
  if (result.some(function (player) {
426
425
  return !player;
427
- })) this.reportError(new _TexasError.default(2000, '游戏进程异常: 小盲或大盲玩家不存在'));
426
+ })) return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.CTRL_SB_BB_MISSING));
428
427
  return result;
429
428
  }
430
429
  var _default = exports.default = Controller;
@@ -6,11 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _Deck = _interopRequireDefault(require("../Deck"));
9
- var _TexasError = _interopRequireDefault(require("../TexasError"));
10
9
  var _utils = require("../utils");
11
10
  var _Player = require("../Player");
11
+ var _TexasEngineContext = require("../TexasEngineContext");
12
+ var _TexasError = _interopRequireWildcard(require("../TexasError"));
12
13
  var _constant = require("../Player/constant");
13
14
  var _core = require("../Deck/core");
15
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
16
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
18
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
16
19
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -33,6 +36,7 @@ function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.h
33
36
  * 荷官, 控制游戏进行
34
37
  */
35
38
  var _lowestBetAmount = /*#__PURE__*/new WeakMap();
39
+ var _maxTablePlayers = /*#__PURE__*/new WeakMap();
36
40
  var _deck = /*#__PURE__*/new WeakMap();
37
41
  var _count = /*#__PURE__*/new WeakMap();
38
42
  var _button = /*#__PURE__*/new WeakMap();
@@ -41,22 +45,26 @@ var _head = /*#__PURE__*/new WeakMap();
41
45
  var _actionsHistory = /*#__PURE__*/new WeakMap();
42
46
  var Dealer = /*#__PURE__*/function () {
43
47
  function Dealer(lowestBetAmount) {
44
- var reportError = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (error) {
48
+ var _options$maxTablePlay;
49
+ var fail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (error) {
45
50
  throw error;
46
51
  };
52
+ var options = arguments.length > 2 ? arguments[2] : undefined;
47
53
  _classCallCheck(this, Dealer);
48
54
  _classPrivateFieldInitSpec(this, _lowestBetAmount, void 0);
55
+ _classPrivateFieldInitSpec(this, _maxTablePlayers, void 0);
49
56
  _classPrivateFieldInitSpec(this, _deck, void 0);
50
57
  _classPrivateFieldInitSpec(this, _count, 0);
51
58
  _classPrivateFieldInitSpec(this, _button, null);
52
59
  _classPrivateFieldInitSpec(this, _last, null);
53
60
  _classPrivateFieldInitSpec(this, _head, null);
54
- _defineProperty(this, "reportError", void 0);
61
+ _defineProperty(this, "fail", void 0);
55
62
  // 记录最近一个玩家的操作记录
56
63
  _classPrivateFieldInitSpec(this, _actionsHistory, []);
57
64
  _classPrivateFieldSet(_lowestBetAmount, this, lowestBetAmount);
65
+ _classPrivateFieldSet(_maxTablePlayers, this, (_options$maxTablePlay = options === null || options === void 0 ? void 0 : options.maxTablePlayers) !== null && _options$maxTablePlay !== void 0 ? _options$maxTablePlay : 10);
58
66
  _classPrivateFieldSet(_deck, this, new _Deck.default());
59
- this.reportError = reportError;
67
+ this.fail = fail;
60
68
  }
61
69
  return _createClass(Dealer, [{
62
70
  key: "actionHistory",
@@ -98,11 +106,16 @@ var Dealer = /*#__PURE__*/function () {
98
106
  }, {
99
107
  key: "dealCards",
100
108
  value: function dealCards() {
101
- if (!_classPrivateFieldGet(_button, this)) this.reportError(new _TexasError.default(2000, '庄家未指定, 无法发牌'));
102
- console.log('玩家信息:');
103
- console.log(this.map(function (player) {
104
- return _constant.roleMap.get(player.getRole()) + ': ' + player.toString();
105
- }));
109
+ if (!_classPrivateFieldGet(_button, this)) return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.DEALER_NO_BUTTON));
110
+ _TexasEngineContext.TexasEngineContext.emitTrace({
111
+ channel: 'dealer',
112
+ name: 'deal_cards_players',
113
+ data: {
114
+ players: this.map(function (player) {
115
+ return _constant.roleMap.get(player.getRole()) + ': ' + player.toString();
116
+ })
117
+ }
118
+ });
106
119
  var _classPrivateFieldGet2 = _classPrivateFieldGet(_deck, this).dealCards(_classPrivateFieldGet(_count, this)),
107
120
  handPokes = _classPrivateFieldGet2.handPokes;
108
121
  this.loop(function (player, i) {
@@ -162,9 +175,15 @@ var Dealer = /*#__PURE__*/function () {
162
175
  }, {
163
176
  key: "logPlayers",
164
177
  value: function logPlayers() {
165
- console.log('玩家信息: \n', this.map(function (player) {
166
- return player.toString();
167
- }).join('\n'));
178
+ _TexasEngineContext.TexasEngineContext.emitTrace({
179
+ channel: 'dealer',
180
+ name: 'log_players',
181
+ data: {
182
+ lines: this.map(function (player) {
183
+ return player.toString();
184
+ })
185
+ }
186
+ });
168
187
  }
169
188
  }, {
170
189
  key: "setRoles",
@@ -189,7 +208,13 @@ var Dealer = /*#__PURE__*/function () {
189
208
  player.rankSignature = (0, _core.getFiveCardsRankSignature)(bestFiveCards);
190
209
  player.rankStrength = (0, _core.getStrengthFromRankSignature)(player.rankSignature);
191
210
  });
192
- console.log('底牌:', (0, _core.formatterPoke)(_classPrivateFieldGet(_deck, this).getPokes().commonPokes));
211
+ _TexasEngineContext.TexasEngineContext.emitTrace({
212
+ channel: 'dealer',
213
+ name: 'settle_common_pokes',
214
+ data: {
215
+ commonPokes: (0, _core.formatterPoke)(_classPrivateFieldGet(_deck, this).getPokes().commonPokes)
216
+ }
217
+ });
193
218
  }
194
219
  }, {
195
220
  key: "remove",
@@ -251,7 +276,9 @@ var Dealer = /*#__PURE__*/function () {
251
276
  value: function reArrangeRoles() {
252
277
  if (!_classPrivateFieldGet(_button, this)) return;
253
278
  var roles = _constant.playerRoleSetMap.get(_classPrivateFieldGet(_count, this));
254
- if (!roles) this.reportError(new _TexasError.default(2000, '不支持的玩家人数对局'));
279
+ if (!roles) return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.DEALER_UNSUPPORTED_COUNT, {
280
+ count: _classPrivateFieldGet(_count, this)
281
+ }));
255
282
  this.loop(function (player, i) {
256
283
  player.setRole(roles[i]);
257
284
  }, _classPrivateFieldGet(_button, this));
@@ -283,11 +310,19 @@ var Dealer = /*#__PURE__*/function () {
283
310
  }, {
284
311
  key: "log",
285
312
  value: function log() {
286
- console.log("\u73A9\u5BB6\u6570\u91CF: ".concat(_classPrivateFieldGet(_count, this)));
287
- console.log('底牌:', (0, _core.formatterPoke)(_classPrivateFieldGet(_deck, this).getPokes().commonPokes));
313
+ var lines = [];
314
+ lines.push("\u73A9\u5BB6\u6570\u91CF: ".concat(_classPrivateFieldGet(_count, this)));
315
+ lines.push('底牌:' + (0, _core.formatterPoke)(_classPrivateFieldGet(_deck, this).getPokes().commonPokes));
288
316
  this.forEach(function (player) {
289
317
  var role = player.getRole();
290
- console.log("".concat(role ? _constant.roleMap.get(role) : 'unSettled', ": ").concat(player.toString(), "; \u624B\u724C: ").concat((0, _core.formatterPoke)(player.getHandPokes())));
318
+ lines.push("".concat(role ? _constant.roleMap.get(role) : 'unSettled', ": ").concat(player.toString(), "; \u624B\u724C: ").concat((0, _core.formatterPoke)(player.getHandPokes())));
319
+ });
320
+ _TexasEngineContext.TexasEngineContext.emitTrace({
321
+ channel: 'dealer',
322
+ name: 'table_snapshot',
323
+ data: {
324
+ lines: lines
325
+ }
291
326
  });
292
327
  }
293
328
  }, {
@@ -295,7 +330,7 @@ var Dealer = /*#__PURE__*/function () {
295
330
  value: function changeButtonToNextPlayer() {
296
331
  var _classPrivateFieldGet5;
297
332
  var next = (_classPrivateFieldGet5 = _classPrivateFieldGet(_button, this)) === null || _classPrivateFieldGet5 === void 0 ? void 0 : _classPrivateFieldGet5.getNextPlayer();
298
- if (!next) this.reportError(new _TexasError.default(2000, '将庄家移交给不存在的玩家'));
333
+ if (!next) return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.DEALER_BUTTON_HANDOFF_INVALID));
299
334
  this.setButton(next);
300
335
  }
301
336
 
@@ -334,10 +369,12 @@ var Dealer = /*#__PURE__*/function () {
334
369
  }, {
335
370
  key: "setOthers",
336
371
  value: function setOthers() {
337
- if (!_classPrivateFieldGet(_button, this)) this.reportError(new _TexasError.default(2000, '未指定庄家, 无法设置其余玩家位置'));
372
+ if (!_classPrivateFieldGet(_button, this)) return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.DEALER_SET_OTHERS_NO_BUTTON));
338
373
  var count = _classPrivateFieldGet(_count, this);
339
- if (process.env.PROJECT_ENV === 'dev' && count === 1) return;
340
- if (count < 2 || count > 10) this.reportError(new _TexasError.default(2000, "\u6682\u4E0D\u652F\u6301".concat(count, "\u4EBA\u7684\u5BF9\u5C40")));
374
+ if (_TexasEngineContext.TexasEngineContext.simulation().allowSingleSeatedPlayer && count === 1) return;
375
+ if (count < 2 || count > _classPrivateFieldGet(_maxTablePlayers, this)) return this.fail(new _TexasError.default(_TexasError.TexasCoreErrorCode.DEALER_COUNT_OUT_OF_RANGE, {
376
+ count: count
377
+ }));
341
378
  var roles = _constant.playerRoleSetMap.get(count).slice(1);
342
379
  var role;
343
380
  var current = _classPrivateFieldGet(_button, this).getNextPlayer();