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,52 @@
1
+ import { GamePlayer, GameTable } from '../../base';
2
+ import { GameTableConfig } from '../../base/game-table';
3
+
4
+ import { BoardFigure } from './board-figure';
5
+ import { BoardCell } from './board-cell';
6
+
7
+ export abstract class BoardTable<
8
+ GP extends GamePlayer,
9
+ GM,
10
+ GSR,
11
+ BF extends BoardFigure,
12
+ BC extends BoardCell<BF>,
13
+ > extends GameTable<GP, GM, GSR> {
14
+ private readonly bar: Array<BoardFigure>;
15
+
16
+ constructor (config: GameTableConfig<GP>) {
17
+ super(config);
18
+ this.bar = [];
19
+ }
20
+
21
+ abstract initCells ();
22
+
23
+ abstract getCell (id: number): BC | null;
24
+
25
+ abstract getCellsArray (): Array<BC>;
26
+
27
+ getCellsWithFigures (color: number) {
28
+ return this.getCellsArray().filter((item) => item.hasYoursFigure(color));
29
+ }
30
+
31
+ moveFigure (fromCellId: number, toCellId: number) {
32
+ const movingFigure = this.getCell(fromCellId)?.popFigure();
33
+ if (movingFigure) {
34
+ this.getCell(toCellId)?.addFigure(movingFigure);
35
+ }
36
+ }
37
+
38
+ getBar () {
39
+ return this.bar;
40
+ }
41
+
42
+ getFiguresAtBar (color: number) {
43
+ return this.bar.filter((item) => item.getColor() === color);
44
+ }
45
+
46
+ moveFigureToBar (fromCellId: number) {
47
+ const movingFigure = this.getCell(fromCellId)?.popFigure();
48
+ if (movingFigure) {
49
+ this.bar.push(movingFigure);
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,56 @@
1
+ import { BoardFigure } from '../base/board-figure';
2
+ import { CircleList } from '../../utils/circle-list';
3
+ import { GameTableConfig } from '../../base/game-table';
4
+ import { BoardCell } from '../base/board-cell';
5
+ import { BoardTable } from '../base/board-table';
6
+ import { BoardPlayer } from '../base/board-player';
7
+
8
+ export abstract class D1BoardTable<
9
+ GP extends BoardPlayer,
10
+ GM,
11
+ GSR,
12
+ BF extends BoardFigure,
13
+ > extends BoardTable<GP, GM, GSR, BF, BoardCell<BF>> {
14
+ private cells: CircleList<BoardCell<BF>>;
15
+ private readonly boardSize: number;
16
+
17
+ protected constructor (config: GameTableConfig<GP>, boardSize: number) {
18
+ super(config);
19
+ this.boardSize = boardSize;
20
+ this.initCells();
21
+ }
22
+
23
+ initCells () {
24
+ const circleList: CircleList<BoardCell<BF>> = new CircleList<BoardCell<BF>>();
25
+
26
+ for (let i = 0; i < this.getBoardSize(); i += 1) {
27
+ circleList.push(new BoardCell(i));
28
+ }
29
+
30
+ this.cells = circleList;
31
+ }
32
+
33
+ getBoardSize (): number {
34
+ return this.boardSize;
35
+ }
36
+
37
+ getCell (id: number): BoardCell<BF> | null {
38
+ return this.cells.getData(id) ?? null;
39
+ }
40
+
41
+ getCells (): CircleList<BoardCell<BF>> {
42
+ return this.cells;
43
+ }
44
+
45
+ getCellsArray (): Array<BoardCell<BF>> {
46
+ return this.cells.toArray();
47
+ }
48
+
49
+ getCellsChain (id: number): Array<BoardCell<BF>> {
50
+ return this.cells.getNextChain(id);
51
+ }
52
+
53
+ getCellSlice (start: number, end?: number): Array<BoardCell<BF>> {
54
+ return this.cells.getSlice(start, end);
55
+ }
56
+ }
@@ -0,0 +1,30 @@
1
+ import { BoardCell } from '../base/board-cell';
2
+ import { BoardFigure } from '../base/board-figure';
3
+
4
+ import { Coordinate } from './types';
5
+
6
+ export class D2BoardCell<BF extends BoardFigure> extends BoardCell<BF> {
7
+ private readonly col: number;
8
+ private readonly row: number;
9
+
10
+ constructor (id: number, col: number, row: number) {
11
+ super(id);
12
+ this.col = col;
13
+ this.row = row;
14
+ }
15
+
16
+ getRow (): number {
17
+ return this.row;
18
+ }
19
+
20
+ getCol (): number {
21
+ return this.col;
22
+ }
23
+
24
+ getCoordinate (): Coordinate {
25
+ return {
26
+ y: this.row ?? 0,
27
+ x: this.col ?? 0,
28
+ };
29
+ }
30
+ }
@@ -0,0 +1,79 @@
1
+ import { BoardFigure } from '../base/board-figure';
2
+ import { BoardCell } from '../base/board-cell';
3
+
4
+ import { Coordinate } from './types';
5
+ import { ID2BoardTable } from './d2-board-table';
6
+
7
+ export type KillingMove = {
8
+ cellId: number;
9
+ figureId: number;
10
+ killingCellId?: number;
11
+ killingFigureId?: number;
12
+ targetCells: Array<number>;
13
+ }
14
+
15
+ export type KillingMoveResult = {
16
+ cellId: number;
17
+ figureId: number;
18
+ paths: Array<KillingMove>;
19
+ }
20
+
21
+ export abstract class D2BoardPatternMoveFigure extends BoardFigure {
22
+ abstract getMovePatterns (table: ID2BoardTable<BoardFigure>, center: Coordinate): Array<Array<BoardCell<D2BoardPatternMoveFigure>>>;
23
+
24
+ abstract getMove (path: Array<BoardCell<D2BoardPatternMoveFigure>>): KillingMove | null;
25
+
26
+ abstract getKill (path: Array<BoardCell<D2BoardPatternMoveFigure>>): KillingMove | null;
27
+
28
+ private getMovePaths (table: ID2BoardTable<BoardFigure>, center: Coordinate): Array<KillingMove> {
29
+ const list: Array<KillingMove> = [];
30
+ this.getMovePatterns(table, center).forEach((path) => {
31
+ const move = this.getMove(path);
32
+ if (this.getMove(path) && move) {
33
+ list.push(move);
34
+ }
35
+ });
36
+
37
+ return list;
38
+ }
39
+
40
+ getResultMoves (table: ID2BoardTable<BoardFigure>, center: Coordinate): KillingMoveResult | null {
41
+ return this.toResult(this.getMoves(table, center));
42
+ }
43
+
44
+ getMoves (table: ID2BoardTable<BoardFigure>, center: Coordinate): Array<KillingMove> {
45
+ return this.getMovePaths(table, center);
46
+ }
47
+
48
+ getKillPatterns (table: ID2BoardTable<BoardFigure>, center: Coordinate): Array<Array<BoardCell<D2BoardPatternMoveFigure>>> {
49
+ return this.getMovePatterns(table, center);
50
+ }
51
+
52
+ getKillPaths (table: ID2BoardTable<BoardFigure>, center: Coordinate): Array<KillingMove> {
53
+ const list: Array<KillingMove> = [];
54
+ this.getKillPatterns(table, center).forEach((path) => {
55
+ const kill = this.getKill(path);
56
+ if (this.getKill(path) && kill) {
57
+ list.push(kill);
58
+ }
59
+ });
60
+
61
+ return list;
62
+ }
63
+
64
+ getKillMoves (table: ID2BoardTable<BoardFigure>, center: Coordinate): Array<KillingMove> {
65
+ return this.getKillPaths(table, center);
66
+ }
67
+
68
+ protected toResult (list: Array<KillingMove>): KillingMoveResult | null {
69
+ if (list.length > 0) {
70
+ return {
71
+ cellId: list[0].cellId ?? 0,
72
+ figureId: list[0].figureId ?? 0,
73
+ paths: list,
74
+ }
75
+ }
76
+
77
+ return null;
78
+ }
79
+ }
@@ -0,0 +1,262 @@
1
+ import { flatten, last, take, uniqBy } from 'lodash';
2
+
3
+ import { GamePlayer } from '../../base';
4
+ import { GameTableConfig } from '../../base/game-table';
5
+ import { BoardFigure } from '../base/board-figure';
6
+ import { BoardTable } from '../base/board-table';
7
+
8
+ import { D2BoardCell } from './d2-board-cell';
9
+ import { Coordinate } from './types';
10
+
11
+ export interface ID2BoardTable<BF extends BoardFigure> {
12
+ getUpLeftDiagonal (center: Coordinate): Array<D2BoardCell<BF>>;
13
+
14
+ getUpRightDiagonal (center: Coordinate): Array<D2BoardCell<BF>>;
15
+
16
+ getDownLeftDiagonal (center: Coordinate): Array<D2BoardCell<BF>>;
17
+
18
+ getDownRightDiagonal (center: Coordinate): Array<D2BoardCell<BF>>;
19
+
20
+ getUpVertical (center: Coordinate): Array<D2BoardCell<BF>>;
21
+
22
+ getDownVertical (center: Coordinate): Array<D2BoardCell<BF>>;
23
+
24
+ getLeftHorizontal (center: Coordinate): Array<D2BoardCell<BF>>;
25
+
26
+ getRightHorizontal (center: Coordinate): Array<D2BoardCell<BF>>;
27
+ }
28
+
29
+ export abstract class D2BoardTable<
30
+ GP extends GamePlayer,
31
+ GM,
32
+ GSR,
33
+ BF extends BoardFigure,
34
+ > extends BoardTable<GP, GM, GSR, BF, D2BoardCell<BF>> implements ID2BoardTable<BF> {
35
+ cells: Array<Array<D2BoardCell<BF>>>;
36
+ readonly height: number;
37
+ readonly width: number;
38
+
39
+ protected constructor (config: GameTableConfig<GP>, height: number, width: number) {
40
+ super(config);
41
+ this.height = height;
42
+ this.width = width;
43
+ this.initCells();
44
+ }
45
+
46
+ initCells () {
47
+ const cells: Array<Array<D2BoardCell<BF>>> = [];
48
+ let id = 0;
49
+ for (let i = 0; i < this.getHeight(); i += 1) {
50
+ cells.push([]);
51
+ for (let j = 0; j < this.getWidth(); j += 1) {
52
+ cells[i].push(new D2BoardCell(id, j, i));
53
+ id += 1;
54
+ }
55
+ }
56
+
57
+ this.cells = cells;
58
+ }
59
+
60
+ getHeight () {
61
+ return this.height;
62
+ }
63
+
64
+ getWidth () {
65
+ return this.width;
66
+ }
67
+
68
+ getCell (id: number): D2BoardCell<BF> | null {
69
+ return this.getCellsArray().find((item) => item.getId() === id) ?? null;
70
+ }
71
+
72
+ getCellByCoordinate (y: number, x: number): D2BoardCell<BF> | null {
73
+ return this.cells[y]?.[x] ?? null;
74
+ }
75
+
76
+ getCells (): Array<Array<D2BoardCell<BF>>> {
77
+ return this.cells;
78
+ }
79
+
80
+ getCellsArray (): Array<D2BoardCell<BF>> {
81
+ return flatten(this.cells);
82
+ }
83
+
84
+ getUpLeftDiagonal (center: Coordinate): Array<D2BoardCell<BF>> {
85
+ const cells: Array<D2BoardCell<BF>> = [];
86
+
87
+ for (let row = center.y, col = center.x; row >= 0 && col >= 0; row -= 1, col -= 1) {
88
+ const foundCell = this.getCellByCoordinate(row, col);
89
+ if (foundCell) {
90
+ cells.push(foundCell);
91
+ }
92
+ }
93
+
94
+ return cells;
95
+ }
96
+
97
+ getUpRightDiagonal (center: Coordinate): Array<D2BoardCell<BF>> {
98
+ const cells: Array<D2BoardCell<BF>> = [];
99
+
100
+ for (let row = center.y, col = center.x; row >= 0 && col < this.cells.length; row -= 1, col += 1) {
101
+ const foundCell = this.getCellByCoordinate(row, col);
102
+ if (foundCell) {
103
+ cells.push(foundCell);
104
+ }
105
+ }
106
+
107
+ return cells;
108
+ }
109
+
110
+ getDownLeftDiagonal (center: Coordinate) {
111
+ const cells: Array<D2BoardCell<BF>> = [];
112
+
113
+ for (let row = center.y, col = center.x; row < 8 && col >= 0; row += 1, col -= 1) {
114
+ const foundCell = this.getCellByCoordinate(row, col);
115
+ if (foundCell) {
116
+ cells.push(foundCell);
117
+ }
118
+ }
119
+
120
+ return cells;
121
+ }
122
+
123
+ getDownRightDiagonal (center: Coordinate) {
124
+ const cells: Array<D2BoardCell<BF>> = [];
125
+
126
+ for (let row = center.y, col = center.x; row < 8 && col < this.cells.length; row += 1, col += 1) {
127
+ const foundCell = this.getCellByCoordinate(row, col);
128
+ if (foundCell) {
129
+ cells.push(foundCell);
130
+ }
131
+ }
132
+
133
+ return cells;
134
+ }
135
+
136
+ getUpVertical (center: Coordinate): Array<D2BoardCell<BF>> {
137
+ const cells: Array<D2BoardCell<BF>> = [];
138
+
139
+ for (let row = center.y, col = center.x; row >= 0; row -= 1) {
140
+ const foundCell = this.getCellByCoordinate(row, col);
141
+ if (foundCell) {
142
+ cells.push(foundCell);
143
+ }
144
+ }
145
+
146
+ return cells;
147
+ }
148
+
149
+ getDownVertical (center: Coordinate): Array<D2BoardCell<BF>> {
150
+ const cells: Array<D2BoardCell<BF>> = [];
151
+
152
+ for (let row = center.y, col = center.x; row < this.cells.length; row += 1) {
153
+ const foundCell = this.getCellByCoordinate(row, col);
154
+ if (foundCell) {
155
+ cells.push(foundCell);
156
+ }
157
+ }
158
+
159
+ return cells;
160
+ }
161
+
162
+ getLeftHorizontal (center: Coordinate): Array<D2BoardCell<BF>> {
163
+ const cells: Array<D2BoardCell<BF>> = [];
164
+
165
+ for (let row = center.y, col = center.x; col >= 0; col -= 1) {
166
+ const foundCell = this.getCellByCoordinate(row, col);
167
+ if (foundCell) {
168
+ cells.push(foundCell);
169
+ }
170
+ }
171
+
172
+ return cells;
173
+ }
174
+
175
+ getRightHorizontal (center: Coordinate): Array<D2BoardCell<BF>> {
176
+ const cells: Array<D2BoardCell<BF>> = [];
177
+
178
+ for (let row = center.y, col = center.x; col < this.cells.length; col += 1) {
179
+ const foundCell = this.getCellByCoordinate(row, col);
180
+ if (foundCell) {
181
+ cells.push(foundCell);
182
+ }
183
+ }
184
+
185
+ return cells;
186
+ }
187
+
188
+ getEdgedCells (center: Coordinate): Array<D2BoardCell<BF>> {
189
+ const length = 3;
190
+ const shift = 2;
191
+
192
+ const first: Coordinate = { x: center.x - 1, y: center.y - 1 };
193
+ const second: Coordinate = { x: first.x + shift, y: first.y };
194
+ const third: Coordinate = { x: second.x, y: second.y + shift };
195
+ const fourth: Coordinate = { x: second.x - shift, y: second.y };
196
+
197
+ const list = [
198
+ take(this.getRightHorizontal(first), length),
199
+ take(this.getDownVertical(second), length),
200
+ take(this.getLeftHorizontal(third), length),
201
+ take(this.getUpVertical(fourth), length),
202
+ ];
203
+
204
+ return uniqBy(flatten(list), (item) => item.getId());
205
+ }
206
+
207
+ getEdgedRectangleCells (list: Array<Coordinate>): Array<D2BoardCell<BF>> {
208
+ let cells: Array<Array<D2BoardCell<BF>>> = [];
209
+
210
+ list.forEach((center) => {
211
+ cells.push(this.getEdgedCells(center));
212
+ });
213
+
214
+ return uniqBy(flatten(cells), (item) => item.getId());
215
+ }
216
+
217
+ getPistolUpVerticalLeftCells (center: Coordinate): Array<D2BoardCell<BF>> {
218
+ return this.getPistolCells(this.getUpVertical(center), this.getLeftHorizontal);
219
+ }
220
+
221
+ getPistolUpVerticalRightCells (center: Coordinate): Array<D2BoardCell<BF>> {
222
+ return this.getPistolCells(this.getUpVertical(center), this.getRightHorizontal);
223
+ }
224
+
225
+ getPistolDownVerticalLeftCells (center: Coordinate): Array<D2BoardCell<BF>> {
226
+ return this.getPistolCells(this.getDownVertical(center), this.getLeftHorizontal);
227
+ }
228
+
229
+ getPistolDownVerticalRightCells (center: Coordinate): Array<D2BoardCell<BF>> {
230
+ return this.getPistolCells(this.getDownVertical(center), this.getRightHorizontal);
231
+ }
232
+
233
+ getPistolLeftHorizontalUpCells (center: Coordinate): Array<D2BoardCell<BF>> {
234
+ return this.getPistolCells(this.getLeftHorizontal(center), this.getUpVertical);
235
+ }
236
+
237
+ getPistolLeftHorizontalDownCells (center: Coordinate): Array<D2BoardCell<BF>> {
238
+ return this.getPistolCells(this.getLeftHorizontal(center), this.getDownVertical);
239
+ }
240
+
241
+ getPistolRightHorizontalUpCells (center: Coordinate): Array<D2BoardCell<BF>> {
242
+ return this.getPistolCells(this.getRightHorizontal(center), this.getUpVertical);
243
+ }
244
+
245
+ getPistolRightHorizontalDownCells (center: Coordinate): Array<D2BoardCell<BF>> {
246
+ return this.getPistolCells(this.getRightHorizontal(center), this.getDownVertical);
247
+ }
248
+
249
+ private getPistolCells (directPath: Array<D2BoardCell<BF>>, sidePath: (center: Coordinate) => Array<D2BoardCell<BF>>): Array<D2BoardCell<BF>> {
250
+ const KNIGHT_UP_MOVE = 3;
251
+ const KNIGHT_SIDE_MOVE = 2;
252
+
253
+ const lastDirectCell = last(take(directPath, KNIGHT_UP_MOVE));
254
+ if (lastDirectCell) {
255
+ const sideCells = take(sidePath(lastDirectCell.getCoordinate()), KNIGHT_SIDE_MOVE);
256
+
257
+ return uniqBy([...directPath, ...sideCells], (item) => item.getId());
258
+ }
259
+
260
+ return [];
261
+ }
262
+ }
@@ -0,0 +1,4 @@
1
+ export type Coordinate = {
2
+ x: number;
3
+ y: number;
4
+ }
@@ -0,0 +1,9 @@
1
+ import { superShuffle } from '../utils/shuffle';
2
+
3
+ export class Dice {
4
+ private readonly sides = [1, 2, 3, 4, 5, 6];
5
+
6
+ roll (): number {
7
+ return superShuffle(this.sides)[0];
8
+ }
9
+ }
@@ -0,0 +1,28 @@
1
+ import { BoardCell } from './base/board-cell';
2
+ import { BoardFigure } from './base/board-figure';
3
+ import { BoardGameMaster } from './base/board-game-master';
4
+ import { BoardPlayer } from './base/board-player';
5
+ import { BoardPlayerMove } from './base/board-player-move';
6
+ import { BoardTable } from './base/board-table';
7
+ import { D1BoardTable } from './d1-board-game/d1-board-table';
8
+ import { D2BoardCell } from './d2-board-game/d2-board-cell';
9
+ import { D2BoardPatternMoveFigure } from './d2-board-game/d2-board-pattern-move-figure';
10
+ import { D2BoardTable } from './d2-board-game/d2-board-table';
11
+ import { Dice } from './dice';
12
+
13
+ export {
14
+ BoardCell,
15
+ BoardFigure,
16
+ BoardGameMaster,
17
+ BoardPlayer,
18
+ BoardPlayerMove,
19
+ BoardTable,
20
+ D1BoardTable,
21
+ D2BoardCell,
22
+ D2BoardPatternMoveFigure,
23
+ D2BoardTable,
24
+ Dice,
25
+ }
26
+
27
+
28
+
@@ -0,0 +1,60 @@
1
+ export type ClientCard = {
2
+ id: number;
3
+ rank: number;
4
+ suit: string;
5
+ isDisable: boolean;
6
+ }
7
+
8
+ export class Card {
9
+ private readonly _id: number;
10
+ private readonly _rank: number;
11
+ private readonly _suit: string;
12
+ private _isDisable: boolean;
13
+
14
+ constructor (id: number, rank: number, suit: string) {
15
+ this._id = id;
16
+ this._rank = rank;
17
+ this._suit = suit;
18
+ this._isDisable = false;
19
+ }
20
+
21
+ public getId () {
22
+ return this._id;
23
+ }
24
+
25
+ public getRank () {
26
+ return this._rank;
27
+ }
28
+
29
+ public getSuit () {
30
+ return this._suit;
31
+ }
32
+
33
+ public getIsDisable () {
34
+ return this._isDisable;
35
+ }
36
+
37
+ public disable () {
38
+ this._isDisable = true;
39
+ }
40
+
41
+ public enable () {
42
+ this._isDisable = false;
43
+ }
44
+
45
+ public toClient (): ClientCard {
46
+ return {
47
+ id: this._id,
48
+ rank: this._rank,
49
+ suit: this._suit,
50
+ isDisable: this._isDisable,
51
+ };
52
+ }
53
+
54
+ public toLogCard (): { rank: number; suit: string; } {
55
+ return {
56
+ rank: this.getRank(),
57
+ suit: this.getSuit(),
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,86 @@
1
+ import { Card } from './card';
2
+ import { Ranks } from './ranks';
3
+ import { Suits } from './suits';
4
+
5
+ const {
6
+ TWO,
7
+ THREE,
8
+ FOUR,
9
+ FIVE,
10
+ SIX,
11
+ SEVEN,
12
+ EIGHT,
13
+ NINE,
14
+ TEN,
15
+ JACK,
16
+ QUEEN,
17
+ KING,
18
+ ACE,
19
+ UNKNOWN_RANK,
20
+ } = Ranks;
21
+
22
+ const {
23
+ HEART,
24
+ DIAMOND,
25
+ CLUB,
26
+ SPADE,
27
+ UNKNOWN_SUIT,
28
+ } = Suits;
29
+
30
+ export const heart_2 = new Card(1, TWO, HEART);
31
+ export const heart_3 = new Card(2, THREE, HEART);
32
+ export const heart_4 = new Card(3, FOUR, HEART);
33
+ export const heart_5 = new Card(4, FIVE, HEART);
34
+ export const heart_6 = new Card(5, SIX, HEART);
35
+ export const heart_7 = new Card(6, SEVEN, HEART);
36
+ export const heart_8 = new Card(7, EIGHT, HEART);
37
+ export const heart_9 = new Card(8, NINE, HEART);
38
+ export const heart_10 = new Card(9, TEN, HEART);
39
+ export const heart_jack = new Card(10, JACK, HEART);
40
+ export const heart_queen = new Card(11, QUEEN, HEART);
41
+ export const heart_king = new Card(12, KING, HEART);
42
+ export const heart_ace = new Card(13, ACE, HEART);
43
+
44
+ export const diamond_2 = new Card(14, TWO, DIAMOND);
45
+ export const diamond_3 = new Card(15, THREE, DIAMOND);
46
+ export const diamond_4 = new Card(16, FOUR, DIAMOND);
47
+ export const diamond_5 = new Card(17, FIVE, DIAMOND);
48
+ export const diamond_6 = new Card(18, SIX, DIAMOND);
49
+ export const diamond_7 = new Card(19, SEVEN, DIAMOND);
50
+ export const diamond_8 = new Card(20, EIGHT, DIAMOND);
51
+ export const diamond_9 = new Card(21, NINE, DIAMOND);
52
+ export const diamond_10 = new Card(22, TEN, DIAMOND);
53
+ export const diamond_jack = new Card(23, JACK, DIAMOND);
54
+ export const diamond_queen = new Card(24, QUEEN, DIAMOND);
55
+ export const diamond_king = new Card(25, KING, DIAMOND);
56
+ export const diamond_ace = new Card(26, ACE, DIAMOND);
57
+
58
+ export const club_2 = new Card(27, TWO, CLUB);
59
+ export const club_3 = new Card(28, THREE, CLUB);
60
+ export const club_4 = new Card(29, FOUR, CLUB);
61
+ export const club_5 = new Card(30, FIVE, CLUB);
62
+ export const club_6 = new Card(31, SIX, CLUB);
63
+ export const club_7 = new Card(32, SEVEN, CLUB);
64
+ export const club_8 = new Card(33, EIGHT, CLUB);
65
+ export const club_9 = new Card(34, NINE, CLUB);
66
+ export const club_10 = new Card(35, TEN, CLUB);
67
+ export const club_jack = new Card(36, JACK, CLUB);
68
+ export const club_queen = new Card(37, QUEEN, CLUB);
69
+ export const club_king = new Card(38, KING, CLUB);
70
+ export const club_ace = new Card(39, ACE, CLUB);
71
+
72
+ export const spade_2 = new Card(40, TWO, SPADE);
73
+ export const spade_3 = new Card(41, THREE, SPADE);
74
+ export const spade_4 = new Card(42, FOUR, SPADE);
75
+ export const spade_5 = new Card(43, FIVE, SPADE);
76
+ export const spade_6 = new Card(44, SIX, SPADE);
77
+ export const spade_7 = new Card(45, SEVEN, SPADE);
78
+ export const spade_8 = new Card(46, EIGHT, SPADE);
79
+ export const spade_9 = new Card(47, NINE, SPADE);
80
+ export const spade_10 = new Card(48, TEN, SPADE);
81
+ export const spade_jack = new Card(49, JACK, SPADE);
82
+ export const spade_queen = new Card(50, QUEEN, SPADE);
83
+ export const spade_king = new Card(51, KING, SPADE);
84
+ export const spade_ace = new Card(52, ACE, SPADE);
85
+
86
+ export const stub_card = new Card(0, UNKNOWN_RANK, UNKNOWN_SUIT);