jp.ms.common.engine 1.0.2 → 1.0.4
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/dist/base/game-control-player-turn.d.ts +4 -4
- package/dist/base/game-control-player-turn.d.ts.map +1 -1
- package/dist/base/game-control-player-turn.js.map +1 -1
- package/dist/base/game-master.d.ts +24 -21
- package/dist/base/game-master.d.ts.map +1 -1
- package/dist/base/game-master.js +6 -2
- package/dist/base/game-master.js.map +1 -1
- package/dist/base/game-player-connections-helper.d.ts +15 -0
- package/dist/base/game-player-connections-helper.d.ts.map +1 -0
- package/dist/base/game-player-connections-helper.js +33 -0
- package/dist/base/game-player-connections-helper.js.map +1 -0
- package/dist/base/game-player.d.ts +3 -1
- package/dist/base/game-player.d.ts.map +1 -1
- package/dist/base/game-player.js +3 -1
- package/dist/base/game-player.js.map +1 -1
- package/dist/base/game-room.d.ts +15 -17
- package/dist/base/game-room.d.ts.map +1 -1
- package/dist/base/game-room.js +16 -17
- package/dist/base/game-room.js.map +1 -1
- package/dist/base/game-round.d.ts +7 -10
- package/dist/base/game-round.d.ts.map +1 -1
- package/dist/base/game-round.js +2 -4
- package/dist/base/game-round.js.map +1 -1
- package/dist/base/game-state-machine.d.ts +4 -4
- package/dist/base/game-state-machine.d.ts.map +1 -1
- package/dist/base/game-state-machine.js.map +1 -1
- package/dist/base/game-summary-result.d.ts +3 -0
- package/dist/base/game-summary-result.d.ts.map +1 -0
- package/dist/base/game-summary-result.js +7 -0
- package/dist/base/game-summary-result.js.map +1 -0
- package/dist/base/game-table-seat.d.ts +3 -3
- package/dist/base/game-table-seat.d.ts.map +1 -1
- package/dist/base/game-table-seat.js.map +1 -1
- package/dist/base/game-table-seats.d.ts +12 -12
- package/dist/base/game-table-seats.d.ts.map +1 -1
- package/dist/base/game-table-seats.js.map +1 -1
- package/dist/base/game-table.d.ts +25 -51
- package/dist/base/game-table.d.ts.map +1 -1
- package/dist/base/game-table.js.map +1 -1
- package/dist/base/index.d.ts +2 -1
- package/dist/base/index.d.ts.map +1 -1
- package/dist/base/index.js +3 -1
- package/dist/base/index.js.map +1 -1
- package/dist/base/standard-game-state.d.ts +2 -2
- package/dist/base/standard-game-state.d.ts.map +1 -1
- package/dist/base/standard-game-state.js +1 -1
- package/dist/base/standard-game-state.js.map +1 -1
- package/dist/base-rooms/fast-tournament-room.d.ts +0 -13
- package/dist/base-rooms/fast-tournament-room.d.ts.map +1 -1
- package/dist/base-rooms/fast-tournament-room.js +59 -51
- package/dist/base-rooms/fast-tournament-room.js.map +1 -1
- package/dist/base-rooms/index.d.ts +1 -5
- package/dist/base-rooms/index.d.ts.map +1 -1
- package/dist/base-rooms/index.js +3 -9
- package/dist/base-rooms/index.js.map +1 -1
- package/dist/base-rooms/scheduled-tournament-room.d.ts +0 -27
- package/dist/base-rooms/scheduled-tournament-room.d.ts.map +1 -1
- package/dist/base-rooms/scheduled-tournament-room.js +181 -164
- package/dist/base-rooms/scheduled-tournament-room.js.map +1 -1
- package/dist/base-rooms/simple-room.d.ts +5 -4
- package/dist/base-rooms/simple-room.d.ts.map +1 -1
- package/dist/base-rooms/simple-room.js +16 -0
- package/dist/base-rooms/simple-room.js.map +1 -1
- package/dist/base-rooms/tournament-room.d.ts +0 -46
- package/dist/base-rooms/tournament-room.d.ts.map +1 -1
- package/dist/base-rooms/tournament-room.js +169 -109
- package/dist/base-rooms/tournament-room.js.map +1 -1
- package/dist/base-rooms/tournament-state.d.ts +2 -2
- package/dist/base-rooms/tournament-state.d.ts.map +1 -1
- package/dist/base-rooms/tournament-state.js +2 -2
- package/dist/base-rooms/tournament-state.js.map +1 -1
- package/dist/board-game/base/board-cell.d.ts +0 -15
- package/dist/board-game/base/board-cell.d.ts.map +1 -1
- package/dist/board-game/base/board-cell.js +50 -40
- package/dist/board-game/base/board-cell.js.map +1 -1
- package/dist/board-game/base/board-figure.d.ts +0 -15
- package/dist/board-game/base/board-figure.d.ts.map +1 -1
- package/dist/board-game/base/board-figure.js +49 -36
- package/dist/board-game/base/board-figure.js.map +1 -1
- package/dist/board-game/base/board-game-master.d.ts +0 -18
- package/dist/board-game/base/board-game-master.d.ts.map +1 -1
- package/dist/board-game/base/board-game-master.js +56 -34
- package/dist/board-game/base/board-game-master.js.map +1 -1
- package/dist/board-game/base/board-player-move.d.ts +0 -10
- package/dist/board-game/base/board-player-move.d.ts.map +1 -1
- package/dist/board-game/base/board-player-move.js +29 -28
- package/dist/board-game/base/board-player-move.js.map +1 -1
- package/dist/board-game/base/board-player.d.ts +0 -12
- package/dist/board-game/base/board-player.d.ts.map +1 -1
- package/dist/board-game/base/board-player.js +43 -29
- package/dist/board-game/base/board-player.js.map +1 -1
- package/dist/board-game/base/board-table.d.ts +0 -16
- package/dist/board-game/base/board-table.d.ts.map +1 -1
- package/dist/board-game/base/board-table.js +52 -33
- package/dist/board-game/base/board-table.js.map +1 -1
- package/dist/board-game/d1-board-game/d1-board-table.d.ts +0 -18
- package/dist/board-game/d1-board-game/d1-board-table.d.ts.map +1 -1
- package/dist/board-game/d1-board-game/d1-board-table.js +56 -39
- package/dist/board-game/d1-board-game/d1-board-table.js.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-cell.d.ts +0 -11
- package/dist/board-game/d2-board-game/d2-board-cell.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-cell.js +30 -24
- package/dist/board-game/d2-board-game/d2-board-cell.js.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts +0 -28
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js +79 -49
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-table.d.ts +0 -48
- package/dist/board-game/d2-board-game/d2-board-table.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-table.js +262 -182
- package/dist/board-game/d2-board-game/d2-board-table.js.map +1 -1
- package/dist/board-game/d2-board-game/types.d.ts +0 -4
- package/dist/board-game/d2-board-game/types.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/types.js +4 -1
- package/dist/board-game/d2-board-game/types.js.map +1 -1
- package/dist/board-game/dice.js +2 -2
- package/dist/board-game/dice.js.map +1 -1
- package/dist/board-game/index.d.ts +0 -12
- package/dist/board-game/index.d.ts.map +1 -1
- package/dist/board-game/index.js +28 -24
- package/dist/board-game/index.js.map +1 -1
- package/dist/cards-game/cards-game-master.d.ts +7 -8
- package/dist/cards-game/cards-game-master.d.ts.map +1 -1
- package/dist/cards-game/cards-game-master.js +13 -10
- package/dist/cards-game/cards-game-master.js.map +1 -1
- package/dist/cards-game/cards-player.d.ts.map +1 -1
- package/dist/cards-game/cards-player.js +1 -1
- package/dist/cards-game/cards-player.js.map +1 -1
- package/dist/cards-game/index.d.ts +1 -2
- package/dist/cards-game/index.d.ts.map +1 -1
- package/dist/cards-game/index.js +1 -3
- package/dist/cards-game/index.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tests/just-black-jack/domain/black-jack-dealer.d.ts +6 -0
- package/dist/tests/just-black-jack/domain/black-jack-dealer.d.ts.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-dealer.js +14 -0
- package/dist/tests/just-black-jack/domain/black-jack-dealer.js.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.d.ts +28 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.d.ts.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.js +90 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.js.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.d.ts +9 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.d.ts.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.js +21 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.js.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.d.ts +3 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.d.ts.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.js +30 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.js.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.d.ts +2 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.d.ts.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.js +34 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.js.map +1 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.d.ts +6 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.d.ts.map +1 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.js +13 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.js.map +1 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.d.ts +2 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.d.ts.map +1 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.js +58 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.js.map +1 -0
- package/dist/tests/just-black-jack/tests/common.d.ts +11 -0
- package/dist/tests/just-black-jack/tests/common.d.ts.map +1 -0
- package/dist/tests/just-black-jack/tests/common.js +51 -0
- package/dist/tests/just-black-jack/tests/common.js.map +1 -0
- package/package.json +3 -2
- package/src/base/game-control-player-turn.ts +5 -5
- package/src/base/game-master.ts +25 -19
- package/src/base/game-player-connections-helper.ts +40 -0
- package/src/base/game-player.ts +5 -2
- package/src/base/game-room.ts +26 -30
- package/src/base/game-round.ts +10 -16
- package/src/base/game-state-machine.ts +7 -7
- package/src/base/game-summary-result.ts +3 -0
- package/src/base/game-table-seat.ts +3 -3
- package/src/base/game-table-seats.ts +13 -13
- package/src/base/game-table.ts +28 -79
- package/src/base/index.ts +2 -0
- package/src/base/standard-game-state.ts +2 -2
- package/src/base-rooms/fast-tournament-room.ts +59 -59
- package/src/base-rooms/index.ts +9 -8
- package/src/base-rooms/scheduled-tournament-room.ts +181 -181
- package/src/base-rooms/simple-room.ts +15 -4
- package/src/base-rooms/tournament-room.ts +169 -169
- package/src/base-rooms/tournament-state.ts +2 -2
- package/src/board-game/base/board-cell.ts +50 -50
- package/src/board-game/base/board-figure.ts +49 -49
- package/src/board-game/base/board-game-master.ts +56 -56
- package/src/board-game/base/board-player-move.ts +29 -29
- package/src/board-game/base/board-player.ts +43 -43
- package/src/board-game/base/board-table.ts +52 -52
- package/src/board-game/d1-board-game/d1-board-table.ts +56 -56
- package/src/board-game/d2-board-game/d2-board-cell.ts +30 -30
- package/src/board-game/d2-board-game/d2-board-pattern-move-figure.ts +79 -79
- package/src/board-game/d2-board-game/d2-board-table.ts +262 -262
- package/src/board-game/d2-board-game/types.ts +4 -4
- package/src/board-game/dice.ts +1 -1
- package/src/board-game/index.ts +28 -28
- package/src/cards-game/cards-game-master.ts +19 -16
- package/src/cards-game/cards-player.ts +2 -1
- package/src/cards-game/index.ts +0 -2
- package/src/index.ts +1 -1
- package/src/tests/just-black-jack/domain/black-jack-dealer.ts +15 -0
- package/src/tests/just-black-jack/domain/black-jack-game-master.ts +103 -0
- package/src/tests/just-black-jack/domain/black-jack-player.ts +27 -0
- package/src/tests/just-black-jack/helpers/calculate-result.test.ts +49 -0
- package/src/tests/just-black-jack/helpers/calculate-result.ts +34 -0
- package/src/tests/just-black-jack/rooms/black-jack-simple-room.ts +10 -0
- package/src/tests/just-black-jack/tests/black-jack-simple-room.test.ts +75 -0
- package/src/tests/just-black-jack/tests/common.ts +63 -0
- package/dist/cards-game/cards-table.d.ts +0 -11
- package/dist/cards-game/cards-table.d.ts.map +0 -1
- package/dist/cards-game/cards-table.js +0 -20
- package/dist/cards-game/cards-table.js.map +0 -1
- package/src/cards-game/cards-table.ts +0 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/tests/just-black-jack/tests/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,iBAKnB,CAAC;AAGF,wBAAgB,QAAQ,SAEvB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.player8 = exports.player7 = exports.player6 = exports.player5 = exports.player4 = exports.player3 = exports.player2 = exports.player1 = void 0;
|
|
37
|
+
exports.mockDeck = mockDeck;
|
|
38
|
+
const black_jack_player_1 = require("../domain/black-jack-player");
|
|
39
|
+
const shuffle = __importStar(require("../../../utils/shuffle"));
|
|
40
|
+
exports.player1 = new black_jack_player_1.BlackJackPlayer('5ef77417f471c39c885d18f5', 'dima', '', 1000);
|
|
41
|
+
exports.player2 = new black_jack_player_1.BlackJackPlayer('5ef774a71486d104736561a4', 'vova', '', 500);
|
|
42
|
+
exports.player3 = new black_jack_player_1.BlackJackPlayer('5ef774a71486d104736561a5', 'pasha', '', 500);
|
|
43
|
+
exports.player4 = new black_jack_player_1.BlackJackPlayer('5ef774a71486d104736561a7', 'petya', '', 500);
|
|
44
|
+
exports.player5 = new black_jack_player_1.BlackJackPlayer('5ef774a71486d104736561a8', 'dima 2', '', 500);
|
|
45
|
+
exports.player6 = new black_jack_player_1.BlackJackPlayer('5ef774a71486d104736561a9', 'vova 2', '', 500);
|
|
46
|
+
exports.player7 = new black_jack_player_1.BlackJackPlayer('5ef774a71486d104736561a10', 'pasha 2', '', 500);
|
|
47
|
+
exports.player8 = new black_jack_player_1.BlackJackPlayer('5ef774a71486d104736561a11', 'petya 2', '', 500);
|
|
48
|
+
function mockDeck() {
|
|
49
|
+
jest.spyOn(shuffle, 'superShuffle').mockImplementation((collection) => collection);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/tests/just-black-jack/tests/common.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DA,4BAEC;AA9DD,mEAA8D;AAC9D,gEAAkD;AAErC,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,0BAA0B,EAC1B,MAAM,EACN,EAAE,EACF,IAAI,CACL,CAAC;AAEW,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,0BAA0B,EAC1B,MAAM,EACN,EAAE,EACF,GAAG,CACJ,CAAC;AAEW,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,0BAA0B,EAC1B,OAAO,EACP,EAAE,EACF,GAAG,CACJ,CAAC;AAEW,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,0BAA0B,EAC1B,OAAO,EACP,EAAE,EACF,GAAG,CACJ,CAAC;AAEW,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,0BAA0B,EAC1B,QAAQ,EACR,EAAE,EACF,GAAG,CACJ,CAAC;AAEW,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,0BAA0B,EAC1B,QAAQ,EACR,EAAE,EACF,GAAG,CACJ,CAAC;AAEW,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,2BAA2B,EAC3B,SAAS,EACT,EAAE,EACF,GAAG,CACJ,CAAC;AAEW,QAAA,OAAO,GAAG,IAAI,mCAAe,CACxC,2BAA2B,EAC3B,SAAS,EACT,EAAE,EACF,GAAG,CACJ,CAAC;AAGF,SAAgB,QAAQ;IACtB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,kBAAkB,CAAC,CAAC,UAAiB,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;AAC5F,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jp.ms.common.engine",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"node-schedule": "2.1.1",
|
|
13
13
|
"seedrandom": "3.0.5",
|
|
14
14
|
"shuffle-array": "1.0.1",
|
|
15
|
-
"uuid": "
|
|
15
|
+
"uuid": "11.1.0"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"@types/jest": "^29.5.14",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"@types/shuffle-array": "1.0.5",
|
|
24
24
|
"jest": "^29.7.0",
|
|
25
25
|
"rimraf": "6.0.1",
|
|
26
|
+
"socket.io": "4.8.1",
|
|
26
27
|
"ts-jest": "^29.2.5",
|
|
27
28
|
"typescript": "5.9.3"
|
|
28
29
|
},
|
|
@@ -2,15 +2,15 @@ import { ONE_SECOND } from '../const';
|
|
|
2
2
|
|
|
3
3
|
import { GamePlayer } from './game-player';
|
|
4
4
|
|
|
5
|
-
export class GameControlPlayerTurn
|
|
5
|
+
export class GameControlPlayerTurn {
|
|
6
6
|
private readonly playersTurnTimeout: number;
|
|
7
7
|
private playerTurnTimerId?: NodeJS.Timeout;
|
|
8
8
|
private playerTurnTimerDate: Date | null;
|
|
9
|
-
private readonly handleTurnTimeout: (player:
|
|
9
|
+
private readonly handleTurnTimeout: (player: GamePlayer) => void;
|
|
10
10
|
|
|
11
11
|
constructor (
|
|
12
12
|
playersTurnTimeout: number,
|
|
13
|
-
handleTurnTimeout: (player:
|
|
13
|
+
handleTurnTimeout: (player: GamePlayer) => void,
|
|
14
14
|
) {
|
|
15
15
|
this.playersTurnTimeout = playersTurnTimeout;
|
|
16
16
|
this.handleTurnTimeout = handleTurnTimeout;
|
|
@@ -20,7 +20,7 @@ export class GameControlPlayerTurn<GP extends GamePlayer> {
|
|
|
20
20
|
return this.playersTurnTimeout > 0;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
setPlayerTurnTimeout (player:
|
|
23
|
+
setPlayerTurnTimeout (player: GamePlayer | null) {
|
|
24
24
|
this.playerTurnTimerDate = new Date();
|
|
25
25
|
if (this.isEnableTimer() && player) {
|
|
26
26
|
this.playerTurnTimerId = setTimeout(
|
|
@@ -30,7 +30,7 @@ export class GameControlPlayerTurn<GP extends GamePlayer> {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
clearPlayerTurnTimeout (player:
|
|
33
|
+
clearPlayerTurnTimeout (player: GamePlayer | null) {
|
|
34
34
|
if (this.playerTurnTimerId) {
|
|
35
35
|
clearTimeout(this.playerTurnTimerId);
|
|
36
36
|
this.playerTurnTimerDate = null;
|
package/src/base/game-master.ts
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
1
|
import { GamePlayer } from './game-player';
|
|
2
|
-
import { IGameTable } from './game-table';
|
|
3
2
|
import { GameControlPlayerTurn } from './game-control-player-turn';
|
|
4
3
|
import { GameControlRestart } from './game-control-restart';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
import { GameTable } from './game-table';
|
|
5
|
+
import { GameSummaryResult } from './game-summary-result';
|
|
6
|
+
import { GameRound } from './game-round';
|
|
7
|
+
import { GameRoom } from './game-room';
|
|
8
|
+
|
|
9
|
+
export abstract class GameMaster {
|
|
10
|
+
protected readonly table: GameTable;
|
|
11
|
+
protected gameRound: GameRound | null;
|
|
12
|
+
public readonly controlTurn: GameControlPlayerTurn;
|
|
11
13
|
public readonly controlRestart: GameControlRestart;
|
|
12
14
|
|
|
13
|
-
protected constructor (
|
|
14
|
-
this.table =
|
|
15
|
+
protected constructor (room: GameRoom) {
|
|
16
|
+
this.table = new GameTable(room.getConfigForTable());
|
|
15
17
|
this.controlTurn = new GameControlPlayerTurn(this.table.getTurnTimeout(), this.onHandleTurnTimeout);
|
|
16
18
|
this.controlRestart = new GameControlRestart(this.table.getRestartTimeout(), this.onHandleRestartTimeout);
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
abstract onHandleTurnTimeout (player:
|
|
21
|
+
abstract onHandleTurnTimeout (player: GamePlayer);
|
|
20
22
|
|
|
21
23
|
abstract onHandleRestartTimeout ();
|
|
22
24
|
|
|
23
|
-
abstract kickPlayer (player:
|
|
25
|
+
abstract kickPlayer (player: GamePlayer);
|
|
24
26
|
|
|
25
27
|
abstract startNewRound ();
|
|
26
28
|
|
|
@@ -28,15 +30,19 @@ export abstract class GameMaster<GT extends IGameTable<GP>, GR extends IGameRoun
|
|
|
28
30
|
|
|
29
31
|
abstract changePlayer ();
|
|
30
32
|
|
|
31
|
-
abstract getResults ():
|
|
33
|
+
abstract getResults (): GameSummaryResult | null;
|
|
34
|
+
|
|
35
|
+
abstract onHandleMove (player: GamePlayer);
|
|
32
36
|
|
|
33
|
-
|
|
37
|
+
getId () {
|
|
38
|
+
return this.table.getId();
|
|
39
|
+
}
|
|
34
40
|
|
|
35
|
-
setGameRound (gameRound:
|
|
41
|
+
setGameRound (gameRound: GameRound): void {
|
|
36
42
|
this.gameRound = gameRound;
|
|
37
43
|
}
|
|
38
44
|
|
|
39
|
-
getGameRound ():
|
|
45
|
+
getGameRound (): GameRound | null {
|
|
40
46
|
return this.gameRound;
|
|
41
47
|
}
|
|
42
48
|
|
|
@@ -44,7 +50,7 @@ export abstract class GameMaster<GT extends IGameTable<GP>, GR extends IGameRoun
|
|
|
44
50
|
return this.table;
|
|
45
51
|
}
|
|
46
52
|
|
|
47
|
-
enterTheTable (player:
|
|
53
|
+
enterTheTable (player: GamePlayer) {
|
|
48
54
|
if (this.table.isFull()) {
|
|
49
55
|
this.table.addPlayerToQueue(player);
|
|
50
56
|
} else {
|
|
@@ -52,7 +58,7 @@ export abstract class GameMaster<GT extends IGameTable<GP>, GR extends IGameRoun
|
|
|
52
58
|
}
|
|
53
59
|
}
|
|
54
60
|
|
|
55
|
-
exitTheTable (player:
|
|
61
|
+
exitTheTable (player: GamePlayer) {
|
|
56
62
|
if (player.isPlayer()) {
|
|
57
63
|
this.table.removePlayerFromSeat(player);
|
|
58
64
|
} else if (player.isTableQueuer()) {
|
|
@@ -62,7 +68,7 @@ export abstract class GameMaster<GT extends IGameTable<GP>, GR extends IGameRoun
|
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
70
|
|
|
65
|
-
watchTheTable (player:
|
|
71
|
+
watchTheTable (player: GamePlayer) {
|
|
66
72
|
this.table.addPlayerToWatchers(player);
|
|
67
73
|
}
|
|
68
74
|
|
|
@@ -91,7 +97,7 @@ export abstract class GameMaster<GT extends IGameTable<GP>, GR extends IGameRoun
|
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
99
|
|
|
94
|
-
getActivePlayer ():
|
|
100
|
+
getActivePlayer (): GamePlayer | null {
|
|
95
101
|
return this.getGameRound()?.getActivePlayer() ?? null;
|
|
96
102
|
}
|
|
97
103
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Socket } from 'socket.io';
|
|
2
|
+
|
|
3
|
+
export class GamePlayerConnectionsHelper {
|
|
4
|
+
private readonly connections: Record<string, Socket>;
|
|
5
|
+
|
|
6
|
+
constructor () {
|
|
7
|
+
this.connections = {};
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public getAllConnections () {
|
|
11
|
+
return Object.keys(this.connections)
|
|
12
|
+
.map((key) => ({ key, connection: this.connections[key] }));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public addConnection (connection: Socket) {
|
|
16
|
+
this.connections[connection.id] = connection;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public clearConnections () {
|
|
20
|
+
this.getClosedConnections().forEach((connection) => {
|
|
21
|
+
delete this.connections[connection.key];
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public hasOpenConnection () {
|
|
26
|
+
return this.getOpenConnections().length > 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private getOpenConnections () {
|
|
30
|
+
return this.getAllConnections()
|
|
31
|
+
.filter((connection) =>
|
|
32
|
+
connection.connection.connected);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private getClosedConnections () {
|
|
36
|
+
return this.getAllConnections()
|
|
37
|
+
.filter((connection) =>
|
|
38
|
+
!connection.connection.connected);
|
|
39
|
+
}
|
|
40
|
+
}
|
package/src/base/game-player.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GamePlayerMove } from './game-player-move';
|
|
2
|
+
import { GamePlayerConnectionsHelper } from './game-player-connections-helper';
|
|
2
3
|
|
|
3
4
|
export enum GamePlayerRole {
|
|
4
5
|
VISITOR = 'VISITOR',
|
|
@@ -28,8 +29,9 @@ export abstract class GamePlayer {
|
|
|
28
29
|
private readonly color: number;
|
|
29
30
|
private bet: number;
|
|
30
31
|
private move: GamePlayerMove | undefined;
|
|
32
|
+
public readonly connections: GamePlayerConnectionsHelper;
|
|
31
33
|
|
|
32
|
-
constructor (
|
|
34
|
+
protected constructor (
|
|
33
35
|
id: string,
|
|
34
36
|
fullName: string,
|
|
35
37
|
avatarUrl: string,
|
|
@@ -43,6 +45,7 @@ export abstract class GamePlayer {
|
|
|
43
45
|
this.stack = 0;
|
|
44
46
|
this.color = color ?? 0;
|
|
45
47
|
this.bet = 0;
|
|
48
|
+
this.connections = new GamePlayerConnectionsHelper();
|
|
46
49
|
}
|
|
47
50
|
|
|
48
51
|
getId (): string {
|
|
@@ -159,7 +162,7 @@ export abstract class GamePlayer {
|
|
|
159
162
|
}
|
|
160
163
|
|
|
161
164
|
hasOpenConnection () {
|
|
162
|
-
return
|
|
165
|
+
return this.connections.hasOpenConnection();
|
|
163
166
|
}
|
|
164
167
|
|
|
165
168
|
flush () {
|
package/src/base/game-room.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { first } from 'lodash';
|
|
2
|
-
import { remove } from 'lodash';
|
|
1
|
+
import { first, remove } from 'lodash';
|
|
3
2
|
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { GameTable, GameTableConfig } from './game-table';
|
|
4
|
+
import { GameMaster } from './game-master';
|
|
6
5
|
|
|
7
6
|
export type GameRoomConfig = {
|
|
8
7
|
id: string;
|
|
@@ -15,20 +14,20 @@ export type GameRoomConfig = {
|
|
|
15
14
|
restartTimeout: number;
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
export abstract class GameRoom
|
|
17
|
+
export abstract class GameRoom {
|
|
19
18
|
private readonly id: string;
|
|
20
19
|
private readonly gameType: string;
|
|
21
20
|
private readonly roomType: string;
|
|
22
21
|
private readonly rulesType: string;
|
|
23
22
|
private readonly maxPlayers: number;
|
|
24
23
|
private readonly bet: number;
|
|
25
|
-
private readonly tables: Array<GT>;
|
|
26
24
|
private readonly turnTimeout: number;
|
|
27
25
|
private readonly restartTimeout: number;
|
|
28
26
|
private createdTableCount: number;
|
|
27
|
+
private readonly masters: Array<GameMaster>;
|
|
29
28
|
|
|
30
29
|
constructor (config: GameRoomConfig) {
|
|
31
|
-
this.
|
|
30
|
+
this.masters = [];
|
|
32
31
|
this.createdTableCount = 0;
|
|
33
32
|
this.id = config.id;
|
|
34
33
|
this.roomType = config.roomType;
|
|
@@ -40,15 +39,11 @@ export abstract class GameRoom<GT extends IGameTable<GP>, GP extends GamePlayer>
|
|
|
40
39
|
this.restartTimeout = config.restartTimeout;
|
|
41
40
|
}
|
|
42
41
|
|
|
43
|
-
abstract
|
|
42
|
+
abstract createMaster (): GameMaster;
|
|
44
43
|
|
|
45
|
-
abstract
|
|
44
|
+
abstract handleFinishRound (table: GameTable): void;
|
|
46
45
|
|
|
47
|
-
abstract
|
|
48
|
-
|
|
49
|
-
abstract handleFinishRound (table: IGameTable<GP>);
|
|
50
|
-
|
|
51
|
-
abstract handleRestartRound (table: IGameTable<GP>);
|
|
46
|
+
abstract handleRestartRound (table: GameTable): void;
|
|
52
47
|
|
|
53
48
|
getId () {
|
|
54
49
|
return this.id;
|
|
@@ -70,24 +65,25 @@ export abstract class GameRoom<GT extends IGameTable<GP>, GP extends GamePlayer>
|
|
|
70
65
|
return this.maxPlayers;
|
|
71
66
|
}
|
|
72
67
|
|
|
73
|
-
|
|
74
|
-
return this.
|
|
68
|
+
getMasters (): Array<GameMaster> {
|
|
69
|
+
return this.masters;
|
|
75
70
|
}
|
|
76
71
|
|
|
77
|
-
|
|
78
|
-
return first(this.
|
|
72
|
+
getFirstMaster (): GameMaster | undefined {
|
|
73
|
+
return first(this.getMasters());
|
|
79
74
|
}
|
|
80
75
|
|
|
81
|
-
|
|
82
|
-
return this.
|
|
76
|
+
getMasterWithFreeSeats (): GameTable | undefined {
|
|
77
|
+
return this.masters.find((master) =>
|
|
78
|
+
master.getTable().getPlayers().length + master.getTable().getQueue().length < master.getTable().getTableSize()).getTable();
|
|
83
79
|
}
|
|
84
80
|
|
|
85
|
-
|
|
86
|
-
return this.
|
|
81
|
+
remainOneMaster (): boolean {
|
|
82
|
+
return this.masters.length === 1;
|
|
87
83
|
}
|
|
88
84
|
|
|
89
|
-
|
|
90
|
-
return this.
|
|
85
|
+
getMasterById (id: string): GameMaster | undefined {
|
|
86
|
+
return this.masters.find((item) => item.getId() === id);
|
|
91
87
|
}
|
|
92
88
|
|
|
93
89
|
getFreeTableNumber (): number {
|
|
@@ -98,30 +94,30 @@ export abstract class GameRoom<GT extends IGameTable<GP>, GP extends GamePlayer>
|
|
|
98
94
|
return this.createdTableCount;
|
|
99
95
|
}
|
|
100
96
|
|
|
101
|
-
|
|
102
|
-
this.
|
|
97
|
+
addMaster (): void {
|
|
98
|
+
this.masters.push(this.createMaster());
|
|
103
99
|
this.createdTableCount += 1;
|
|
104
100
|
}
|
|
105
101
|
|
|
106
|
-
|
|
107
|
-
remove(this.
|
|
102
|
+
removeMaster (masterId: string): void {
|
|
103
|
+
remove(this.masters, (master) => master.getId() === masterId);
|
|
108
104
|
}
|
|
109
105
|
|
|
110
106
|
getBet () {
|
|
111
107
|
return this.bet;
|
|
112
108
|
}
|
|
113
109
|
|
|
114
|
-
getConfigForTable (): GameTableConfig
|
|
110
|
+
getConfigForTable (): GameTableConfig {
|
|
115
111
|
return {
|
|
116
112
|
roomId: this.getId(),
|
|
117
113
|
number: this.getFreeTableNumber(),
|
|
118
114
|
tableSize: this.getMaxPlayers(),
|
|
119
115
|
bet: this.getBet(),
|
|
116
|
+
rulesType: this.getRulesType(),
|
|
120
117
|
turnTimeout: this.turnTimeout,
|
|
121
118
|
restartTimeout: this.restartTimeout,
|
|
122
119
|
onRoomFinishRound: this.handleFinishRound,
|
|
123
120
|
onRoomRestartRound: this.handleRestartRound,
|
|
124
|
-
rulesType: this.getRulesType(),
|
|
125
121
|
};
|
|
126
122
|
}
|
|
127
123
|
}
|
package/src/base/game-round.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { v4 as uidv4 } from 'uuid';
|
|
2
2
|
|
|
3
|
+
import { GamePlayer } from './game-player';
|
|
4
|
+
import { GameStateMachine } from './game-state-machine';
|
|
5
|
+
|
|
3
6
|
export type GameRoundHistoryItem = {
|
|
4
7
|
userId: string;
|
|
5
8
|
fullName: string;
|
|
@@ -8,33 +11,24 @@ export type GameRoundHistoryItem = {
|
|
|
8
11
|
state: string;
|
|
9
12
|
}
|
|
10
13
|
|
|
11
|
-
export
|
|
12
|
-
getActivePlayer (): GP;
|
|
13
|
-
|
|
14
|
-
setActivePlayer (activePlayer: GP);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export abstract class GameRound<SM, GP> implements IGameRound<GP> {
|
|
14
|
+
export class GameRound {
|
|
18
15
|
private readonly history: Array<GameRoundHistoryItem>;
|
|
19
16
|
private id: string;
|
|
20
17
|
private pot: number;
|
|
21
|
-
private state:
|
|
22
|
-
private activePlayer:
|
|
18
|
+
private state: GameStateMachine;
|
|
19
|
+
private activePlayer: GamePlayer;
|
|
23
20
|
|
|
24
|
-
|
|
21
|
+
constructor (state: GameStateMachine) {
|
|
25
22
|
this.id = uidv4();
|
|
26
23
|
this.pot = 0;
|
|
27
24
|
this.history = [];
|
|
25
|
+
this.state = state;
|
|
28
26
|
}
|
|
29
27
|
|
|
30
|
-
getState ():
|
|
28
|
+
getState (): GameStateMachine {
|
|
31
29
|
return this.state;
|
|
32
30
|
}
|
|
33
31
|
|
|
34
|
-
setState (state: SM): void {
|
|
35
|
-
this.state = state;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
32
|
getHistory (): Array<GameRoundHistoryItem> {
|
|
39
33
|
return this.history;
|
|
40
34
|
}
|
|
@@ -55,7 +49,7 @@ export abstract class GameRound<SM, GP> implements IGameRound<GP> {
|
|
|
55
49
|
return this.activePlayer;
|
|
56
50
|
}
|
|
57
51
|
|
|
58
|
-
setActivePlayer (activePlayer:
|
|
52
|
+
setActivePlayer (activePlayer: GamePlayer) {
|
|
59
53
|
this.activePlayer = activePlayer;
|
|
60
54
|
}
|
|
61
55
|
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
export type StateMachineConfig = Record<string, { on: Record<string, string> }>
|
|
2
2
|
|
|
3
|
-
export abstract class GameStateMachine
|
|
4
|
-
private readonly initialState:
|
|
5
|
-
private currentState:
|
|
3
|
+
export abstract class GameStateMachine {
|
|
4
|
+
private readonly initialState: string;
|
|
5
|
+
private currentState: string;
|
|
6
6
|
private config: StateMachineConfig;
|
|
7
7
|
|
|
8
|
-
protected constructor (initialState:
|
|
8
|
+
protected constructor (initialState: string, config: StateMachineConfig) {
|
|
9
9
|
this.config = config;
|
|
10
10
|
this.initialState = initialState;
|
|
11
11
|
this.currentState = this.initialState;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
getCurrentState ():
|
|
14
|
+
getCurrentState (): string {
|
|
15
15
|
return this.currentState;
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -19,7 +19,7 @@ export abstract class GameStateMachine<S, A> {
|
|
|
19
19
|
this.currentState = this.initialState;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
send (action:
|
|
23
|
-
this.currentState = this.config[this.currentState as string].on[action as string]
|
|
22
|
+
send (action: string) {
|
|
23
|
+
this.currentState = this.config[this.currentState as string].on[action as string];
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GamePlayer } from './game-player';
|
|
2
2
|
|
|
3
|
-
export class GameTableSeat
|
|
4
|
-
private player:
|
|
3
|
+
export class GameTableSeat {
|
|
4
|
+
private player: GamePlayer | null = null;
|
|
5
5
|
private role: string | null;
|
|
6
6
|
|
|
7
7
|
constructor (private readonly number: number) {
|
|
@@ -27,7 +27,7 @@ export class GameTableSeat<GP extends GamePlayer> {
|
|
|
27
27
|
return this.player;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
addPlayer (player:
|
|
30
|
+
addPlayer (player: GamePlayer) {
|
|
31
31
|
this.player = player;
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -6,34 +6,34 @@ import { TWO_PLAYER_GAME } from '../const';
|
|
|
6
6
|
import { GameTableSeat } from './game-table-seat';
|
|
7
7
|
import { GamePlayer } from './game-player';
|
|
8
8
|
|
|
9
|
-
export class GameTableSeats
|
|
10
|
-
protected readonly seats: CircleList<GameTableSeat
|
|
9
|
+
export class GameTableSeats {
|
|
10
|
+
protected readonly seats: CircleList<GameTableSeat>;
|
|
11
11
|
|
|
12
12
|
constructor (private readonly tableSize: number) {
|
|
13
13
|
this.seats = new CircleList();
|
|
14
14
|
|
|
15
15
|
for (let i = 0; i < this.tableSize; i += 1) {
|
|
16
|
-
this.seats.push(new GameTableSeat
|
|
16
|
+
this.seats.push(new GameTableSeat(i + 1));
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
getSeats (): Array<GameTableSeat
|
|
20
|
+
getSeats (): Array<GameTableSeat> {
|
|
21
21
|
return this.seats.toArray();
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
getSeatsWithPlayers (): Array<GameTableSeat
|
|
24
|
+
getSeatsWithPlayers (): Array<GameTableSeat> {
|
|
25
25
|
return this.seats.toArray().filter((item) => !!item.getPlayer());
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
getSeat (number: number | null): GameTableSeat
|
|
28
|
+
getSeat (number: number | null): GameTableSeat | undefined {
|
|
29
29
|
return this.seats.toArray().find((item) => item.getNumber() === number);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
getNextSeat (from: number): GameTableSeat
|
|
32
|
+
getNextSeat (from: number): GameTableSeat | undefined {
|
|
33
33
|
return this.seats.get(from - 1)?.getNext()?.getData();
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
getNextPlayer (from: number):
|
|
36
|
+
getNextPlayer (from: number): GamePlayer | null {
|
|
37
37
|
const nextSeat = this.getNextSeat(from);
|
|
38
38
|
const nextPlayer = nextSeat?.getPlayer();
|
|
39
39
|
|
|
@@ -44,25 +44,25 @@ export class GameTableSeats<GP extends GamePlayer> {
|
|
|
44
44
|
return nextPlayer;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
getPrevSeat (from: number): GameTableSeat
|
|
47
|
+
getPrevSeat (from: number): GameTableSeat | undefined {
|
|
48
48
|
return this.seats.get(from - 1)?.getPrev()?.getData();
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
getPrevPlayer (from: number):
|
|
51
|
+
getPrevPlayer (from: number): GamePlayer | null {
|
|
52
52
|
return this.getPrevSeat(from)?.getPlayer() ?? null;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
getPlayersChain (from: number): Array<
|
|
55
|
+
getPlayersChain (from: number): Array<GamePlayer> {
|
|
56
56
|
const chain = this.seats.getNextChain(from).map((item) => item.getPlayer());
|
|
57
57
|
|
|
58
58
|
return compact(chain);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
getFirstSeatWithPlayer (): GameTableSeat
|
|
61
|
+
getFirstSeatWithPlayer (): GameTableSeat | null {
|
|
62
62
|
return this.getSeatsWithPlayers()[0] ?? null;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
findFreeSeat (): GameTableSeat
|
|
65
|
+
findFreeSeat (): GameTableSeat | undefined {
|
|
66
66
|
return this.seats.toArray().find((seat) => seat.getPlayer() === null);
|
|
67
67
|
}
|
|
68
68
|
|