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.
Files changed (218) hide show
  1. package/dist/base/game-control-player-turn.d.ts +4 -4
  2. package/dist/base/game-control-player-turn.d.ts.map +1 -1
  3. package/dist/base/game-control-player-turn.js.map +1 -1
  4. package/dist/base/game-master.d.ts +24 -21
  5. package/dist/base/game-master.d.ts.map +1 -1
  6. package/dist/base/game-master.js +6 -2
  7. package/dist/base/game-master.js.map +1 -1
  8. package/dist/base/game-player-connections-helper.d.ts +15 -0
  9. package/dist/base/game-player-connections-helper.d.ts.map +1 -0
  10. package/dist/base/game-player-connections-helper.js +33 -0
  11. package/dist/base/game-player-connections-helper.js.map +1 -0
  12. package/dist/base/game-player.d.ts +3 -1
  13. package/dist/base/game-player.d.ts.map +1 -1
  14. package/dist/base/game-player.js +3 -1
  15. package/dist/base/game-player.js.map +1 -1
  16. package/dist/base/game-room.d.ts +15 -17
  17. package/dist/base/game-room.d.ts.map +1 -1
  18. package/dist/base/game-room.js +16 -17
  19. package/dist/base/game-room.js.map +1 -1
  20. package/dist/base/game-round.d.ts +7 -10
  21. package/dist/base/game-round.d.ts.map +1 -1
  22. package/dist/base/game-round.js +2 -4
  23. package/dist/base/game-round.js.map +1 -1
  24. package/dist/base/game-state-machine.d.ts +4 -4
  25. package/dist/base/game-state-machine.d.ts.map +1 -1
  26. package/dist/base/game-state-machine.js.map +1 -1
  27. package/dist/base/game-summary-result.d.ts +3 -0
  28. package/dist/base/game-summary-result.d.ts.map +1 -0
  29. package/dist/base/game-summary-result.js +7 -0
  30. package/dist/base/game-summary-result.js.map +1 -0
  31. package/dist/base/game-table-seat.d.ts +3 -3
  32. package/dist/base/game-table-seat.d.ts.map +1 -1
  33. package/dist/base/game-table-seat.js.map +1 -1
  34. package/dist/base/game-table-seats.d.ts +12 -12
  35. package/dist/base/game-table-seats.d.ts.map +1 -1
  36. package/dist/base/game-table-seats.js.map +1 -1
  37. package/dist/base/game-table.d.ts +25 -51
  38. package/dist/base/game-table.d.ts.map +1 -1
  39. package/dist/base/game-table.js.map +1 -1
  40. package/dist/base/index.d.ts +2 -1
  41. package/dist/base/index.d.ts.map +1 -1
  42. package/dist/base/index.js +3 -1
  43. package/dist/base/index.js.map +1 -1
  44. package/dist/base/standard-game-state.d.ts +2 -2
  45. package/dist/base/standard-game-state.d.ts.map +1 -1
  46. package/dist/base/standard-game-state.js +1 -1
  47. package/dist/base/standard-game-state.js.map +1 -1
  48. package/dist/base-rooms/fast-tournament-room.d.ts +0 -13
  49. package/dist/base-rooms/fast-tournament-room.d.ts.map +1 -1
  50. package/dist/base-rooms/fast-tournament-room.js +59 -51
  51. package/dist/base-rooms/fast-tournament-room.js.map +1 -1
  52. package/dist/base-rooms/index.d.ts +1 -5
  53. package/dist/base-rooms/index.d.ts.map +1 -1
  54. package/dist/base-rooms/index.js +3 -9
  55. package/dist/base-rooms/index.js.map +1 -1
  56. package/dist/base-rooms/scheduled-tournament-room.d.ts +0 -27
  57. package/dist/base-rooms/scheduled-tournament-room.d.ts.map +1 -1
  58. package/dist/base-rooms/scheduled-tournament-room.js +181 -164
  59. package/dist/base-rooms/scheduled-tournament-room.js.map +1 -1
  60. package/dist/base-rooms/simple-room.d.ts +5 -4
  61. package/dist/base-rooms/simple-room.d.ts.map +1 -1
  62. package/dist/base-rooms/simple-room.js +16 -0
  63. package/dist/base-rooms/simple-room.js.map +1 -1
  64. package/dist/base-rooms/tournament-room.d.ts +0 -46
  65. package/dist/base-rooms/tournament-room.d.ts.map +1 -1
  66. package/dist/base-rooms/tournament-room.js +169 -109
  67. package/dist/base-rooms/tournament-room.js.map +1 -1
  68. package/dist/base-rooms/tournament-state.d.ts +2 -2
  69. package/dist/base-rooms/tournament-state.d.ts.map +1 -1
  70. package/dist/base-rooms/tournament-state.js +2 -2
  71. package/dist/base-rooms/tournament-state.js.map +1 -1
  72. package/dist/board-game/base/board-cell.d.ts +0 -15
  73. package/dist/board-game/base/board-cell.d.ts.map +1 -1
  74. package/dist/board-game/base/board-cell.js +50 -40
  75. package/dist/board-game/base/board-cell.js.map +1 -1
  76. package/dist/board-game/base/board-figure.d.ts +0 -15
  77. package/dist/board-game/base/board-figure.d.ts.map +1 -1
  78. package/dist/board-game/base/board-figure.js +49 -36
  79. package/dist/board-game/base/board-figure.js.map +1 -1
  80. package/dist/board-game/base/board-game-master.d.ts +0 -18
  81. package/dist/board-game/base/board-game-master.d.ts.map +1 -1
  82. package/dist/board-game/base/board-game-master.js +56 -34
  83. package/dist/board-game/base/board-game-master.js.map +1 -1
  84. package/dist/board-game/base/board-player-move.d.ts +0 -10
  85. package/dist/board-game/base/board-player-move.d.ts.map +1 -1
  86. package/dist/board-game/base/board-player-move.js +29 -28
  87. package/dist/board-game/base/board-player-move.js.map +1 -1
  88. package/dist/board-game/base/board-player.d.ts +0 -12
  89. package/dist/board-game/base/board-player.d.ts.map +1 -1
  90. package/dist/board-game/base/board-player.js +43 -29
  91. package/dist/board-game/base/board-player.js.map +1 -1
  92. package/dist/board-game/base/board-table.d.ts +0 -16
  93. package/dist/board-game/base/board-table.d.ts.map +1 -1
  94. package/dist/board-game/base/board-table.js +52 -33
  95. package/dist/board-game/base/board-table.js.map +1 -1
  96. package/dist/board-game/d1-board-game/d1-board-table.d.ts +0 -18
  97. package/dist/board-game/d1-board-game/d1-board-table.d.ts.map +1 -1
  98. package/dist/board-game/d1-board-game/d1-board-table.js +56 -39
  99. package/dist/board-game/d1-board-game/d1-board-table.js.map +1 -1
  100. package/dist/board-game/d2-board-game/d2-board-cell.d.ts +0 -11
  101. package/dist/board-game/d2-board-game/d2-board-cell.d.ts.map +1 -1
  102. package/dist/board-game/d2-board-game/d2-board-cell.js +30 -24
  103. package/dist/board-game/d2-board-game/d2-board-cell.js.map +1 -1
  104. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts +0 -28
  105. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts.map +1 -1
  106. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js +79 -49
  107. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js.map +1 -1
  108. package/dist/board-game/d2-board-game/d2-board-table.d.ts +0 -48
  109. package/dist/board-game/d2-board-game/d2-board-table.d.ts.map +1 -1
  110. package/dist/board-game/d2-board-game/d2-board-table.js +262 -182
  111. package/dist/board-game/d2-board-game/d2-board-table.js.map +1 -1
  112. package/dist/board-game/d2-board-game/types.d.ts +0 -4
  113. package/dist/board-game/d2-board-game/types.d.ts.map +1 -1
  114. package/dist/board-game/d2-board-game/types.js +4 -1
  115. package/dist/board-game/d2-board-game/types.js.map +1 -1
  116. package/dist/board-game/dice.js +2 -2
  117. package/dist/board-game/dice.js.map +1 -1
  118. package/dist/board-game/index.d.ts +0 -12
  119. package/dist/board-game/index.d.ts.map +1 -1
  120. package/dist/board-game/index.js +28 -24
  121. package/dist/board-game/index.js.map +1 -1
  122. package/dist/cards-game/cards-game-master.d.ts +7 -8
  123. package/dist/cards-game/cards-game-master.d.ts.map +1 -1
  124. package/dist/cards-game/cards-game-master.js +13 -10
  125. package/dist/cards-game/cards-game-master.js.map +1 -1
  126. package/dist/cards-game/cards-player.d.ts.map +1 -1
  127. package/dist/cards-game/cards-player.js +1 -1
  128. package/dist/cards-game/cards-player.js.map +1 -1
  129. package/dist/cards-game/index.d.ts +1 -2
  130. package/dist/cards-game/index.d.ts.map +1 -1
  131. package/dist/cards-game/index.js +1 -3
  132. package/dist/cards-game/index.js.map +1 -1
  133. package/dist/index.d.ts +0 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +1 -1
  136. package/dist/index.js.map +1 -1
  137. package/dist/tests/just-black-jack/domain/black-jack-dealer.d.ts +6 -0
  138. package/dist/tests/just-black-jack/domain/black-jack-dealer.d.ts.map +1 -0
  139. package/dist/tests/just-black-jack/domain/black-jack-dealer.js +14 -0
  140. package/dist/tests/just-black-jack/domain/black-jack-dealer.js.map +1 -0
  141. package/dist/tests/just-black-jack/domain/black-jack-game-master.d.ts +28 -0
  142. package/dist/tests/just-black-jack/domain/black-jack-game-master.d.ts.map +1 -0
  143. package/dist/tests/just-black-jack/domain/black-jack-game-master.js +90 -0
  144. package/dist/tests/just-black-jack/domain/black-jack-game-master.js.map +1 -0
  145. package/dist/tests/just-black-jack/domain/black-jack-player.d.ts +9 -0
  146. package/dist/tests/just-black-jack/domain/black-jack-player.d.ts.map +1 -0
  147. package/dist/tests/just-black-jack/domain/black-jack-player.js +21 -0
  148. package/dist/tests/just-black-jack/domain/black-jack-player.js.map +1 -0
  149. package/dist/tests/just-black-jack/helpers/calculate-result.d.ts +3 -0
  150. package/dist/tests/just-black-jack/helpers/calculate-result.d.ts.map +1 -0
  151. package/dist/tests/just-black-jack/helpers/calculate-result.js +30 -0
  152. package/dist/tests/just-black-jack/helpers/calculate-result.js.map +1 -0
  153. package/dist/tests/just-black-jack/helpers/calculate-result.test.d.ts +2 -0
  154. package/dist/tests/just-black-jack/helpers/calculate-result.test.d.ts.map +1 -0
  155. package/dist/tests/just-black-jack/helpers/calculate-result.test.js +34 -0
  156. package/dist/tests/just-black-jack/helpers/calculate-result.test.js.map +1 -0
  157. package/dist/tests/just-black-jack/rooms/black-jack-simple-room.d.ts +6 -0
  158. package/dist/tests/just-black-jack/rooms/black-jack-simple-room.d.ts.map +1 -0
  159. package/dist/tests/just-black-jack/rooms/black-jack-simple-room.js +13 -0
  160. package/dist/tests/just-black-jack/rooms/black-jack-simple-room.js.map +1 -0
  161. package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.d.ts +2 -0
  162. package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.d.ts.map +1 -0
  163. package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.js +58 -0
  164. package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.js.map +1 -0
  165. package/dist/tests/just-black-jack/tests/common.d.ts +11 -0
  166. package/dist/tests/just-black-jack/tests/common.d.ts.map +1 -0
  167. package/dist/tests/just-black-jack/tests/common.js +51 -0
  168. package/dist/tests/just-black-jack/tests/common.js.map +1 -0
  169. package/package.json +3 -2
  170. package/src/base/game-control-player-turn.ts +5 -5
  171. package/src/base/game-master.ts +25 -19
  172. package/src/base/game-player-connections-helper.ts +40 -0
  173. package/src/base/game-player.ts +5 -2
  174. package/src/base/game-room.ts +26 -30
  175. package/src/base/game-round.ts +10 -16
  176. package/src/base/game-state-machine.ts +7 -7
  177. package/src/base/game-summary-result.ts +3 -0
  178. package/src/base/game-table-seat.ts +3 -3
  179. package/src/base/game-table-seats.ts +13 -13
  180. package/src/base/game-table.ts +28 -79
  181. package/src/base/index.ts +2 -0
  182. package/src/base/standard-game-state.ts +2 -2
  183. package/src/base-rooms/fast-tournament-room.ts +59 -59
  184. package/src/base-rooms/index.ts +9 -8
  185. package/src/base-rooms/scheduled-tournament-room.ts +181 -181
  186. package/src/base-rooms/simple-room.ts +15 -4
  187. package/src/base-rooms/tournament-room.ts +169 -169
  188. package/src/base-rooms/tournament-state.ts +2 -2
  189. package/src/board-game/base/board-cell.ts +50 -50
  190. package/src/board-game/base/board-figure.ts +49 -49
  191. package/src/board-game/base/board-game-master.ts +56 -56
  192. package/src/board-game/base/board-player-move.ts +29 -29
  193. package/src/board-game/base/board-player.ts +43 -43
  194. package/src/board-game/base/board-table.ts +52 -52
  195. package/src/board-game/d1-board-game/d1-board-table.ts +56 -56
  196. package/src/board-game/d2-board-game/d2-board-cell.ts +30 -30
  197. package/src/board-game/d2-board-game/d2-board-pattern-move-figure.ts +79 -79
  198. package/src/board-game/d2-board-game/d2-board-table.ts +262 -262
  199. package/src/board-game/d2-board-game/types.ts +4 -4
  200. package/src/board-game/dice.ts +1 -1
  201. package/src/board-game/index.ts +28 -28
  202. package/src/cards-game/cards-game-master.ts +19 -16
  203. package/src/cards-game/cards-player.ts +2 -1
  204. package/src/cards-game/index.ts +0 -2
  205. package/src/index.ts +1 -1
  206. package/src/tests/just-black-jack/domain/black-jack-dealer.ts +15 -0
  207. package/src/tests/just-black-jack/domain/black-jack-game-master.ts +103 -0
  208. package/src/tests/just-black-jack/domain/black-jack-player.ts +27 -0
  209. package/src/tests/just-black-jack/helpers/calculate-result.test.ts +49 -0
  210. package/src/tests/just-black-jack/helpers/calculate-result.ts +34 -0
  211. package/src/tests/just-black-jack/rooms/black-jack-simple-room.ts +10 -0
  212. package/src/tests/just-black-jack/tests/black-jack-simple-room.test.ts +75 -0
  213. package/src/tests/just-black-jack/tests/common.ts +63 -0
  214. package/dist/cards-game/cards-table.d.ts +0 -11
  215. package/dist/cards-game/cards-table.d.ts.map +0 -1
  216. package/dist/cards-game/cards-table.js +0 -20
  217. package/dist/cards-game/cards-table.js.map +0 -1
  218. 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.2",
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": "13.0.0"
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<GP extends GamePlayer> {
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: GP) => void;
9
+ private readonly handleTurnTimeout: (player: GamePlayer) => void;
10
10
 
11
11
  constructor (
12
12
  playersTurnTimeout: number,
13
- handleTurnTimeout: (player: GP) => void,
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: GP | null) {
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: GP | null) {
33
+ clearPlayerTurnTimeout (player: GamePlayer | null) {
34
34
  if (this.playerTurnTimerId) {
35
35
  clearTimeout(this.playerTurnTimerId);
36
36
  this.playerTurnTimerDate = null;
@@ -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 { IGameRound } from './game-round';
6
-
7
- export abstract class GameMaster<GT extends IGameTable<GP>, GR extends IGameRound<GP>, GP extends GamePlayer, GSR> {
8
- protected readonly table: GT;
9
- protected gameRound: GR | null;
10
- public readonly controlTurn: GameControlPlayerTurn<GP>;
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 (table: GT) {
14
- this.table = 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: GP);
21
+ abstract onHandleTurnTimeout (player: GamePlayer);
20
22
 
21
23
  abstract onHandleRestartTimeout ();
22
24
 
23
- abstract kickPlayer (player: GP);
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 (): GSR | null;
33
+ abstract getResults (): GameSummaryResult | null;
34
+
35
+ abstract onHandleMove (player: GamePlayer);
32
36
 
33
- abstract onHandleMove (player: GP);
37
+ getId () {
38
+ return this.table.getId();
39
+ }
34
40
 
35
- setGameRound (gameRound: GR): void {
41
+ setGameRound (gameRound: GameRound): void {
36
42
  this.gameRound = gameRound;
37
43
  }
38
44
 
39
- getGameRound (): GR | null {
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: GP) {
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: GP) {
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: GP) {
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 (): GP | null {
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
+ }
@@ -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 true;
165
+ return this.connections.hasOpenConnection();
163
166
  }
164
167
 
165
168
  flush () {
@@ -1,8 +1,7 @@
1
- import { first } from 'lodash';
2
- import { remove } from 'lodash';
1
+ import { first, remove } from 'lodash';
3
2
 
4
- import { GameTableConfig, IGameTable } from './game-table';
5
- import { GamePlayer } from './game-player';
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<GT extends IGameTable<GP>, GP extends GamePlayer> {
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.tables = [];
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 createTable (): GT;
42
+ abstract createMaster (): GameMaster;
44
43
 
45
- abstract handleWatchTheTable (player: GP, tableId: string);
44
+ abstract handleFinishRound (table: GameTable): void;
46
45
 
47
- abstract handleMove (player: GP, tableId: string);
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
- getTables (): Array<GT> {
74
- return this.tables;
68
+ getMasters (): Array<GameMaster> {
69
+ return this.masters;
75
70
  }
76
71
 
77
- getFirstTable (): GT | undefined {
78
- return first(this.getTables());
72
+ getFirstMaster (): GameMaster | undefined {
73
+ return first(this.getMasters());
79
74
  }
80
75
 
81
- getTableWithFreeSeats (): GT | undefined {
82
- return this.tables.find((table) => table.getPlayers().length + table.getQueue().length < table.getTableSize());
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
- remainOneTable (): boolean {
86
- return this.tables.length === 1;
81
+ remainOneMaster (): boolean {
82
+ return this.masters.length === 1;
87
83
  }
88
84
 
89
- getTableById (id: string): GT | undefined {
90
- return this.tables.find((item) => item.getId() === id);
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
- addTable (newTable: GT): void {
102
- this.tables.push(newTable);
97
+ addMaster (): void {
98
+ this.masters.push(this.createMaster());
103
99
  this.createdTableCount += 1;
104
100
  }
105
101
 
106
- removeTable (removingTable: GT): void {
107
- remove(this.tables, (table) => table.getId() === removingTable.getId());
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<GP> {
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
  }
@@ -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 interface IGameRound<GP> {
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: SM;
22
- private activePlayer: GP;
18
+ private state: GameStateMachine;
19
+ private activePlayer: GamePlayer;
23
20
 
24
- protected constructor () {
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 (): SM {
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: GP) {
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<S, A> {
4
- private readonly initialState: S;
5
- private currentState: S;
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: S, config: StateMachineConfig) {
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 (): S {
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: A) {
23
- this.currentState = this.config[this.currentState as string].on[action as string] as S;
22
+ send (action: string) {
23
+ this.currentState = this.config[this.currentState as string].on[action as string];
24
24
  }
25
25
  }
@@ -0,0 +1,3 @@
1
+ export class GameSummaryResult {
2
+
3
+ }
@@ -1,7 +1,7 @@
1
1
  import { GamePlayer } from './game-player';
2
2
 
3
- export class GameTableSeat<GP extends GamePlayer> {
4
- private player: GP | null = null;
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: GP) {
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<GP extends GamePlayer> {
10
- protected readonly seats: CircleList<GameTableSeat<GP>>;
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<GP>(i + 1));
16
+ this.seats.push(new GameTableSeat(i + 1));
17
17
  }
18
18
  }
19
19
 
20
- getSeats (): Array<GameTableSeat<GP>> {
20
+ getSeats (): Array<GameTableSeat> {
21
21
  return this.seats.toArray();
22
22
  }
23
23
 
24
- getSeatsWithPlayers (): Array<GameTableSeat<GP>> {
24
+ getSeatsWithPlayers (): Array<GameTableSeat> {
25
25
  return this.seats.toArray().filter((item) => !!item.getPlayer());
26
26
  }
27
27
 
28
- getSeat (number: number | null): GameTableSeat<GP> | undefined {
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<GP> | undefined {
32
+ getNextSeat (from: number): GameTableSeat | undefined {
33
33
  return this.seats.get(from - 1)?.getNext()?.getData();
34
34
  }
35
35
 
36
- getNextPlayer (from: number): GP | null {
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<GP> | undefined {
47
+ getPrevSeat (from: number): GameTableSeat | undefined {
48
48
  return this.seats.get(from - 1)?.getPrev()?.getData();
49
49
  }
50
50
 
51
- getPrevPlayer (from: number): GP | null {
51
+ getPrevPlayer (from: number): GamePlayer | null {
52
52
  return this.getPrevSeat(from)?.getPlayer() ?? null;
53
53
  }
54
54
 
55
- getPlayersChain (from: number): Array<GP> {
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<GP> | null {
61
+ getFirstSeatWithPlayer (): GameTableSeat | null {
62
62
  return this.getSeatsWithPlayers()[0] ?? null;
63
63
  }
64
64
 
65
- findFreeSeat (): GameTableSeat<GP> | undefined {
65
+ findFreeSeat (): GameTableSeat | undefined {
66
66
  return this.seats.toArray().find((seat) => seat.getPlayer() === null);
67
67
  }
68
68