jp.ms.common.engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/dist/base/game-control-player-turn.d.ts +12 -0
  2. package/dist/base/game-control-player-turn.d.ts.map +1 -0
  3. package/dist/base/game-control-player-turn.js +27 -0
  4. package/dist/base/game-control-player-turn.js.map +1 -0
  5. package/dist/base/game-control-restart.d.ts +10 -0
  6. package/dist/base/game-control-restart.d.ts.map +1 -0
  7. package/dist/base/game-control-restart.js +21 -0
  8. package/dist/base/game-control-restart.js.map +1 -0
  9. package/dist/base/game-master.d.ts +34 -0
  10. package/dist/base/game-master.d.ts.map +1 -0
  11. package/dist/base/game-master.js +83 -0
  12. package/dist/base/game-master.js.map +1 -0
  13. package/dist/base/game-player-move.d.ts +13 -0
  14. package/dist/base/game-player-move.d.ts.map +1 -0
  15. package/dist/base/game-player-move.js +28 -0
  16. package/dist/base/game-player-move.js.map +1 -0
  17. package/dist/base/game-player.d.ts +61 -0
  18. package/dist/base/game-player.d.ts.map +1 -0
  19. package/dist/base/game-player.js +140 -0
  20. package/dist/base/game-player.js.map +1 -0
  21. package/dist/base/game-room.d.ts +47 -0
  22. package/dist/base/game-room.d.ts.map +1 -0
  23. package/dist/base/game-room.js +80 -0
  24. package/dist/base/game-room.js.map +1 -0
  25. package/dist/base/game-round.d.ts +28 -0
  26. package/dist/base/game-round.d.ts.map +1 -0
  27. package/dist/base/game-round.js +37 -0
  28. package/dist/base/game-round.js.map +1 -0
  29. package/dist/base/game-state-machine.d.ts +13 -0
  30. package/dist/base/game-state-machine.d.ts.map +1 -0
  31. package/dist/base/game-state-machine.js +21 -0
  32. package/dist/base/game-state-machine.js.map +1 -0
  33. package/dist/base/game-table-seat.d.ts +15 -0
  34. package/dist/base/game-table-seat.d.ts.map +1 -0
  35. package/dist/base/game-table-seat.js +32 -0
  36. package/dist/base/game-table-seat.js.map +1 -0
  37. package/dist/base/game-table-seats.d.ts +21 -0
  38. package/dist/base/game-table-seats.d.ts.map +1 -0
  39. package/dist/base/game-table-seats.js +67 -0
  40. package/dist/base/game-table-seats.js.map +1 -0
  41. package/dist/base/game-table.d.ts +87 -0
  42. package/dist/base/game-table.d.ts.map +1 -0
  43. package/dist/base/game-table.js +130 -0
  44. package/dist/base/game-table.js.map +1 -0
  45. package/dist/base/index.d.ts +13 -0
  46. package/dist/base/index.d.ts.map +1 -0
  47. package/dist/base/index.js +26 -0
  48. package/dist/base/index.js.map +1 -0
  49. package/dist/base/standard-game-state.d.ts +20 -0
  50. package/dist/base/standard-game-state.d.ts.map +1 -0
  51. package/dist/base/standard-game-state.js +57 -0
  52. package/dist/base/standard-game-state.js.map +1 -0
  53. package/dist/base-rooms/fast-tournament-room.d.ts +14 -0
  54. package/dist/base-rooms/fast-tournament-room.d.ts.map +1 -0
  55. package/dist/base-rooms/fast-tournament-room.js +53 -0
  56. package/dist/base-rooms/fast-tournament-room.js.map +1 -0
  57. package/dist/base-rooms/index.d.ts +10 -0
  58. package/dist/base-rooms/index.d.ts.map +1 -0
  59. package/dist/base-rooms/index.js +14 -0
  60. package/dist/base-rooms/index.js.map +1 -0
  61. package/dist/base-rooms/scheduled-tournament-room.d.ts +28 -0
  62. package/dist/base-rooms/scheduled-tournament-room.d.ts.map +1 -0
  63. package/dist/base-rooms/scheduled-tournament-room.js +166 -0
  64. package/dist/base-rooms/scheduled-tournament-room.js.map +1 -0
  65. package/dist/base-rooms/simple-room.d.ts +9 -0
  66. package/dist/base-rooms/simple-room.d.ts.map +1 -0
  67. package/dist/base-rooms/simple-room.js +13 -0
  68. package/dist/base-rooms/simple-room.js.map +1 -0
  69. package/dist/base-rooms/tournament-participant.d.ts +6 -0
  70. package/dist/base-rooms/tournament-participant.d.ts.map +1 -0
  71. package/dist/base-rooms/tournament-participant.js +3 -0
  72. package/dist/base-rooms/tournament-participant.js.map +1 -0
  73. package/dist/base-rooms/tournament-prize.d.ts +7 -0
  74. package/dist/base-rooms/tournament-prize.d.ts.map +1 -0
  75. package/dist/base-rooms/tournament-prize.js +3 -0
  76. package/dist/base-rooms/tournament-prize.js.map +1 -0
  77. package/dist/base-rooms/tournament-room.d.ts +47 -0
  78. package/dist/base-rooms/tournament-room.d.ts.map +1 -0
  79. package/dist/base-rooms/tournament-room.js +111 -0
  80. package/dist/base-rooms/tournament-room.js.map +1 -0
  81. package/dist/base-rooms/tournament-state.d.ts +23 -0
  82. package/dist/base-rooms/tournament-state.d.ts.map +1 -0
  83. package/dist/base-rooms/tournament-state.js +63 -0
  84. package/dist/base-rooms/tournament-state.js.map +1 -0
  85. package/dist/base-rooms/tournament-winner.d.ts +8 -0
  86. package/dist/base-rooms/tournament-winner.d.ts.map +1 -0
  87. package/dist/base-rooms/tournament-winner.js +3 -0
  88. package/dist/base-rooms/tournament-winner.js.map +1 -0
  89. package/dist/board-game/base/board-cell.d.ts +16 -0
  90. package/dist/board-game/base/board-cell.d.ts.map +1 -0
  91. package/dist/board-game/base/board-cell.js +42 -0
  92. package/dist/board-game/base/board-cell.js.map +1 -0
  93. package/dist/board-game/base/board-figure.d.ts +16 -0
  94. package/dist/board-game/base/board-figure.d.ts.map +1 -0
  95. package/dist/board-game/base/board-figure.js +38 -0
  96. package/dist/board-game/base/board-figure.js.map +1 -0
  97. package/dist/board-game/base/board-game-master.d.ts +19 -0
  98. package/dist/board-game/base/board-game-master.d.ts.map +1 -0
  99. package/dist/board-game/base/board-game-master.js +36 -0
  100. package/dist/board-game/base/board-game-master.js.map +1 -0
  101. package/dist/board-game/base/board-player-move.d.ts +11 -0
  102. package/dist/board-game/base/board-player-move.d.ts.map +1 -0
  103. package/dist/board-game/base/board-player-move.js +30 -0
  104. package/dist/board-game/base/board-player-move.js.map +1 -0
  105. package/dist/board-game/base/board-player.d.ts +13 -0
  106. package/dist/board-game/base/board-player.d.ts.map +1 -0
  107. package/dist/board-game/base/board-player.js +31 -0
  108. package/dist/board-game/base/board-player.js.map +1 -0
  109. package/dist/board-game/base/board-table.d.ts +17 -0
  110. package/dist/board-game/base/board-table.d.ts.map +1 -0
  111. package/dist/board-game/base/board-table.js +35 -0
  112. package/dist/board-game/base/board-table.js.map +1 -0
  113. package/dist/board-game/d1-board-game/d1-board-table.d.ts +19 -0
  114. package/dist/board-game/d1-board-game/d1-board-table.d.ts.map +1 -0
  115. package/dist/board-game/d1-board-game/d1-board-table.js +41 -0
  116. package/dist/board-game/d1-board-game/d1-board-table.js.map +1 -0
  117. package/dist/board-game/d2-board-game/d2-board-cell.d.ts +12 -0
  118. package/dist/board-game/d2-board-game/d2-board-cell.d.ts.map +1 -0
  119. package/dist/board-game/d2-board-game/d2-board-cell.js +26 -0
  120. package/dist/board-game/d2-board-game/d2-board-cell.js.map +1 -0
  121. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts +29 -0
  122. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts.map +1 -0
  123. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js +51 -0
  124. package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js.map +1 -0
  125. package/dist/board-game/d2-board-game/d2-board-table.d.ts +49 -0
  126. package/dist/board-game/d2-board-game/d2-board-table.d.ts.map +1 -0
  127. package/dist/board-game/d2-board-game/d2-board-table.js +184 -0
  128. package/dist/board-game/d2-board-game/d2-board-table.js.map +1 -0
  129. package/dist/board-game/d2-board-game/types.d.ts +5 -0
  130. package/dist/board-game/d2-board-game/types.d.ts.map +1 -0
  131. package/dist/board-game/d2-board-game/types.js +3 -0
  132. package/dist/board-game/d2-board-game/types.js.map +1 -0
  133. package/dist/board-game/dice.d.ts +5 -0
  134. package/dist/board-game/dice.d.ts.map +1 -0
  135. package/dist/board-game/dice.js +14 -0
  136. package/dist/board-game/dice.js.map +1 -0
  137. package/dist/board-game/index.d.ts +13 -0
  138. package/dist/board-game/index.d.ts.map +1 -0
  139. package/dist/board-game/index.js +26 -0
  140. package/dist/board-game/index.js.map +1 -0
  141. package/dist/cards-game/cards/card.d.ts +25 -0
  142. package/dist/cards-game/cards/card.d.ts.map +1 -0
  143. package/dist/cards-game/cards/card.js +45 -0
  144. package/dist/cards-game/cards/card.js.map +1 -0
  145. package/dist/cards-game/cards/cards.d.ts +55 -0
  146. package/dist/cards-game/cards/cards.d.ts.map +1 -0
  147. package/dist/cards-game/cards/cards.js +63 -0
  148. package/dist/cards-game/cards/cards.js.map +1 -0
  149. package/dist/cards-game/cards/deck36.d.ts +2 -0
  150. package/dist/cards-game/cards/deck36.d.ts.map +1 -0
  151. package/dist/cards-game/cards/deck36.js +43 -0
  152. package/dist/cards-game/cards/deck36.js.map +1 -0
  153. package/dist/cards-game/cards/deck52.d.ts +2 -0
  154. package/dist/cards-game/cards/deck52.d.ts.map +1 -0
  155. package/dist/cards-game/cards/deck52.js +59 -0
  156. package/dist/cards-game/cards/deck52.js.map +1 -0
  157. package/dist/cards-game/cards/ranks.d.ts +18 -0
  158. package/dist/cards-game/cards/ranks.d.ts.map +1 -0
  159. package/dist/cards-game/cards/ranks.js +23 -0
  160. package/dist/cards-game/cards/ranks.js.map +1 -0
  161. package/dist/cards-game/cards/suits.d.ts +8 -0
  162. package/dist/cards-game/cards/suits.d.ts.map +1 -0
  163. package/dist/cards-game/cards/suits.js +13 -0
  164. package/dist/cards-game/cards/suits.js.map +1 -0
  165. package/dist/cards-game/cards-game-master.d.ts +24 -0
  166. package/dist/cards-game/cards-game-master.d.ts.map +1 -0
  167. package/dist/cards-game/cards-game-master.js +65 -0
  168. package/dist/cards-game/cards-game-master.js.map +1 -0
  169. package/dist/cards-game/cards-player.d.ts +12 -0
  170. package/dist/cards-game/cards-player.d.ts.map +1 -0
  171. package/dist/cards-game/cards-player.js +29 -0
  172. package/dist/cards-game/cards-player.js.map +1 -0
  173. package/dist/cards-game/cards-table.d.ts +11 -0
  174. package/dist/cards-game/cards-table.d.ts.map +1 -0
  175. package/dist/cards-game/cards-table.js +20 -0
  176. package/dist/cards-game/cards-table.js.map +1 -0
  177. package/dist/cards-game/index.d.ts +11 -0
  178. package/dist/cards-game/index.d.ts.map +1 -0
  179. package/dist/cards-game/index.js +55 -0
  180. package/dist/cards-game/index.js.map +1 -0
  181. package/dist/const.d.ts +3 -0
  182. package/dist/const.d.ts.map +1 -0
  183. package/dist/const.js +6 -0
  184. package/dist/const.js.map +1 -0
  185. package/dist/index.d.ts +6 -0
  186. package/dist/index.d.ts.map +1 -0
  187. package/dist/index.js +22 -0
  188. package/dist/index.js.map +1 -0
  189. package/dist/utils/circle-list.d.ts +29 -0
  190. package/dist/utils/circle-list.d.ts.map +1 -0
  191. package/dist/utils/circle-list.js +103 -0
  192. package/dist/utils/circle-list.js.map +1 -0
  193. package/dist/utils/index.d.ts +4 -0
  194. package/dist/utils/index.d.ts.map +1 -0
  195. package/dist/utils/index.js +9 -0
  196. package/dist/utils/index.js.map +1 -0
  197. package/dist/utils/shuffle.d.ts +3 -0
  198. package/dist/utils/shuffle.d.ts.map +1 -0
  199. package/dist/utils/shuffle.js +16 -0
  200. package/dist/utils/shuffle.js.map +1 -0
  201. package/dist/utils/tests/circle-list.test.d.ts +2 -0
  202. package/dist/utils/tests/circle-list.test.d.ts.map +1 -0
  203. package/dist/utils/tests/circle-list.test.js +60 -0
  204. package/dist/utils/tests/circle-list.test.js.map +1 -0
  205. package/package.json +54 -0
  206. package/readme.md +3 -0
  207. package/src/base/game-control-player-turn.ts +39 -0
  208. package/src/base/game-control-restart.ts +30 -0
  209. package/src/base/game-master.ts +109 -0
  210. package/src/base/game-player-move.ts +33 -0
  211. package/src/base/game-player.ts +184 -0
  212. package/src/base/game-room.ts +127 -0
  213. package/src/base/game-round.ts +62 -0
  214. package/src/base/game-state-machine.ts +25 -0
  215. package/src/base/game-table-seat.ts +37 -0
  216. package/src/base/game-table-seats.ts +78 -0
  217. package/src/base/game-table.ts +237 -0
  218. package/src/base/index.ts +25 -0
  219. package/src/base/standard-game-state.ts +69 -0
  220. package/src/base-rooms/fast-tournament-room.ts +59 -0
  221. package/src/base-rooms/index.ts +19 -0
  222. package/src/base-rooms/scheduled-tournament-room.ts +181 -0
  223. package/src/base-rooms/simple-room.ts +15 -0
  224. package/src/base-rooms/tournament-participant.ts +5 -0
  225. package/src/base-rooms/tournament-prize.ts +7 -0
  226. package/src/base-rooms/tournament-room.ts +169 -0
  227. package/src/base-rooms/tournament-state.ts +78 -0
  228. package/src/base-rooms/tournament-winner.ts +7 -0
  229. package/src/board-game/base/board-cell.ts +50 -0
  230. package/src/board-game/base/board-figure.ts +49 -0
  231. package/src/board-game/base/board-game-master.ts +56 -0
  232. package/src/board-game/base/board-player-move.ts +29 -0
  233. package/src/board-game/base/board-player.ts +43 -0
  234. package/src/board-game/base/board-table.ts +52 -0
  235. package/src/board-game/d1-board-game/d1-board-table.ts +56 -0
  236. package/src/board-game/d2-board-game/d2-board-cell.ts +30 -0
  237. package/src/board-game/d2-board-game/d2-board-pattern-move-figure.ts +79 -0
  238. package/src/board-game/d2-board-game/d2-board-table.ts +262 -0
  239. package/src/board-game/d2-board-game/types.ts +4 -0
  240. package/src/board-game/dice.ts +9 -0
  241. package/src/board-game/index.ts +28 -0
  242. package/src/cards-game/cards/card.ts +60 -0
  243. package/src/cards-game/cards/cards.ts +86 -0
  244. package/src/cards-game/cards/deck36.ts +80 -0
  245. package/src/cards-game/cards/deck52.ts +112 -0
  246. package/src/cards-game/cards/ranks.ts +19 -0
  247. package/src/cards-game/cards/suits.ts +10 -0
  248. package/src/cards-game/cards-game-master.ts +83 -0
  249. package/src/cards-game/cards-player.ts +40 -0
  250. package/src/cards-game/cards-table.ts +28 -0
  251. package/src/cards-game/index.ts +21 -0
  252. package/src/const.ts +3 -0
  253. package/src/index.ts +5 -0
  254. package/src/utils/circle-list.ts +130 -0
  255. package/src/utils/index.ts +8 -0
  256. package/src/utils/shuffle.ts +12 -0
  257. package/src/utils/tests/circle-list.test.ts +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,+CAA2D;AAIvD,+FAJK,4BAAc,OAIL;AACd,2FALqB,wBAAU,OAKrB;AAJd,uCAAyC;AAKrC,6FALK,sBAAY,OAKL"}
@@ -0,0 +1,3 @@
1
+ export declare function rngShuffle(collection: any[]): any[];
2
+ export declare const superShuffle: (collection: any[]) => any[];
3
+ //# sourceMappingURL=shuffle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shuffle.d.ts","sourceRoot":"","sources":["../../src/utils/shuffle.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE,SAE3C;AAED,eAAO,MAAM,YAAY,8BAAuD,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.superShuffle = void 0;
7
+ exports.rngShuffle = rngShuffle;
8
+ const shuffle_array_1 = __importDefault(require("shuffle-array"));
9
+ const seedrandom_1 = __importDefault(require("seedrandom"));
10
+ const lodash_1 = require("lodash");
11
+ const rng = (0, seedrandom_1.default)();
12
+ function rngShuffle(collection) {
13
+ return (0, shuffle_array_1.default)(collection, { rng, copy: true });
14
+ }
15
+ exports.superShuffle = (0, lodash_1.flow)(rngShuffle, rngShuffle, rngShuffle, rngShuffle);
16
+ //# sourceMappingURL=shuffle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shuffle.js","sourceRoot":"","sources":["../../src/utils/shuffle.ts"],"names":[],"mappings":";;;;;;AAMA,gCAEC;AARD,kEAAoC;AACpC,4DAAoC;AACpC,mCAA8B;AAE9B,MAAM,GAAG,GAAG,IAAA,oBAAU,GAAE,CAAC;AAEzB,SAAgB,UAAU,CAAC,UAAiB;IAC1C,OAAO,IAAA,uBAAO,EAAC,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAEY,QAAA,YAAY,GAAG,IAAA,aAAI,EAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=circle-list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circle-list.test.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/circle-list.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const circle_list_1 = require("../circle-list");
4
+ describe('circle list', () => {
5
+ const item1 = { id: 1 };
6
+ const item2 = { id: 2 };
7
+ const item3 = { id: 3 };
8
+ const list = new circle_list_1.CircleList();
9
+ list.push(item1);
10
+ list.push(item2);
11
+ list.push(item3);
12
+ it('circle list', () => {
13
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
14
+ expect(list.getSize()).toBe(3);
15
+ expect((_a = list.get(0)) === null || _a === void 0 ? void 0 : _a.getData()).toBe(item1);
16
+ expect((_b = list.get(0)) === null || _b === void 0 ? void 0 : _b.getNext()).toBe(list.get(1));
17
+ expect((_c = list.get(0)) === null || _c === void 0 ? void 0 : _c.getPrev()).toBe(list.get(2));
18
+ expect((_d = list.get(1)) === null || _d === void 0 ? void 0 : _d.getData()).toBe(item2);
19
+ expect((_e = list.get(1)) === null || _e === void 0 ? void 0 : _e.getNext()).toBe(list.get(2));
20
+ expect((_f = list.get(1)) === null || _f === void 0 ? void 0 : _f.getPrev()).toBe(list.get(0));
21
+ expect((_g = list.get(2)) === null || _g === void 0 ? void 0 : _g.getData()).toBe(item3);
22
+ expect((_h = list.get(2)) === null || _h === void 0 ? void 0 : _h.getNext()).toBe(list.get(0));
23
+ expect((_j = list.get(2)) === null || _j === void 0 ? void 0 : _j.getPrev()).toBe(list.get(1));
24
+ });
25
+ it('getNextChain', () => {
26
+ const nextChain0 = list.getNextChain(0);
27
+ expect(nextChain0.length).toBe(3);
28
+ expect(nextChain0[0].id).toBe(1);
29
+ expect(nextChain0[1].id).toBe(2);
30
+ expect(nextChain0[2].id).toBe(3);
31
+ const nextChain1 = list.getNextChain(1);
32
+ expect(nextChain1.length).toBe(3);
33
+ expect(nextChain1[0].id).toBe(2);
34
+ expect(nextChain1[1].id).toBe(3);
35
+ expect(nextChain1[2].id).toBe(1);
36
+ const nextChain2 = list.getNextChain(2);
37
+ expect(nextChain2.length).toBe(3);
38
+ expect(nextChain2[0].id).toBe(3);
39
+ expect(nextChain2[1].id).toBe(1);
40
+ expect(nextChain2[2].id).toBe(2);
41
+ });
42
+ it('getPrevChain', () => {
43
+ const prevChain0 = list.getPrevChain(0);
44
+ expect(prevChain0.length).toBe(3);
45
+ expect(prevChain0[0].id).toBe(1);
46
+ expect(prevChain0[1].id).toBe(3);
47
+ expect(prevChain0[2].id).toBe(2);
48
+ const prevChain1 = list.getPrevChain(1);
49
+ expect(prevChain1.length).toBe(3);
50
+ expect(prevChain1[0].id).toBe(2);
51
+ expect(prevChain1[1].id).toBe(1);
52
+ expect(prevChain1[2].id).toBe(3);
53
+ const prevChain2 = list.getPrevChain(2);
54
+ expect(prevChain2.length).toBe(3);
55
+ expect(prevChain2[0].id).toBe(3);
56
+ expect(prevChain2[1].id).toBe(2);
57
+ expect(prevChain2[2].id).toBe(1);
58
+ });
59
+ });
60
+ //# sourceMappingURL=circle-list.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circle-list.test.js","sourceRoot":"","sources":["../../../src/utils/tests/circle-list.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "jp.ms.common.engine",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "author": "",
8
+ "license": "ISC",
9
+ "dependencies": {
10
+ "dayjs": "1.11.18",
11
+ "lodash": "4.17.21",
12
+ "node-schedule": "2.1.1",
13
+ "seedrandom": "3.0.5",
14
+ "shuffle-array": "1.0.1",
15
+ "uuid": "13.0.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/jest": "^29.5.14",
19
+ "@types/lodash": "4.17.20",
20
+ "@types/node": "22.15.3",
21
+ "@types/node-schedule": "2.1.8",
22
+ "@types/seedrandom": "3.0.8",
23
+ "@types/shuffle-array": "1.0.5",
24
+ "jest": "^29.7.0",
25
+ "rimraf": "6.0.1",
26
+ "ts-jest": "^29.2.5",
27
+ "typescript": "5.9.3"
28
+ },
29
+ "scripts": {
30
+ "build": "rimraf dist && tsc",
31
+ "prepublish": "npm run build"
32
+ },
33
+ "jest": {
34
+ "moduleFileExtensions": [
35
+ "js",
36
+ "json",
37
+ "ts"
38
+ ],
39
+ "rootDir": "src",
40
+ "testRegex": ".*\\.test\\.ts$",
41
+ "transform": {
42
+ "^.+\\.(t|j)s$": "ts-jest"
43
+ },
44
+ "collectCoverageFrom": [
45
+ "**/*.(t|j)s"
46
+ ],
47
+ "coverageDirectory": "../coverage",
48
+ "testEnvironment": "node"
49
+ },
50
+ "files": [
51
+ "src",
52
+ "dist"
53
+ ]
54
+ }
package/readme.md ADDED
@@ -0,0 +1,3 @@
1
+ npm
2
+ choochoochoo
3
+ 1nUVKsKVQ9o7
@@ -0,0 +1,39 @@
1
+ import { ONE_SECOND } from '../const';
2
+
3
+ import { GamePlayer } from './game-player';
4
+
5
+ export class GameControlPlayerTurn<GP extends GamePlayer> {
6
+ private readonly playersTurnTimeout: number;
7
+ private playerTurnTimerId?: NodeJS.Timeout;
8
+ private playerTurnTimerDate: Date | null;
9
+ private readonly handleTurnTimeout: (player: GP) => void;
10
+
11
+ constructor (
12
+ playersTurnTimeout: number,
13
+ handleTurnTimeout: (player: GP) => void,
14
+ ) {
15
+ this.playersTurnTimeout = playersTurnTimeout;
16
+ this.handleTurnTimeout = handleTurnTimeout;
17
+ }
18
+
19
+ isEnableTimer () {
20
+ return this.playersTurnTimeout > 0;
21
+ }
22
+
23
+ setPlayerTurnTimeout (player: GP | null) {
24
+ this.playerTurnTimerDate = new Date();
25
+ if (this.isEnableTimer() && player) {
26
+ this.playerTurnTimerId = setTimeout(
27
+ () => this.handleTurnTimeout(player),
28
+ this.playersTurnTimeout * ONE_SECOND,
29
+ );
30
+ }
31
+ }
32
+
33
+ clearPlayerTurnTimeout (player: GP | null) {
34
+ if (this.playerTurnTimerId) {
35
+ clearTimeout(this.playerTurnTimerId);
36
+ this.playerTurnTimerDate = null;
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,30 @@
1
+ import { ONE_SECOND } from '../const';
2
+
3
+ export class GameControlRestart {
4
+ private readonly restartTimeout: number;
5
+ private restartTimerId?: NodeJS.Timeout;
6
+ private restartTimerDate: Date | null;
7
+ private readonly handleRestartTimeout: () => void;
8
+
9
+ constructor (
10
+ restartTimeout: number,
11
+ handleRestartTimeout: () => void
12
+ ) {
13
+ this.restartTimeout = restartTimeout;
14
+ this.handleRestartTimeout = handleRestartTimeout;
15
+ }
16
+
17
+ isEnableTimer () {
18
+ return this.restartTimeout > 0;
19
+ }
20
+
21
+ setRestartTimeout () {
22
+ this.restartTimerDate = new Date();
23
+ if (this.isEnableTimer()) {
24
+ this.restartTimerId = setTimeout(
25
+ this.handleRestartTimeout,
26
+ this.restartTimeout * ONE_SECOND,
27
+ );
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,109 @@
1
+ import { GamePlayer } from './game-player';
2
+ import { IGameTable } from './game-table';
3
+ import { GameControlPlayerTurn } from './game-control-player-turn';
4
+ 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>;
11
+ public readonly controlRestart: GameControlRestart;
12
+
13
+ protected constructor (table: GT) {
14
+ this.table = table;
15
+ this.controlTurn = new GameControlPlayerTurn(this.table.getTurnTimeout(), this.onHandleTurnTimeout);
16
+ this.controlRestart = new GameControlRestart(this.table.getRestartTimeout(), this.onHandleRestartTimeout);
17
+ }
18
+
19
+ abstract onHandleTurnTimeout (player: GP);
20
+
21
+ abstract onHandleRestartTimeout ();
22
+
23
+ abstract kickPlayer (player: GP);
24
+
25
+ abstract startNewRound ();
26
+
27
+ abstract finishRound ();
28
+
29
+ abstract changePlayer ();
30
+
31
+ abstract getResults (): GSR | null;
32
+
33
+ abstract onHandleMove (player: GP);
34
+
35
+ setGameRound (gameRound: GR): void {
36
+ this.gameRound = gameRound;
37
+ }
38
+
39
+ getGameRound (): GR | null {
40
+ return this.gameRound;
41
+ }
42
+
43
+ getTable () {
44
+ return this.table;
45
+ }
46
+
47
+ enterTheTable (player: GP) {
48
+ if (this.table.isFull()) {
49
+ this.table.addPlayerToQueue(player);
50
+ } else {
51
+ this.table.addPlayerToSeat(player);
52
+ }
53
+ }
54
+
55
+ exitTheTable (player: GP) {
56
+ if (player.isPlayer()) {
57
+ this.table.removePlayerFromSeat(player);
58
+ } else if (player.isTableQueuer()) {
59
+ this.table.removePlayerFromQueue(player);
60
+ } else {
61
+ this.table.removePlayerFromWatchers(player);
62
+ }
63
+ }
64
+
65
+ watchTheTable (player: GP) {
66
+ this.table.addPlayerToWatchers(player);
67
+ }
68
+
69
+ startFromWhite () {
70
+ const firstPlayer = this.table.getPlayers().find((item) => item.isWhite());
71
+ if (firstPlayer) {
72
+ this.gameRound?.setActivePlayer(firstPlayer);
73
+ }
74
+ }
75
+
76
+ changePlayerClockwise () {
77
+ const activePlayer = this.getGameRound()?.getActivePlayer();
78
+ const nextPlayer = this.table.getSeats().getNextPlayer(activePlayer?.getSeatNumber() ?? 0);
79
+
80
+ if (nextPlayer) {
81
+ this.gameRound?.setActivePlayer(nextPlayer);
82
+ }
83
+ }
84
+
85
+ changePlayerCounterClockwise () {
86
+ const activePlayer = this.getGameRound()?.getActivePlayer();
87
+ const prevPlayer = this.table.getSeats().getPrevPlayer(activePlayer?.getSeatNumber() ?? 0);
88
+
89
+ if (prevPlayer) {
90
+ this.gameRound?.setActivePlayer(prevPlayer);
91
+ }
92
+ }
93
+
94
+ getActivePlayer () {
95
+ return this.getGameRound()?.getActivePlayer();
96
+ }
97
+
98
+ getNextPlayer () {
99
+ return this.table.getSeats().getNextPlayer(this.getActivePlayer()?.getSeatNumber() ?? 0);
100
+ }
101
+
102
+ getNextAfterNextPlayer () {
103
+ return this.table.getSeats().getNextPlayer(this.getNextPlayer()?.getSeatNumber() ?? 0);
104
+ }
105
+
106
+ getNextPlayerBySeat (seat: number) {
107
+ return this.table.getSeats().getNextPlayer(seat);
108
+ }
109
+ }
@@ -0,0 +1,33 @@
1
+ export class GamePlayerMove {
2
+ private readonly roomId: string;
3
+ private readonly tableId: string;
4
+ private readonly action: string;
5
+ private readonly attrs: Record<string, string>;
6
+
7
+ protected constructor (roomId: string, tableId: string, action: string) {
8
+ this.roomId = roomId;
9
+ this.tableId = tableId;
10
+ this.action = action;
11
+ this.attrs = {};
12
+ }
13
+
14
+ getRoomId () {
15
+ return this.roomId;
16
+ }
17
+
18
+ getTableId () {
19
+ return this.tableId;
20
+ }
21
+
22
+ getAction () {
23
+ return this.action;
24
+ }
25
+
26
+ addAttr (key: string, value: string) {
27
+ this.attrs[key] = value;
28
+ }
29
+
30
+ getAttr (key: string) {
31
+ return this.attrs[key];
32
+ }
33
+ }
@@ -0,0 +1,184 @@
1
+ import { GamePlayerMove } from './game-player-move';
2
+
3
+ export enum GamePlayerRole {
4
+ VISITOR = 'VISITOR',
5
+ WATCHER = 'WATCHER',
6
+ TABLE_QUEUER = 'TABLE_QUEUER',
7
+ PLAYER = 'PLAYER',
8
+ TOURNAMENT_QUEUER = 'TOURNAMENT_QUEUER',
9
+ }
10
+
11
+ export enum GamePlayerColor {
12
+ NO_COLOR = 0,
13
+ WHITE = 1,
14
+ BLACK = -1,
15
+ }
16
+
17
+ export abstract class GamePlayer {
18
+ private readonly id: string;
19
+ private readonly fullName: string;
20
+ private readonly avatarUrl: string;
21
+ private balance: number;
22
+ private gameId: string | null = null;
23
+ private roomId: string | null = null;
24
+ private tableId: string | null = null;
25
+ private seatNumber: number | null = null;
26
+ private role: string | null = null;
27
+ protected stack: number;
28
+ private readonly color: number;
29
+ private bet: number;
30
+ private move: GamePlayerMove | undefined;
31
+
32
+ constructor (
33
+ id: string,
34
+ fullName: string,
35
+ avatarUrl: string,
36
+ balance: number,
37
+ color?: number,
38
+ ) {
39
+ this.id = id;
40
+ this.fullName = fullName;
41
+ this.avatarUrl = avatarUrl;
42
+ this.balance = balance;
43
+ this.stack = 0;
44
+ this.color = color ?? 0;
45
+ this.bet = 0;
46
+ }
47
+
48
+ getId (): string {
49
+ return this.id;
50
+ }
51
+
52
+ getFullName (): string {
53
+ return this.fullName;
54
+ }
55
+
56
+ getAvatarUrl (): string {
57
+ return this.avatarUrl;
58
+ }
59
+
60
+ getBalance (): number {
61
+ return this.balance;
62
+ }
63
+
64
+ increaseBalance (amount: number): void {
65
+ this.balance += amount;
66
+ }
67
+
68
+ decreaseBalance (amount: number): void {
69
+ this.balance -= amount;
70
+ }
71
+
72
+ makeBet (bet: number) {
73
+ this.stack -= bet;
74
+ this.bet = bet;
75
+ }
76
+
77
+ getBet () {
78
+ return this.bet;
79
+ }
80
+
81
+ increaseBet (bet: number) {
82
+ this.bet += bet;
83
+ this.stack -= bet;
84
+ }
85
+
86
+ getColor () {
87
+ return this.color;
88
+ }
89
+
90
+ getRoomId () {
91
+ return this.roomId;
92
+ }
93
+
94
+ getTableId () {
95
+ return this.tableId;
96
+ }
97
+
98
+ getSeatNumber () {
99
+ return this.seatNumber;
100
+ }
101
+
102
+ watch (roomId: string, tableId: string) {
103
+ this.roomId = roomId;
104
+ this.tableId = tableId;
105
+ this.role = GamePlayerRole.WATCHER;
106
+ }
107
+
108
+ seat (roomId: string, tableId: string, seatNumber: number) {
109
+ this.roomId = roomId;
110
+ this.tableId = tableId;
111
+ this.seatNumber = seatNumber;
112
+ this.role = GamePlayerRole.PLAYER;
113
+ }
114
+
115
+ getInTableQueue (roomId: string, tableId: string) {
116
+ this.roomId = roomId;
117
+ this.tableId = tableId;
118
+ this.role = GamePlayerRole.TABLE_QUEUER;
119
+ }
120
+
121
+ getInTournamentQueue (roomId: string) {
122
+ this.roomId = roomId;
123
+ this.role = GamePlayerRole.TOURNAMENT_QUEUER;
124
+ }
125
+
126
+ isWatcher (): boolean {
127
+ return this.role === GamePlayerRole.WATCHER;
128
+ }
129
+
130
+ isPlayer (): boolean {
131
+ return this.role === GamePlayerRole.PLAYER;
132
+ }
133
+
134
+ isTableQueuer (): boolean {
135
+ return this.role === GamePlayerRole.TABLE_QUEUER;
136
+ }
137
+
138
+ isTournamentQueuer (): boolean {
139
+ return this.role === GamePlayerRole.TOURNAMENT_QUEUER;
140
+ }
141
+
142
+ quit () {
143
+ this.roomId = null;
144
+ this.tableId = null;
145
+ this.seatNumber = null;
146
+ this.role = null;
147
+ }
148
+
149
+ getStack () {
150
+ return this.stack;
151
+ }
152
+
153
+ setStack (stack: number) {
154
+ this.stack = stack;
155
+ }
156
+
157
+ hasEmptyStack () {
158
+ return this.getStack() === 0;
159
+ }
160
+
161
+ hasOpenConnection () {
162
+ return true;
163
+ }
164
+
165
+ flush () {
166
+
167
+ }
168
+
169
+ getMove () {
170
+ return this.move;
171
+ }
172
+
173
+ setMove (move: GamePlayerMove) {
174
+ this.move = move;
175
+ }
176
+
177
+ isWhite () {
178
+ return this.color === GamePlayerColor.WHITE;
179
+ }
180
+
181
+ isBlack () {
182
+ return this.color === GamePlayerColor.BLACK;
183
+ }
184
+ }
@@ -0,0 +1,127 @@
1
+ import { first } from 'lodash';
2
+ import { remove } from 'lodash';
3
+
4
+ import { GameTableConfig, IGameTable } from './game-table';
5
+ import { GamePlayer } from './game-player';
6
+
7
+ export type GameRoomConfig = {
8
+ id: string;
9
+ gameType: string;
10
+ roomType: string;
11
+ rulesType: string;
12
+ maxPlayers: number;
13
+ bet: number;
14
+ turnTimeout: number;
15
+ restartTimeout: number;
16
+ }
17
+
18
+ export abstract class GameRoom<GT extends IGameTable<GP>, GP extends GamePlayer> {
19
+ private readonly id: string;
20
+ private readonly gameType: string;
21
+ private readonly roomType: string;
22
+ private readonly rulesType: string;
23
+ private readonly maxPlayers: number;
24
+ private readonly bet: number;
25
+ private readonly tables: Array<GT>;
26
+ private readonly turnTimeout: number;
27
+ private readonly restartTimeout: number;
28
+ private createdTableCount: number;
29
+
30
+ constructor (config: GameRoomConfig) {
31
+ this.tables = [];
32
+ this.createdTableCount = 0;
33
+ this.id = config.id;
34
+ this.roomType = config.roomType;
35
+ this.rulesType = config.rulesType;
36
+ this.maxPlayers = config.maxPlayers;
37
+ this.gameType = config.gameType;
38
+ this.bet = config.bet;
39
+ this.turnTimeout = config.turnTimeout;
40
+ this.restartTimeout = config.restartTimeout;
41
+ }
42
+
43
+ abstract createTable (): GT;
44
+
45
+ abstract handleWatchTheTable (player: GP, tableId: string);
46
+
47
+ abstract handleMove (player: GP, tableId: string);
48
+
49
+ abstract handleFinishRound (table: IGameTable<GP>);
50
+
51
+ abstract handleRestartRound (table: IGameTable<GP>);
52
+
53
+ getId () {
54
+ return this.id;
55
+ }
56
+
57
+ getRoomType () {
58
+ return this.roomType;
59
+ }
60
+
61
+ getGameType () {
62
+ return this.roomType;
63
+ }
64
+
65
+ getRulesType () {
66
+ return this.rulesType;
67
+ }
68
+
69
+ getMaxPlayers () {
70
+ return this.maxPlayers;
71
+ }
72
+
73
+ getTables (): Array<GT> {
74
+ return this.tables;
75
+ }
76
+
77
+ getFirstTable (): GT | undefined {
78
+ return first(this.getTables());
79
+ }
80
+
81
+ getTableWithFreeSeats (): GT | undefined {
82
+ return this.tables.find((table) => table.getPlayers().length + table.getQueue().length < table.getTableSize());
83
+ }
84
+
85
+ remainOneTable (): boolean {
86
+ return this.tables.length === 1;
87
+ }
88
+
89
+ getTableById (id: string): GT | undefined {
90
+ return this.tables.find((item) => item.getId() === id);
91
+ }
92
+
93
+ getFreeTableNumber (): number {
94
+ return this.createdTableCount + 1;
95
+ }
96
+
97
+ getCreatedTableCount (): number {
98
+ return this.createdTableCount;
99
+ }
100
+
101
+ addTable (newTable: GT): void {
102
+ this.tables.push(newTable);
103
+ this.createdTableCount += 1;
104
+ }
105
+
106
+ removeTable (removingTable: GT): void {
107
+ remove(this.tables, (table) => table.getId() === removingTable.getId());
108
+ }
109
+
110
+ getBet () {
111
+ return this.bet;
112
+ }
113
+
114
+ getConfigForTable (): GameTableConfig<GP> {
115
+ return {
116
+ roomId: this.getId(),
117
+ number: this.getFreeTableNumber(),
118
+ tableSize: this.getMaxPlayers(),
119
+ bet: this.getBet(),
120
+ turnTimeout: this.turnTimeout,
121
+ restartTimeout: this.restartTimeout,
122
+ onRoomFinishRound: this.handleFinishRound,
123
+ onRoomRestartRound: this.handleRestartRound,
124
+ rulesType: this.getRulesType(),
125
+ };
126
+ }
127
+ }