jp.ms.common.engine 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base/game-control-player-turn.d.ts +4 -4
- package/dist/base/game-control-player-turn.d.ts.map +1 -1
- package/dist/base/game-control-player-turn.js.map +1 -1
- package/dist/base/game-master.d.ts +24 -21
- package/dist/base/game-master.d.ts.map +1 -1
- package/dist/base/game-master.js +6 -2
- package/dist/base/game-master.js.map +1 -1
- package/dist/base/game-player-connections-helper.d.ts +15 -0
- package/dist/base/game-player-connections-helper.d.ts.map +1 -0
- package/dist/base/game-player-connections-helper.js +33 -0
- package/dist/base/game-player-connections-helper.js.map +1 -0
- package/dist/base/game-player.d.ts +3 -1
- package/dist/base/game-player.d.ts.map +1 -1
- package/dist/base/game-player.js +3 -1
- package/dist/base/game-player.js.map +1 -1
- package/dist/base/game-room.d.ts +15 -17
- package/dist/base/game-room.d.ts.map +1 -1
- package/dist/base/game-room.js +16 -17
- package/dist/base/game-room.js.map +1 -1
- package/dist/base/game-round.d.ts +7 -10
- package/dist/base/game-round.d.ts.map +1 -1
- package/dist/base/game-round.js +2 -4
- package/dist/base/game-round.js.map +1 -1
- package/dist/base/game-state-machine.d.ts +4 -4
- package/dist/base/game-state-machine.d.ts.map +1 -1
- package/dist/base/game-state-machine.js.map +1 -1
- package/dist/base/game-summary-result.d.ts +3 -0
- package/dist/base/game-summary-result.d.ts.map +1 -0
- package/dist/base/game-summary-result.js +7 -0
- package/dist/base/game-summary-result.js.map +1 -0
- package/dist/base/game-table-seat.d.ts +3 -3
- package/dist/base/game-table-seat.d.ts.map +1 -1
- package/dist/base/game-table-seat.js.map +1 -1
- package/dist/base/game-table-seats.d.ts +12 -12
- package/dist/base/game-table-seats.d.ts.map +1 -1
- package/dist/base/game-table-seats.js.map +1 -1
- package/dist/base/game-table.d.ts +25 -51
- package/dist/base/game-table.d.ts.map +1 -1
- package/dist/base/game-table.js.map +1 -1
- package/dist/base/index.d.ts +2 -1
- package/dist/base/index.d.ts.map +1 -1
- package/dist/base/index.js +3 -1
- package/dist/base/index.js.map +1 -1
- package/dist/base/standard-game-state.d.ts +2 -2
- package/dist/base/standard-game-state.d.ts.map +1 -1
- package/dist/base/standard-game-state.js +1 -1
- package/dist/base/standard-game-state.js.map +1 -1
- package/dist/base-rooms/fast-tournament-room.d.ts +0 -13
- package/dist/base-rooms/fast-tournament-room.d.ts.map +1 -1
- package/dist/base-rooms/fast-tournament-room.js +59 -51
- package/dist/base-rooms/fast-tournament-room.js.map +1 -1
- package/dist/base-rooms/index.d.ts +1 -5
- package/dist/base-rooms/index.d.ts.map +1 -1
- package/dist/base-rooms/index.js +3 -9
- package/dist/base-rooms/index.js.map +1 -1
- package/dist/base-rooms/scheduled-tournament-room.d.ts +0 -27
- package/dist/base-rooms/scheduled-tournament-room.d.ts.map +1 -1
- package/dist/base-rooms/scheduled-tournament-room.js +181 -164
- package/dist/base-rooms/scheduled-tournament-room.js.map +1 -1
- package/dist/base-rooms/simple-room.d.ts +5 -4
- package/dist/base-rooms/simple-room.d.ts.map +1 -1
- package/dist/base-rooms/simple-room.js +16 -0
- package/dist/base-rooms/simple-room.js.map +1 -1
- package/dist/base-rooms/tournament-room.d.ts +0 -46
- package/dist/base-rooms/tournament-room.d.ts.map +1 -1
- package/dist/base-rooms/tournament-room.js +169 -109
- package/dist/base-rooms/tournament-room.js.map +1 -1
- package/dist/base-rooms/tournament-state.d.ts +2 -2
- package/dist/base-rooms/tournament-state.d.ts.map +1 -1
- package/dist/base-rooms/tournament-state.js +2 -2
- package/dist/base-rooms/tournament-state.js.map +1 -1
- package/dist/board-game/base/board-cell.d.ts +0 -15
- package/dist/board-game/base/board-cell.d.ts.map +1 -1
- package/dist/board-game/base/board-cell.js +50 -40
- package/dist/board-game/base/board-cell.js.map +1 -1
- package/dist/board-game/base/board-figure.d.ts +0 -15
- package/dist/board-game/base/board-figure.d.ts.map +1 -1
- package/dist/board-game/base/board-figure.js +49 -36
- package/dist/board-game/base/board-figure.js.map +1 -1
- package/dist/board-game/base/board-game-master.d.ts +0 -18
- package/dist/board-game/base/board-game-master.d.ts.map +1 -1
- package/dist/board-game/base/board-game-master.js +56 -34
- package/dist/board-game/base/board-game-master.js.map +1 -1
- package/dist/board-game/base/board-player-move.d.ts +0 -10
- package/dist/board-game/base/board-player-move.d.ts.map +1 -1
- package/dist/board-game/base/board-player-move.js +29 -28
- package/dist/board-game/base/board-player-move.js.map +1 -1
- package/dist/board-game/base/board-player.d.ts +0 -12
- package/dist/board-game/base/board-player.d.ts.map +1 -1
- package/dist/board-game/base/board-player.js +43 -29
- package/dist/board-game/base/board-player.js.map +1 -1
- package/dist/board-game/base/board-table.d.ts +0 -16
- package/dist/board-game/base/board-table.d.ts.map +1 -1
- package/dist/board-game/base/board-table.js +52 -33
- package/dist/board-game/base/board-table.js.map +1 -1
- package/dist/board-game/d1-board-game/d1-board-table.d.ts +0 -18
- package/dist/board-game/d1-board-game/d1-board-table.d.ts.map +1 -1
- package/dist/board-game/d1-board-game/d1-board-table.js +56 -39
- package/dist/board-game/d1-board-game/d1-board-table.js.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-cell.d.ts +0 -11
- package/dist/board-game/d2-board-game/d2-board-cell.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-cell.js +30 -24
- package/dist/board-game/d2-board-game/d2-board-cell.js.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts +0 -28
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js +79 -49
- package/dist/board-game/d2-board-game/d2-board-pattern-move-figure.js.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-table.d.ts +0 -48
- package/dist/board-game/d2-board-game/d2-board-table.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/d2-board-table.js +262 -182
- package/dist/board-game/d2-board-game/d2-board-table.js.map +1 -1
- package/dist/board-game/d2-board-game/types.d.ts +0 -4
- package/dist/board-game/d2-board-game/types.d.ts.map +1 -1
- package/dist/board-game/d2-board-game/types.js +4 -1
- package/dist/board-game/d2-board-game/types.js.map +1 -1
- package/dist/board-game/dice.js +2 -2
- package/dist/board-game/dice.js.map +1 -1
- package/dist/board-game/index.d.ts +0 -12
- package/dist/board-game/index.d.ts.map +1 -1
- package/dist/board-game/index.js +28 -24
- package/dist/board-game/index.js.map +1 -1
- package/dist/cards-game/cards-game-master.d.ts +7 -8
- package/dist/cards-game/cards-game-master.d.ts.map +1 -1
- package/dist/cards-game/cards-game-master.js +13 -10
- package/dist/cards-game/cards-game-master.js.map +1 -1
- package/dist/cards-game/cards-player.d.ts.map +1 -1
- package/dist/cards-game/cards-player.js +1 -1
- package/dist/cards-game/cards-player.js.map +1 -1
- package/dist/cards-game/index.d.ts +1 -2
- package/dist/cards-game/index.d.ts.map +1 -1
- package/dist/cards-game/index.js +1 -3
- package/dist/cards-game/index.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tests/just-black-jack/domain/black-jack-dealer.d.ts +6 -0
- package/dist/tests/just-black-jack/domain/black-jack-dealer.d.ts.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-dealer.js +14 -0
- package/dist/tests/just-black-jack/domain/black-jack-dealer.js.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.d.ts +28 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.d.ts.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.js +90 -0
- package/dist/tests/just-black-jack/domain/black-jack-game-master.js.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.d.ts +9 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.d.ts.map +1 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.js +21 -0
- package/dist/tests/just-black-jack/domain/black-jack-player.js.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.d.ts +3 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.d.ts.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.js +30 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.js.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.d.ts +2 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.d.ts.map +1 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.js +34 -0
- package/dist/tests/just-black-jack/helpers/calculate-result.test.js.map +1 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.d.ts +6 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.d.ts.map +1 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.js +13 -0
- package/dist/tests/just-black-jack/rooms/black-jack-simple-room.js.map +1 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.d.ts +2 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.d.ts.map +1 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.js +58 -0
- package/dist/tests/just-black-jack/tests/black-jack-simple-room.test.js.map +1 -0
- package/dist/tests/just-black-jack/tests/common.d.ts +11 -0
- package/dist/tests/just-black-jack/tests/common.d.ts.map +1 -0
- package/dist/tests/just-black-jack/tests/common.js +51 -0
- package/dist/tests/just-black-jack/tests/common.js.map +1 -0
- package/package.json +3 -2
- package/src/base/game-control-player-turn.ts +5 -5
- package/src/base/game-master.ts +25 -19
- package/src/base/game-player-connections-helper.ts +40 -0
- package/src/base/game-player.ts +5 -2
- package/src/base/game-room.ts +26 -30
- package/src/base/game-round.ts +10 -16
- package/src/base/game-state-machine.ts +7 -7
- package/src/base/game-summary-result.ts +3 -0
- package/src/base/game-table-seat.ts +3 -3
- package/src/base/game-table-seats.ts +13 -13
- package/src/base/game-table.ts +28 -79
- package/src/base/index.ts +2 -0
- package/src/base/standard-game-state.ts +2 -2
- package/src/base-rooms/fast-tournament-room.ts +59 -59
- package/src/base-rooms/index.ts +9 -8
- package/src/base-rooms/scheduled-tournament-room.ts +181 -181
- package/src/base-rooms/simple-room.ts +15 -4
- package/src/base-rooms/tournament-room.ts +169 -169
- package/src/base-rooms/tournament-state.ts +2 -2
- package/src/board-game/base/board-cell.ts +50 -50
- package/src/board-game/base/board-figure.ts +49 -49
- package/src/board-game/base/board-game-master.ts +56 -56
- package/src/board-game/base/board-player-move.ts +29 -29
- package/src/board-game/base/board-player.ts +43 -43
- package/src/board-game/base/board-table.ts +52 -52
- package/src/board-game/d1-board-game/d1-board-table.ts +56 -56
- package/src/board-game/d2-board-game/d2-board-cell.ts +30 -30
- package/src/board-game/d2-board-game/d2-board-pattern-move-figure.ts +79 -79
- package/src/board-game/d2-board-game/d2-board-table.ts +262 -262
- package/src/board-game/d2-board-game/types.ts +4 -4
- package/src/board-game/dice.ts +1 -1
- package/src/board-game/index.ts +28 -28
- package/src/cards-game/cards-game-master.ts +19 -16
- package/src/cards-game/cards-player.ts +2 -1
- package/src/cards-game/index.ts +0 -2
- package/src/index.ts +1 -1
- package/src/tests/just-black-jack/domain/black-jack-dealer.ts +15 -0
- package/src/tests/just-black-jack/domain/black-jack-game-master.ts +103 -0
- package/src/tests/just-black-jack/domain/black-jack-player.ts +27 -0
- package/src/tests/just-black-jack/helpers/calculate-result.test.ts +49 -0
- package/src/tests/just-black-jack/helpers/calculate-result.ts +34 -0
- package/src/tests/just-black-jack/rooms/black-jack-simple-room.ts +10 -0
- package/src/tests/just-black-jack/tests/black-jack-simple-room.test.ts +75 -0
- package/src/tests/just-black-jack/tests/common.ts +63 -0
- package/dist/cards-game/cards-table.d.ts +0 -11
- package/dist/cards-game/cards-table.d.ts.map +0 -1
- package/dist/cards-game/cards-table.js +0 -20
- package/dist/cards-game/cards-table.js.map +0 -1
- package/src/cards-game/cards-table.ts +0 -28
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import {
|
|
1
|
+
import { cloneDeep } from 'lodash';
|
|
2
|
+
|
|
3
|
+
import { GameMaster, GameRoom } from '../base';
|
|
4
|
+
import { superShuffle } from '../utils';
|
|
4
5
|
|
|
5
6
|
import { CardsPlayer } from './cards-player';
|
|
6
7
|
import { Card } from './cards/card';
|
|
@@ -9,22 +10,24 @@ const ONE_CARD = 1;
|
|
|
9
10
|
const TWO_CARDS = 2;
|
|
10
11
|
const SIX_CARDS = 6;
|
|
11
12
|
|
|
12
|
-
export abstract class CardsGameMaster
|
|
13
|
-
private
|
|
13
|
+
export abstract class CardsGameMaster extends GameMaster {
|
|
14
|
+
private sourceDeck: Array<Card>;
|
|
15
|
+
private gameDeck: Array<Card>;
|
|
14
16
|
private readonly gameCards: Array<Card>;
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
super(
|
|
18
|
-
this.
|
|
18
|
+
constructor (room: GameRoom, sourceDeck: Array<Card>) {
|
|
19
|
+
super(room);
|
|
20
|
+
this.sourceDeck = cloneDeep(sourceDeck);
|
|
21
|
+
this.gameDeck = [];
|
|
19
22
|
this.gameCards = [];
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
shuffleDeck () {
|
|
26
|
+
this.sourceDeck = superShuffle(this.sourceDeck);
|
|
24
27
|
}
|
|
25
28
|
|
|
26
|
-
takeNewDeck (
|
|
27
|
-
this.
|
|
29
|
+
takeNewDeck () {
|
|
30
|
+
this.gameDeck = cloneDeep(this.sourceDeck);
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
getGameCards () {
|
|
@@ -32,7 +35,7 @@ export abstract class CardsGameMaster<GT extends IGameTable<GP>, GR extends IGam
|
|
|
32
35
|
}
|
|
33
36
|
|
|
34
37
|
putCardsOnTheTableFromDeck () {
|
|
35
|
-
const popCard = this.
|
|
38
|
+
const popCard = this.gameDeck.pop();
|
|
36
39
|
if (popCard) {
|
|
37
40
|
this.gameCards.push(popCard);
|
|
38
41
|
}
|
|
@@ -43,11 +46,11 @@ export abstract class CardsGameMaster<GT extends IGameTable<GP>, GR extends IGam
|
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
popCardFromDeck () {
|
|
46
|
-
return this.
|
|
49
|
+
return this.gameDeck.pop();
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
pushCardToDeck (card: Card, position: number) {
|
|
50
|
-
this.
|
|
53
|
+
this.gameDeck.splice(position, 0, card);
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
pushCardToBeggingOfTheDeck (card: Card) {
|
|
@@ -64,7 +67,7 @@ export abstract class CardsGameMaster<GT extends IGameTable<GP>, GR extends IGam
|
|
|
64
67
|
|
|
65
68
|
giveCardsToAllPlayers (count: number) {
|
|
66
69
|
this.table.getPlayers().forEach((player) => {
|
|
67
|
-
this.giveCardsToPlayer(player, count);
|
|
70
|
+
this.giveCardsToPlayer(player as CardsPlayer, count);
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
|
package/src/cards-game/index.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { Ranks } from './cards/ranks';
|
|
|
6
6
|
import { Suits } from './cards/suits';
|
|
7
7
|
import { CardsGameMaster } from './cards-game-master';
|
|
8
8
|
import { CardsPlayer } from './cards-player';
|
|
9
|
-
import { CardsTable } from './cards-table';
|
|
10
9
|
|
|
11
10
|
export {
|
|
12
11
|
cards,
|
|
@@ -17,5 +16,4 @@ export {
|
|
|
17
16
|
Suits,
|
|
18
17
|
CardsGameMaster,
|
|
19
18
|
CardsPlayer,
|
|
20
|
-
CardsTable,
|
|
21
19
|
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BlackJackPlayer } from './black-jack-player';
|
|
2
|
+
|
|
3
|
+
export class BlackJackDealer extends BlackJackPlayer {
|
|
4
|
+
constructor (tableId: string) {
|
|
5
|
+
super(`${tableId}_dealer`,
|
|
6
|
+
'Dealer John',
|
|
7
|
+
'',
|
|
8
|
+
1000000
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
override isDealer (): boolean {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { GameRound, StandardGameState } from '../../../base';
|
|
2
|
+
import { CardsGameMaster } from '../../../cards-game';
|
|
3
|
+
|
|
4
|
+
import { BlackJackPlayer } from './black-jack-player';
|
|
5
|
+
import { BlackJackDealer } from './black-jack-dealer';
|
|
6
|
+
|
|
7
|
+
export enum BlackJackMoveActionType {
|
|
8
|
+
GET_CARD = 'GET_CARD',
|
|
9
|
+
FINISH_MOVE = 'FINISH_MOVE',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export enum BlackJackSeatRole {
|
|
13
|
+
DEALER = 'DEALER',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class BlackJackGameMaster extends CardsGameMaster {
|
|
17
|
+
getGameRoundState (): StandardGameState {
|
|
18
|
+
return (this.gameRound?.getState() as StandardGameState);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
getPlayers (): Array<BlackJackPlayer> {
|
|
22
|
+
return (this.table.getPlayers() as Array<BlackJackPlayer>);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
startNewRound () {
|
|
26
|
+
this.getTable().getSeats()[0].setRole(BlackJackSeatRole.DEALER);
|
|
27
|
+
this.getTable().addPlayerToSeat(new BlackJackDealer(this.getId()));
|
|
28
|
+
|
|
29
|
+
this.shuffleDeck();
|
|
30
|
+
this.takeNewDeck();
|
|
31
|
+
|
|
32
|
+
this.setGameRound(new GameRound(new StandardGameState()));
|
|
33
|
+
this.give2CardsToAllPlayers();
|
|
34
|
+
this.getGameRoundState().toStart();
|
|
35
|
+
|
|
36
|
+
const firstPlayer = this.table.seats.getNextPlayer(this.getDealerSeat()?.getNumber() ?? 0);
|
|
37
|
+
if (firstPlayer) {
|
|
38
|
+
this.gameRound?.setActivePlayer(firstPlayer);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
changePlayer () {
|
|
43
|
+
this.changePlayerClockwise();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
finishRound () {
|
|
47
|
+
this.getGameRoundState().toFinish();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
getResults (): {} | null {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
kickPlayer (player: BlackJackPlayer) {
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
onHandleMove (player: BlackJackPlayer) {
|
|
58
|
+
const move = player.getMove();
|
|
59
|
+
|
|
60
|
+
switch (move?.getAction()) {
|
|
61
|
+
case BlackJackMoveActionType.GET_CARD: {
|
|
62
|
+
this.getCard(player);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case BlackJackMoveActionType.FINISH_MOVE: {
|
|
66
|
+
this.finishMove(player);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
onHandleRestartTimeout () {
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
onHandleTurnTimeout (player: BlackJackPlayer) {
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
getCard (player: BlackJackPlayer) {
|
|
79
|
+
this.give1CardsToPlayer(player);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
finishMove (player: BlackJackPlayer) {
|
|
83
|
+
player.finishMove();
|
|
84
|
+
|
|
85
|
+
if (this.isFinish()) {
|
|
86
|
+
this.finishRound();
|
|
87
|
+
} else {
|
|
88
|
+
this.changePlayer();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
isFinish () {
|
|
93
|
+
return this.getPlayers().filter((item) => item.isFinishedMove()).length === this.table.getPlayers().length;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
getDealerSeat () {
|
|
97
|
+
return this.getTable().seats.getSeats().find((seat) => seat.getRole() === BlackJackSeatRole.DEALER);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
getDealer (): BlackJackPlayer | undefined {
|
|
101
|
+
return this.getDealerSeat()?.getPlayer() as BlackJackPlayer | undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CardsPlayer } from '../../../cards-game';
|
|
2
|
+
|
|
3
|
+
export class BlackJackPlayer extends CardsPlayer {
|
|
4
|
+
private isFinishMove: boolean;
|
|
5
|
+
|
|
6
|
+
constructor (
|
|
7
|
+
id: string,
|
|
8
|
+
fullName: string,
|
|
9
|
+
avatarUrl: string,
|
|
10
|
+
balance: number,
|
|
11
|
+
) {
|
|
12
|
+
super(id, fullName, avatarUrl, balance);
|
|
13
|
+
this.isFinishMove = false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
isDealer (): boolean {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
finishMove () {
|
|
21
|
+
this.isFinishMove = true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
isFinishedMove () {
|
|
25
|
+
return this.isFinishMove;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
heart_2,
|
|
3
|
+
heart_3,
|
|
4
|
+
heart_jack,
|
|
5
|
+
heart_queen,
|
|
6
|
+
heart_king,
|
|
7
|
+
heart_ace,
|
|
8
|
+
club_ace,
|
|
9
|
+
} from '../../../cards-game/cards/cards';
|
|
10
|
+
|
|
11
|
+
import { calculateResult } from './calculate-result';
|
|
12
|
+
|
|
13
|
+
describe('calculate result', () => {
|
|
14
|
+
it('calc digit', () => {
|
|
15
|
+
expect(calculateResult([heart_2, heart_3])).toBe(5);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('calc with jack', () => {
|
|
19
|
+
expect(calculateResult([heart_2, heart_jack])).toBe(12);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('calc with queen', () => {
|
|
23
|
+
expect(calculateResult([heart_2, heart_queen])).toBe(12);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('calc with king', () => {
|
|
27
|
+
expect(calculateResult([heart_2, heart_king])).toBe(12);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('calc with ace, less 21', () => {
|
|
31
|
+
expect(calculateResult([heart_2, heart_ace])).toBe(13);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('calc with ace, more 21', () => {
|
|
35
|
+
expect(calculateResult([heart_2, heart_king, heart_ace])).toBe(13);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('calc with two aces, more 21', () => {
|
|
39
|
+
expect(calculateResult([heart_2, heart_king, heart_ace, club_ace])).toBe(14);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('calc with ace, more 21, overlimit', () => {
|
|
43
|
+
expect(calculateResult([heart_2, heart_king, heart_queen, heart_ace])).toBe(23);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('calc 21', () => {
|
|
47
|
+
expect(calculateResult([heart_king, heart_ace])).toBe(21);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { sumBy } from 'lodash';
|
|
2
|
+
|
|
3
|
+
import { Card, Ranks } from '../../../cards-game';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
const PICTURE_RANK = 10;
|
|
7
|
+
const ACE_RANK_11 = 11;
|
|
8
|
+
const AIM = 21;
|
|
9
|
+
const ACE_DIFF = 10;
|
|
10
|
+
|
|
11
|
+
export function calculateResult (cards: Array<Card>): number {
|
|
12
|
+
const result = sumBy(cards, (card) => {
|
|
13
|
+
switch (card.getRank()) {
|
|
14
|
+
case Ranks.JACK:
|
|
15
|
+
case Ranks.QUEEN:
|
|
16
|
+
case Ranks.KING: {
|
|
17
|
+
return PICTURE_RANK;
|
|
18
|
+
}
|
|
19
|
+
case Ranks.ACE: {
|
|
20
|
+
return ACE_RANK_11;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return card.getRank();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const aces = cards.filter((item) => item.getRank() === Ranks.ACE);
|
|
28
|
+
|
|
29
|
+
if (result > AIM && aces.length > 0) {
|
|
30
|
+
return result - (ACE_DIFF * aces.length);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SimpleRoom } from '../../../base-rooms';
|
|
2
|
+
import { GameMaster } from '../../../base';
|
|
3
|
+
import { BlackJackGameMaster } from '../domain/black-jack-game-master';
|
|
4
|
+
import { deck52 } from '../../../cards-game';
|
|
5
|
+
|
|
6
|
+
export class BlackJackSimpleRoom extends SimpleRoom {
|
|
7
|
+
createMaster (): GameMaster {
|
|
8
|
+
return new BlackJackGameMaster(this, deck52);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { cloneDeep } from 'lodash';
|
|
2
|
+
|
|
3
|
+
import { BlackJackPlayer } from '../domain/black-jack-player';
|
|
4
|
+
import { BlackJackSimpleRoom } from '../rooms/black-jack-simple-room';
|
|
5
|
+
|
|
6
|
+
import { mockDeck, player1, player2 } from './common';
|
|
7
|
+
import { calculateResult } from '../helpers/calculate-result';
|
|
8
|
+
import { GameRoomConfig } from '../../../base';
|
|
9
|
+
import { BlackJackGameMaster } from '../domain/black-jack-game-master';
|
|
10
|
+
|
|
11
|
+
describe('black jack simple room', () => {
|
|
12
|
+
let newPlayer1: BlackJackPlayer;
|
|
13
|
+
let newPlayer2: BlackJackPlayer;
|
|
14
|
+
|
|
15
|
+
let cashRoomConfig: GameRoomConfig = {
|
|
16
|
+
id: '1',
|
|
17
|
+
gameType: 'JUST_BLACK_JACK',
|
|
18
|
+
roomType: 'simple',
|
|
19
|
+
rulesType: 'STANDARD',
|
|
20
|
+
maxPlayers: 6,
|
|
21
|
+
bet: 10,
|
|
22
|
+
turnTimeout: 0,
|
|
23
|
+
restartTimeout: 0,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
beforeAll(() => {
|
|
27
|
+
mockDeck();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
newPlayer1 = cloneDeep(player1);
|
|
32
|
+
newPlayer2 = cloneDeep(player2);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('black jack simple room', () => {
|
|
36
|
+
const room = new BlackJackSimpleRoom(cashRoomConfig);
|
|
37
|
+
room.addMaster();
|
|
38
|
+
|
|
39
|
+
const master = room.getMasters()[0] as BlackJackGameMaster | undefined;
|
|
40
|
+
const table1 = master.getTable();
|
|
41
|
+
const dealer = master.getDealer();
|
|
42
|
+
|
|
43
|
+
if (table1 && dealer) {
|
|
44
|
+
table1.addPlayerToSeat(newPlayer1);
|
|
45
|
+
newPlayer1.setStack(100);
|
|
46
|
+
|
|
47
|
+
table1.addPlayerToSeat(newPlayer2);
|
|
48
|
+
newPlayer2.setStack(100);
|
|
49
|
+
|
|
50
|
+
expect(master.getGameRound()?.getState()).toBeUndefined();
|
|
51
|
+
|
|
52
|
+
master.startNewRound();
|
|
53
|
+
expect(master.getGameRoundState().isInProgress()).toBeTruthy();
|
|
54
|
+
expect(table1.getPlayers().length).toBe(3);
|
|
55
|
+
|
|
56
|
+
expect(master.getGameRound()?.getActivePlayer()).toBe(newPlayer1);
|
|
57
|
+
expect(calculateResult(newPlayer1.getCards())).toBe(20);
|
|
58
|
+
|
|
59
|
+
master.finishMove(newPlayer1);
|
|
60
|
+
|
|
61
|
+
expect(master.getGameRound()?.getActivePlayer()).toBe(newPlayer2);
|
|
62
|
+
expect(calculateResult(newPlayer2.getCards())).toBe(19);
|
|
63
|
+
|
|
64
|
+
master.getCard(newPlayer2);
|
|
65
|
+
expect(calculateResult(newPlayer2.getCards())).toBe(27);
|
|
66
|
+
master.finishMove(newPlayer2);
|
|
67
|
+
|
|
68
|
+
expect(master.getGameRound()?.getActivePlayer()).toBe(dealer);
|
|
69
|
+
expect(calculateResult(master.getDealer()?.getCards() ?? [])).toBe(21);
|
|
70
|
+
master.finishMove(dealer);
|
|
71
|
+
|
|
72
|
+
expect(master.getGameRoundState().isFinish()).toBeTruthy();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BlackJackPlayer } from '../domain/black-jack-player';
|
|
2
|
+
import * as shuffle from '../../../utils/shuffle';
|
|
3
|
+
|
|
4
|
+
export const player1 = new BlackJackPlayer(
|
|
5
|
+
'5ef77417f471c39c885d18f5',
|
|
6
|
+
'dima',
|
|
7
|
+
'',
|
|
8
|
+
1000,
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
export const player2 = new BlackJackPlayer(
|
|
12
|
+
'5ef774a71486d104736561a4',
|
|
13
|
+
'vova',
|
|
14
|
+
'',
|
|
15
|
+
500,
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
export const player3 = new BlackJackPlayer(
|
|
19
|
+
'5ef774a71486d104736561a5',
|
|
20
|
+
'pasha',
|
|
21
|
+
'',
|
|
22
|
+
500,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
export const player4 = new BlackJackPlayer(
|
|
26
|
+
'5ef774a71486d104736561a7',
|
|
27
|
+
'petya',
|
|
28
|
+
'',
|
|
29
|
+
500,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export const player5 = new BlackJackPlayer(
|
|
33
|
+
'5ef774a71486d104736561a8',
|
|
34
|
+
'dima 2',
|
|
35
|
+
'',
|
|
36
|
+
500,
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
export const player6 = new BlackJackPlayer(
|
|
40
|
+
'5ef774a71486d104736561a9',
|
|
41
|
+
'vova 2',
|
|
42
|
+
'',
|
|
43
|
+
500,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
export const player7 = new BlackJackPlayer(
|
|
47
|
+
'5ef774a71486d104736561a10',
|
|
48
|
+
'pasha 2',
|
|
49
|
+
'',
|
|
50
|
+
500,
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
export const player8 = new BlackJackPlayer(
|
|
54
|
+
'5ef774a71486d104736561a11',
|
|
55
|
+
'petya 2',
|
|
56
|
+
'',
|
|
57
|
+
500,
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
export function mockDeck () {
|
|
62
|
+
jest.spyOn(shuffle, 'superShuffle').mockImplementation((collection: any[]) => collection);
|
|
63
|
+
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { GameTable } from '../base';
|
|
2
|
-
import { GamePlayer } from '../base';
|
|
3
|
-
import { GameTableConfig } from '../base/game-table';
|
|
4
|
-
import { Card } from './cards/card';
|
|
5
|
-
export declare abstract class CardsTable<GP extends GamePlayer, GM, GSR> extends GameTable<GP, GM, GSR> {
|
|
6
|
-
private deck;
|
|
7
|
-
protected constructor(config: GameTableConfig<GP>, deck: Array<Card>);
|
|
8
|
-
shuffleDeck(): void;
|
|
9
|
-
getDeck(): Card[];
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=cards-table.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cards-table.d.ts","sourceRoot":"","sources":["../../src/cards-game/cards-table.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,8BAAsB,UAAU,CAAC,EAAE,SAAS,UAAU,EAAE,EAAE,EAAE,GAAG,CAAE,SAAQ,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;IAC3F,OAAO,CAAC,IAAI,CAAc;IAE1B,SAAS,aACL,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,EAC3B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IAMrB,WAAW;IAIX,OAAO;CAGV"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CardsTable = void 0;
|
|
4
|
-
const lodash_1 = require("lodash");
|
|
5
|
-
const base_1 = require("../base");
|
|
6
|
-
const utils_1 = require("../utils");
|
|
7
|
-
class CardsTable extends base_1.GameTable {
|
|
8
|
-
constructor(config, deck) {
|
|
9
|
-
super(config);
|
|
10
|
-
this.deck = deck;
|
|
11
|
-
}
|
|
12
|
-
shuffleDeck() {
|
|
13
|
-
this.deck = (0, utils_1.superShuffle)(this.deck);
|
|
14
|
-
}
|
|
15
|
-
getDeck() {
|
|
16
|
-
return (0, lodash_1.cloneDeep)(this.deck);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
exports.CardsTable = CardsTable;
|
|
20
|
-
//# sourceMappingURL=cards-table.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cards-table.js","sourceRoot":"","sources":["../../src/cards-game/cards-table.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AAEnC,kCAAoC;AAEpC,oCAAwC;AAKxC,MAAsB,UAA2C,SAAQ,gBAAsB;IAG3F,YACI,MAA2B,EAC3B,IAAiB;QAEjB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,WAAW;QACP,IAAI,CAAC,IAAI,GAAG,IAAA,oBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACH,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACJ;AAlBD,gCAkBC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { cloneDeep } from 'lodash';
|
|
2
|
-
|
|
3
|
-
import { GameTable } from '../base';
|
|
4
|
-
import { GamePlayer } from '../base';
|
|
5
|
-
import { superShuffle } from '../utils';
|
|
6
|
-
import { GameTableConfig } from '../base/game-table';
|
|
7
|
-
|
|
8
|
-
import { Card } from './cards/card';
|
|
9
|
-
|
|
10
|
-
export abstract class CardsTable<GP extends GamePlayer, GM, GSR> extends GameTable<GP, GM, GSR> {
|
|
11
|
-
private deck: Array<Card>;
|
|
12
|
-
|
|
13
|
-
protected constructor (
|
|
14
|
-
config: GameTableConfig<GP>,
|
|
15
|
-
deck: Array<Card>,
|
|
16
|
-
) {
|
|
17
|
-
super(config);
|
|
18
|
-
this.deck = deck;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
shuffleDeck () {
|
|
22
|
-
this.deck = superShuffle(this.deck);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
getDeck () {
|
|
26
|
-
return cloneDeep(this.deck);
|
|
27
|
-
}
|
|
28
|
-
}
|