trucoshi 0.3.3 → 0.3.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.
@@ -0,0 +1,34 @@
1
+ import { ECommand, EEnvidoCommand } from "../../types";
2
+ import { IEnvidoCalculator } from "../types";
3
+ import { IPlayer } from "./Player";
4
+ import { ITable } from "./Table";
5
+ import { ITeam } from "./Team";
6
+ export interface IEnvido {
7
+ started: boolean;
8
+ accepted: boolean;
9
+ answered: boolean;
10
+ finished: boolean;
11
+ possibleAnswerCommands: Array<ECommand>;
12
+ stake: number;
13
+ declineStake: number;
14
+ teamIdx: 0 | 1 | null;
15
+ answer: boolean | null;
16
+ pointAnswersCount: number;
17
+ winningPointsAnswer: number;
18
+ turn: number;
19
+ winningPlayer: IPlayer | null;
20
+ winner: ITeam | null;
21
+ teams: [ITeam, ITeam];
22
+ players: Array<IPlayer>;
23
+ currentPlayer: IPlayer | null;
24
+ generator: Generator<IEnvido, void, unknown>;
25
+ sayPoints(player: IPlayer, points: number): IEnvido;
26
+ sayEnvido(command: EEnvidoCommand, player: IPlayer): IEnvido;
27
+ sayAnswer(player: IPlayer, answer: boolean | null): IEnvido;
28
+ setTurn(turn: number): number;
29
+ setTeam(idx: 0 | 1): 0 | 1;
30
+ setCurrentPlayer(player: IPlayer | null): IPlayer | null;
31
+ getNextPlayer(): IteratorResult<IEnvido, IEnvido | void>;
32
+ }
33
+ export declare const EnvidoCalculator: IEnvidoCalculator;
34
+ export declare function Envido(teams: [ITeam, ITeam], matchPoint: number, table: ITable): IEnvido;
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Envido = exports.EnvidoCalculator = void 0;
4
+ const types_1 = require("../../types");
5
+ const types_2 = require("../types");
6
+ const utils_1 = require("../utils");
7
+ const EMPTY_ENVIDO = {
8
+ turn: 0,
9
+ teamIdx: null,
10
+ answer: null,
11
+ winningPlayer: null,
12
+ currentPlayer: null,
13
+ players: [],
14
+ };
15
+ exports.EnvidoCalculator = {
16
+ [types_1.EEnvidoCommand.ENVIDO]: (args) => {
17
+ if (!args || args.stake === undefined || args.declineStake === undefined) {
18
+ throw new Error("Envido calculator arguments are undefined");
19
+ }
20
+ const next = [
21
+ types_1.EEnvidoCommand.REAL_ENVIDO,
22
+ types_1.EEnvidoCommand.FALTA_ENVIDO,
23
+ types_1.EAnswerCommand.QUIERO,
24
+ types_1.EAnswerCommand.NO_QUIERO,
25
+ ];
26
+ return {
27
+ accept: 2,
28
+ decline: 1,
29
+ next: args.stake < 2 ? [types_1.EEnvidoCommand.ENVIDO, ...next] : next,
30
+ };
31
+ },
32
+ [types_1.EEnvidoCommand.REAL_ENVIDO]: () => ({
33
+ accept: 3,
34
+ decline: 1,
35
+ next: [types_1.EEnvidoCommand.FALTA_ENVIDO, types_1.EAnswerCommand.QUIERO, types_1.EAnswerCommand.NO_QUIERO],
36
+ }),
37
+ [types_1.EEnvidoCommand.FALTA_ENVIDO]: (args) => {
38
+ if (!args || !args.teams || !args.matchPoint) {
39
+ throw new Error("Envido calculator arguments are undefined");
40
+ }
41
+ const { teams, matchPoint } = args;
42
+ const totals = teams.map((team) => team.points.malas + team.points.buenas);
43
+ const higher = (0, utils_1.getMaxNumberIndex)(totals);
44
+ const points = teams[higher].points;
45
+ const accept = points.buenas > 0 ? matchPoint - points.buenas : matchPoint - points.malas;
46
+ return {
47
+ accept: 0,
48
+ decline: 2,
49
+ replace: accept,
50
+ next: [types_1.EAnswerCommand.QUIERO, types_1.EAnswerCommand.NO_QUIERO],
51
+ };
52
+ },
53
+ };
54
+ function Envido(teams, matchPoint, table) {
55
+ function* envidoAnswerGeneratorSequence() {
56
+ let i = 0;
57
+ while (i < envido.players.length && (envido.answer === null || envido.winner === null)) {
58
+ const player = envido.players[envido.turn];
59
+ envido.setCurrentPlayer(player);
60
+ if (player.disabled || !player.ready) {
61
+ envido.setCurrentPlayer(null);
62
+ }
63
+ if (envido.turn >= envido.players.length - 1) {
64
+ envido.setTurn(0);
65
+ }
66
+ else {
67
+ envido.setTurn(envido.turn + 1);
68
+ }
69
+ i++;
70
+ yield envido;
71
+ }
72
+ envido.setCurrentPlayer(null);
73
+ yield envido;
74
+ }
75
+ const envido = Object.assign(Object.assign({}, EMPTY_ENVIDO), { started: false, finished: false, answered: false, accepted: false, possibleAnswerCommands: Object.values(types_1.EEnvidoCommand), declineStake: 0, winningPointsAnswer: 0, pointAnswersCount: 0, winner: null, stake: 0, teams, generator: envidoAnswerGeneratorSequence(), sayEnvido(command, player) {
76
+ const playerTeamIdx = player.teamIdx;
77
+ if (envido.teamIdx !== playerTeamIdx && envido.possibleAnswerCommands.includes(command)) {
78
+ const opponentIdx = Number(!playerTeamIdx);
79
+ const { accept, decline, replace, next } = exports.EnvidoCalculator[command]({
80
+ stake: envido.stake,
81
+ declineStake: envido.declineStake,
82
+ teams,
83
+ matchPoint,
84
+ });
85
+ envido.teamIdx = playerTeamIdx;
86
+ envido.stake += accept;
87
+ envido.declineStake += decline;
88
+ envido.generator = envidoAnswerGeneratorSequence();
89
+ envido.players = teams[opponentIdx].players;
90
+ envido.started = true;
91
+ envido.answered = false;
92
+ if (replace) {
93
+ envido.stake = replace;
94
+ }
95
+ envido.possibleAnswerCommands = next;
96
+ }
97
+ return envido;
98
+ },
99
+ sayPoints(player, points) {
100
+ if (!envido.accepted) {
101
+ throw new Error(types_2.GAME_ERROR.ENVIDO_NOT_ACCEPTED);
102
+ }
103
+ if (!envido.winningPlayer || !envido.winningPointsAnswer) {
104
+ envido.winningPlayer = player;
105
+ envido.winningPointsAnswer = points;
106
+ }
107
+ else {
108
+ if (points > envido.winningPointsAnswer) {
109
+ envido.winningPlayer = player;
110
+ envido.winningPointsAnswer = points;
111
+ }
112
+ if (points === envido.winningPointsAnswer) {
113
+ const forehandWinner = table.getPlayerPosition(player.key, true) <
114
+ table.getPlayerPosition(envido.winningPlayer.key, true)
115
+ ? player
116
+ : envido.winningPlayer;
117
+ envido.winningPlayer = forehandWinner;
118
+ }
119
+ }
120
+ envido.pointAnswersCount++;
121
+ if (envido.pointAnswersCount >= envido.players.length) {
122
+ envido.finished = true;
123
+ envido.winner = teams[envido.winningPlayer.teamIdx];
124
+ }
125
+ return envido;
126
+ },
127
+ sayAnswer(player, answer) {
128
+ const opponentIdx = Number(!player.teamIdx);
129
+ if (answer === null || player.teamIdx === envido.teamIdx) {
130
+ return envido;
131
+ }
132
+ if (answer) {
133
+ envido.accepted = true;
134
+ envido.generator = envidoAnswerGeneratorSequence();
135
+ envido.turn = 0;
136
+ table.players.forEach((player) => player.calculateEnvido());
137
+ envido.players = table.getPlayersForehandFirst();
138
+ }
139
+ if (answer === false) {
140
+ envido.finished = true;
141
+ const opponentTeam = teams[opponentIdx];
142
+ opponentTeam.addPoints(matchPoint, envido.declineStake);
143
+ }
144
+ envido.answered = true;
145
+ envido.teamIdx = opponentIdx;
146
+ envido.answer = answer;
147
+ envido.turn = 0;
148
+ return envido;
149
+ },
150
+ setTeam(idx) {
151
+ envido.teamIdx = idx;
152
+ return envido.teamIdx;
153
+ },
154
+ setTurn(turn) {
155
+ envido.turn = turn;
156
+ return envido.turn;
157
+ },
158
+ setCurrentPlayer(player) {
159
+ envido.currentPlayer = player;
160
+ return envido.currentPlayer;
161
+ },
162
+ getNextPlayer() {
163
+ return envido.generator.next();
164
+ } });
165
+ return envido;
166
+ }
167
+ exports.Envido = Envido;
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -6,10 +6,12 @@ import { ITeam } from "./Team";
6
6
  export type IWinnerCallback = (winner: ITeam, teams: [ITeam, ITeam]) => Promise<void>;
7
7
  export type ITurnCallback = (play: IPlayInstance, newHandJustStarted: boolean) => Promise<void>;
8
8
  export type ITrucoCallback = (play: IPlayInstance) => Promise<void>;
9
+ export type IEnvidoCallback = (play: IPlayInstance, pointsRound: boolean) => Promise<void>;
9
10
  export interface IGameLoop {
10
11
  _onTruco: ITrucoCallback;
11
12
  _onTurn: ITurnCallback;
12
13
  _onWinner: IWinnerCallback;
14
+ _onEnvido: IEnvidoCallback;
13
15
  currentPlayer: IPlayer | null;
14
16
  currentHand: IHand | null;
15
17
  lastCheckedHand: number | null;
@@ -18,6 +20,7 @@ export interface IGameLoop {
18
20
  onTurn: (callback: ITurnCallback) => IGameLoop;
19
21
  onWinner: (callback: IWinnerCallback) => IGameLoop;
20
22
  onTruco: (callback: ITrucoCallback) => IGameLoop;
23
+ onEnvido: (callback: IEnvidoCallback) => IGameLoop;
21
24
  begin: () => Promise<void>;
22
25
  }
23
26
  export declare const GameLoop: (match: IMatch) => IGameLoop;
@@ -13,6 +13,7 @@ exports.GameLoop = void 0;
13
13
  const types_1 = require("../../types");
14
14
  const GameLoop = (match) => {
15
15
  let gameloop = {
16
+ _onEnvido: () => Promise.resolve(),
16
17
  _onTruco: () => Promise.resolve(),
17
18
  _onTurn: () => Promise.resolve(),
18
19
  _onWinner: () => Promise.resolve(),
@@ -33,6 +34,10 @@ const GameLoop = (match) => {
33
34
  gameloop._onWinner = callback;
34
35
  return gameloop;
35
36
  },
37
+ onEnvido: (callback) => {
38
+ gameloop._onEnvido = callback;
39
+ return gameloop;
40
+ },
36
41
  begin() {
37
42
  var _a;
38
43
  return __awaiter(this, void 0, void 0, function* () {
@@ -44,26 +49,48 @@ const GameLoop = (match) => {
44
49
  continue;
45
50
  }
46
51
  gameloop.currentPlayer = play.player;
52
+ if (play.state === types_1.EHandState.WAITING_ENVIDO_ANSWER) {
53
+ try {
54
+ play.player.setTurn(true);
55
+ yield gameloop._onEnvido(play, false);
56
+ play.player.setTurn(false);
57
+ }
58
+ catch (e) {
59
+ console.error("GAME LOOP ERROR - WAITING ENVIDO ANSWER", e);
60
+ }
61
+ continue;
62
+ }
63
+ if (play.state === types_1.EHandState.WAITING_ENVIDO_POINTS_ANSWER) {
64
+ try {
65
+ play.player.setEnvidoTurn(true);
66
+ yield gameloop._onEnvido(play, true);
67
+ play.player.setEnvidoTurn(false);
68
+ }
69
+ catch (e) {
70
+ console.error("GAME LOOP ERROR - WAITING ENVIDO POINTS ANSWER", e);
71
+ }
72
+ continue;
73
+ }
47
74
  if (play.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER) {
48
75
  try {
49
76
  yield gameloop._onTruco(play);
50
77
  }
51
78
  catch (e) {
52
- console.error("GAME LOOP ERROR", e);
79
+ console.error("GAME LOOP ERROR - WAITING TRUCO ANSWER", e);
53
80
  }
54
81
  continue;
55
82
  }
56
83
  if (play.state === types_1.EHandState.WAITING_PLAY) {
57
- play.player.setTurn(true);
58
84
  try {
85
+ play.player.setTurn(true);
59
86
  const newHandJustStarted = gameloop.lastCheckedHand !== ((_a = play.prevHand) === null || _a === void 0 ? void 0 : _a.idx);
60
87
  gameloop.lastCheckedHand = play.prevHand ? play.prevHand.idx : null;
61
88
  yield gameloop._onTurn(play, newHandJustStarted);
89
+ play.player.setTurn(false);
62
90
  }
63
91
  catch (e) {
64
- console.error("GAME LOOP ERROR", e);
92
+ console.error("GAME LOOP ERROR - WAITING PLAY", e);
65
93
  }
66
- play.player.setTurn(false);
67
94
  continue;
68
95
  }
69
96
  }
@@ -1,5 +1,6 @@
1
- import { EHandState, EnvidoState, IHandCommands } from "../../types";
1
+ import { EHandState, IHandCommands } from "../../types";
2
2
  import { ICard, IDeck } from "./Deck";
3
+ import { IEnvido } from "./Envido";
3
4
  import { IMatch } from "./Match";
4
5
  import { IPlayInstance } from "./Play";
5
6
  import { IPlayer } from "./Player";
@@ -16,16 +17,19 @@ export interface IHand {
16
17
  started: boolean;
17
18
  points: IHandPoints;
18
19
  truco: ITruco;
19
- envido: EnvidoState;
20
+ envido: IEnvido;
20
21
  rounds: Array<IRound>;
21
22
  _currentPlayer: IPlayer | null;
22
23
  get currentPlayer(): IPlayer | null;
23
24
  set currentPlayer(player: IPlayer | null);
24
25
  currentRound: IRound | null;
25
- commands: IHandCommands;
26
+ say: IHandCommands;
26
27
  finished: () => boolean;
28
+ setTurnCommands(): void;
27
29
  play(prevHand: IHand | null): IPlayInstance | null;
28
30
  nextTurn(): void;
31
+ endEnvido(): void;
32
+ sayEnvidoPoints(player: IPlayer, points: number): IEnvido;
29
33
  use(idx: number, card: ICard): ICard | null;
30
34
  pushRound(round: IRound): IRound;
31
35
  setTurn(turn: number): IPlayer;
@@ -4,6 +4,7 @@ exports.Hand = void 0;
4
4
  const types_1 = require("../../types");
5
5
  const utils_1 = require("../utils");
6
6
  const Deck_1 = require("./Deck");
7
+ const Envido_1 = require("./Envido");
7
8
  const Play_1 = require("./Play");
8
9
  const Round_1 = require("./Round");
9
10
  const Truco_1 = require("./Truco");
@@ -12,11 +13,12 @@ function Hand(match, deck, idx) {
12
13
  for (const player of team.players) {
13
14
  player.enable();
14
15
  player.setHand(deck.takeThree());
16
+ player.resetCommands();
15
17
  }
16
18
  }
17
19
  function* roundsGeneratorSequence() {
18
20
  let currentRoundIdx = 0;
19
- let forehandTeamIdx = match.table.player(hand.turn).teamIdx;
21
+ let forehandTeamIdx = match.table.getPlayer(hand.turn).teamIdx;
20
22
  while (currentRoundIdx < 3 && !hand.finished()) {
21
23
  const round = (0, Round_1.Round)();
22
24
  hand.setCurrentRound(round);
@@ -24,17 +26,25 @@ function Hand(match, deck, idx) {
24
26
  let previousRound = hand.rounds[currentRoundIdx - 1];
25
27
  // Put previous round winner as forehand
26
28
  if (previousRound && previousRound.winner) {
27
- if (!previousRound.tie) {
28
- const newTurn = match.table.getPlayerPosition(previousRound.winner.id);
29
+ if (previousRound.tie) {
30
+ hand.setTurn(match.table.forehandIdx);
31
+ }
32
+ else {
33
+ const newTurn = match.table.getPlayerPosition(previousRound.winner.key);
29
34
  if (newTurn !== -1) {
30
35
  hand.setTurn(newTurn);
31
36
  }
32
37
  }
33
- else {
34
- hand.setTurn(match.table.forehandIdx);
35
- }
36
38
  }
37
39
  while (round.turn < match.table.players.length) {
40
+ while (hand.state === types_1.EHandState.WAITING_ENVIDO_ANSWER ||
41
+ hand.state === types_1.EHandState.WAITING_ENVIDO_POINTS_ANSWER) {
42
+ const { value } = hand.envido.getNextPlayer();
43
+ if (value && value.currentPlayer) {
44
+ hand.setCurrentPlayer(value.currentPlayer);
45
+ yield hand;
46
+ }
47
+ }
38
48
  while (hand.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER) {
39
49
  const { value } = hand.truco.getNextPlayer();
40
50
  if (value && value.currentPlayer) {
@@ -46,11 +56,8 @@ function Hand(match, deck, idx) {
46
56
  hand.setState(types_1.EHandState.FINISHED);
47
57
  break;
48
58
  }
49
- const player = match.table.player(hand.turn);
59
+ const player = match.table.getPlayer(hand.turn);
50
60
  hand.setCurrentPlayer(player);
51
- if (player.disabled) {
52
- hand.setCurrentPlayer(null);
53
- }
54
61
  if (match.teams.some((team) => team.isTeamDisabled())) {
55
62
  hand.setState(types_1.EHandState.FINISHED);
56
63
  break;
@@ -67,44 +74,18 @@ function Hand(match, deck, idx) {
67
74
  if (winnerTeamIdx !== null) {
68
75
  hand.addPoints(winnerTeamIdx, hand.truco.state);
69
76
  hand.setState(types_1.EHandState.FINISHED);
77
+ if (hand.envido.winner && hand.envido.winningPlayer) {
78
+ hand.addPoints(hand.envido.winningPlayer.teamIdx, hand.envido.answer === false ? hand.envido.declineStake : hand.envido.stake);
79
+ }
70
80
  }
71
81
  currentRoundIdx++;
72
82
  }
73
83
  yield hand;
74
84
  }
75
85
  const roundsGenerator = roundsGeneratorSequence();
76
- const commands = {
77
- [types_1.ESayCommand.MAZO]: (player) => {
78
- hand.disablePlayer(player);
79
- hand.setState(types_1.EHandState.WAITING_PLAY);
80
- hand.truco.reset();
81
- hand.nextTurn();
82
- },
83
- [types_1.ESayCommand.TRUCO]: (player) => {
84
- hand.truco.sayTruco(player, () => {
85
- hand.setState(types_1.EHandState.WAITING_FOR_TRUCO_ANSWER);
86
- });
87
- },
88
- [types_1.ESayCommand.QUIERO]: (player) => {
89
- if (hand.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER) {
90
- hand.truco.sayAnswer(player, true, () => {
91
- hand.setState(types_1.EHandState.WAITING_PLAY);
92
- });
93
- }
94
- },
95
- [types_1.ESayCommand.NO_QUIERO]: (player) => {
96
- if (hand.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER) {
97
- hand.truco.sayAnswer(player, false, () => {
98
- hand.setState(types_1.EHandState.WAITING_PLAY);
99
- });
100
- }
101
- },
102
- [types_1.ESayCommand.FLOR]: () => { },
103
- [types_1.ESayCommand.CONTRAFLOR]: () => { },
104
- [types_1.EEnvidoCommand.ENVIDO]: () => { },
105
- [types_1.EEnvidoCommand.ENVIDO_ENVIDO]: () => { },
106
- [types_1.EEnvidoCommand.REAL_ENVIDO]: () => { },
107
- [types_1.EEnvidoCommand.FALTA_ENVIDO]: () => { },
86
+ const trucoCommand = (player) => {
87
+ hand.truco.sayTruco(player);
88
+ hand.setState(types_1.EHandState.WAITING_FOR_TRUCO_ANSWER);
108
89
  };
109
90
  const hand = {
110
91
  idx,
@@ -112,11 +93,55 @@ function Hand(match, deck, idx) {
112
93
  turn: Number(match.table.forehandIdx),
113
94
  state: types_1.EHandState.WAITING_PLAY,
114
95
  rounds: [],
96
+ envido: (0, Envido_1.Envido)(match.teams, match.matchPoint, match.table),
115
97
  truco: (0, Truco_1.Truco)(match.teams),
116
- envido: {
117
- accept: 1,
118
- decline: 2,
119
- teamIdx: null,
98
+ setTurnCommands() {
99
+ var _a;
100
+ match.table.players.forEach((player) => {
101
+ player.resetCommands();
102
+ });
103
+ if (hand.rounds.length === 1) {
104
+ if (hand.envido.teamIdx !== null && !hand.envido.answered) {
105
+ match.teams[Number(!hand.envido.teamIdx)].players.forEach((player) => {
106
+ hand.envido.possibleAnswerCommands.forEach((command) => {
107
+ player._commands.add(command);
108
+ });
109
+ });
110
+ }
111
+ if (hand.envido.accepted && !hand.envido.finished && hand.envido.winningPointsAnswer) {
112
+ (_a = hand.currentPlayer) === null || _a === void 0 ? void 0 : _a._commands.add(types_1.EEnvidoAnswerCommand.SON_BUENAS);
113
+ }
114
+ if (hand.currentPlayer &&
115
+ !hand.envido.started &&
116
+ (hand.truco.state < 2 || (hand.truco.state === 2 && hand.truco.answer === null))) {
117
+ for (const key in types_1.EEnvidoCommand) {
118
+ hand.currentPlayer._commands.add(key);
119
+ }
120
+ }
121
+ }
122
+ if (hand.envido.finished || !hand.envido.started) {
123
+ if (hand.truco.waitingAnswer) {
124
+ match.teams[Number(!hand.truco.teamIdx)].players.forEach((player) => {
125
+ const nextCommand = hand.truco.getNextTrucoCommand();
126
+ if (nextCommand) {
127
+ player._commands.add(nextCommand);
128
+ }
129
+ player._commands.add(types_1.EAnswerCommand.QUIERO);
130
+ player._commands.add(types_1.EAnswerCommand.NO_QUIERO);
131
+ });
132
+ }
133
+ else {
134
+ match.table.players.forEach((player) => {
135
+ if (hand.truco.teamIdx !== player.teamIdx) {
136
+ const nextCommand = hand.truco.getNextTrucoCommand();
137
+ if (nextCommand) {
138
+ player._commands.add(nextCommand);
139
+ }
140
+ }
141
+ player._commands.add(types_1.ESayCommand.MAZO);
142
+ });
143
+ }
144
+ }
120
145
  },
121
146
  points: [0, 0],
122
147
  currentRound: null,
@@ -125,15 +150,86 @@ function Hand(match, deck, idx) {
125
150
  hand._currentPlayer = player;
126
151
  },
127
152
  get currentPlayer() {
153
+ let player = hand._currentPlayer;
154
+ if (hand.state === types_1.EHandState.WAITING_ENVIDO_ANSWER ||
155
+ hand.state === types_1.EHandState.WAITING_ENVIDO_POINTS_ANSWER) {
156
+ player = hand.envido.currentPlayer;
157
+ }
128
158
  if (hand.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER) {
129
- return hand.truco.currentPlayer;
159
+ player = hand.truco.currentPlayer;
130
160
  }
131
- return hand._currentPlayer;
161
+ if (player && player.disabled) {
162
+ return null;
163
+ }
164
+ return player;
165
+ },
166
+ say: {
167
+ [types_1.ESayCommand.MAZO]: (player) => {
168
+ hand.disablePlayer(player);
169
+ hand.nextTurn();
170
+ },
171
+ [types_1.EAnswerCommand.QUIERO]: (player) => {
172
+ if (hand.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER) {
173
+ hand.truco.sayAnswer(player, true);
174
+ hand.setState(types_1.EHandState.WAITING_PLAY);
175
+ }
176
+ if (hand.state === types_1.EHandState.WAITING_ENVIDO_ANSWER) {
177
+ hand.envido.sayAnswer(player, true);
178
+ hand.setState(types_1.EHandState.WAITING_ENVIDO_POINTS_ANSWER);
179
+ }
180
+ },
181
+ [types_1.EAnswerCommand.NO_QUIERO]: (player) => {
182
+ if (hand.state === types_1.EHandState.WAITING_FOR_TRUCO_ANSWER) {
183
+ hand.truco.sayAnswer(player, false);
184
+ hand.setState(types_1.EHandState.WAITING_PLAY);
185
+ }
186
+ if (hand.state === types_1.EHandState.WAITING_ENVIDO_ANSWER) {
187
+ hand.envido.sayAnswer(player, false);
188
+ hand.endEnvido();
189
+ }
190
+ },
191
+ [types_1.EEnvidoAnswerCommand.SON_BUENAS]: (player) => {
192
+ if (hand.state === types_1.EHandState.WAITING_ENVIDO_POINTS_ANSWER) {
193
+ hand.envido.sayPoints(player, 0);
194
+ hand.endEnvido();
195
+ }
196
+ },
197
+ [types_1.ETrucoCommand.TRUCO]: trucoCommand,
198
+ [types_1.ETrucoCommand.RE_TRUCO]: trucoCommand,
199
+ [types_1.ETrucoCommand.VALE_CUATRO]: trucoCommand,
200
+ [types_1.EEnvidoCommand.ENVIDO]: (player) => {
201
+ hand.envido.sayEnvido(types_1.EEnvidoCommand.ENVIDO, player);
202
+ hand.setState(types_1.EHandState.WAITING_ENVIDO_ANSWER);
203
+ },
204
+ [types_1.EEnvidoCommand.REAL_ENVIDO]: (player) => {
205
+ hand.envido.sayEnvido(types_1.EEnvidoCommand.REAL_ENVIDO, player);
206
+ hand.setState(types_1.EHandState.WAITING_ENVIDO_ANSWER);
207
+ },
208
+ [types_1.EEnvidoCommand.FALTA_ENVIDO]: (player) => {
209
+ hand.envido.sayEnvido(types_1.EEnvidoCommand.FALTA_ENVIDO, player);
210
+ hand.setState(types_1.EHandState.WAITING_ENVIDO_ANSWER);
211
+ },
212
+ [types_1.EFlorCommand.FLOR]: () => { },
213
+ [types_1.EFlorCommand.CONTRAFLOR]: () => { },
132
214
  },
133
- commands,
134
215
  play(prevHand) {
135
216
  return (0, Play_1.PlayInstance)(hand, prevHand, match.teams);
136
217
  },
218
+ sayEnvidoPoints(player, points) {
219
+ const { winner } = hand.envido.sayPoints(player, points);
220
+ if (winner) {
221
+ hand.endEnvido();
222
+ }
223
+ return hand.envido;
224
+ },
225
+ endEnvido() {
226
+ if (hand.truco.waitingAnswer) {
227
+ hand.setState(types_1.EHandState.WAITING_FOR_TRUCO_ANSWER);
228
+ }
229
+ else {
230
+ hand.setState(types_1.EHandState.WAITING_PLAY);
231
+ }
232
+ },
137
233
  use(idx, card) {
138
234
  hand.started = true;
139
235
  const player = hand.currentPlayer;
@@ -160,7 +256,9 @@ function Hand(match, deck, idx) {
160
256
  (_a = hand.currentRound) === null || _a === void 0 ? void 0 : _a.nextTurn();
161
257
  },
162
258
  getNextPlayer() {
163
- return roundsGenerator.next();
259
+ const player = roundsGenerator.next();
260
+ hand.setTurnCommands();
261
+ return player;
164
262
  },
165
263
  disablePlayer(player) {
166
264
  match.teams[player.teamIdx].disable(player);
@@ -174,7 +272,7 @@ function Hand(match, deck, idx) {
174
272
  },
175
273
  setTurn(turn) {
176
274
  hand.turn = turn;
177
- return match.table.player(hand.turn);
275
+ return match.table.getPlayer(hand.turn);
178
276
  },
179
277
  setCurrentRound(round) {
180
278
  hand.currentRound = round;
@@ -99,7 +99,7 @@ function Lobby(teamSize) {
99
99
  lobby.teams[1].players.length !== actualTeamSize) {
100
100
  throw new Error(types_1.GAME_ERROR.UNEXPECTED_TEAM_SIZE);
101
101
  }
102
- lobby.table = (0, Table_1.Table)(lobby.players, lobby.teams);
102
+ lobby.table = (0, Table_1.Table)(lobby.players);
103
103
  lobby.gameLoop = (0, GameLoop_1.GameLoop)((0, Match_1.Match)(lobby.table, lobby.teams, matchPoint));
104
104
  lobby.started = true;
105
105
  return lobby.gameLoop;
@@ -8,6 +8,7 @@ export interface IMatch {
8
8
  winner: ITeam | null;
9
9
  prevHand: IHand | null;
10
10
  currentHand: IHand | null;
11
+ matchPoint: number;
11
12
  table: ITable;
12
13
  play(): IPlayInstance | null;
13
14
  addPoints(points: IHandPoints): [ITeam, ITeam];
@@ -47,6 +47,7 @@ function Match(table, teams = [], matchPoint = 9) {
47
47
  const handsGenerator = handsGeneratorSequence();
48
48
  const match = {
49
49
  winner: null,
50
+ matchPoint,
50
51
  teams: teams,
51
52
  hands: [],
52
53
  table,
@@ -1,5 +1,6 @@
1
- import { ECommand, EHandState, EnvidoState } from "../../types";
1
+ import { ECommand, EHandState } from "../../types";
2
2
  import { ICard } from "./Deck";
3
+ import { IEnvido } from "./Envido";
3
4
  import { IHand } from "./Hand";
4
5
  import { IPlayer } from "./Player";
5
6
  import { IRound } from "./Round";
@@ -11,11 +12,11 @@ export interface IPlayInstance {
11
12
  roundIdx: number;
12
13
  state: EHandState;
13
14
  truco: ITruco;
14
- envido: EnvidoState;
15
+ envido: IEnvido;
15
16
  player: IPlayer | null;
16
17
  rounds: Array<IRound> | null;
17
18
  prevHand: IHand | null;
18
19
  use(idx: number, card: ICard): ICard | null;
19
- say(command: ECommand, player: IPlayer): ECommand | null;
20
+ say(command: ECommand | number, player: IPlayer): ECommand | number | null;
20
21
  }
21
22
  export declare function PlayInstance(hand: IHand, prevHand: IHand | null, teams: [ITeam, ITeam]): IPlayInstance;