react-chessboard-ui 0.1.1
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/README.md +54 -0
- package/dist/ChessBoard/Arrow.d.ts +8 -0
- package/dist/ChessBoard/ArrowLayout.d.ts +11 -0
- package/dist/ChessBoard/ChessBoard.d.ts +13 -0
- package/dist/ChessBoard/ChessBoardCellsLayout.d.ts +8 -0
- package/dist/ChessBoard/ChessBoardControlLayout.d.ts +16 -0
- package/dist/ChessBoard/ChessBoardFiguresLayout.d.ts +11 -0
- package/dist/ChessBoard/ChessBoardInteractiveLayout.d.ts +15 -0
- package/dist/ChessBoard/FigurePicker.d.ts +11 -0
- package/dist/ChessBoard/HoldedFigure.d.ts +10 -0
- package/dist/ChessBoard/chessPieciesMap.d.ts +2 -0
- package/dist/ChessBoard/constants.d.ts +13 -0
- package/dist/ChessBoard/index.d.ts +1 -0
- package/dist/ChessBoard/models.d.ts +27 -0
- package/dist/ChessBoard/useChessBoardInteractive.d.ts +41 -0
- package/dist/ChessBoard/utils.d.ts +51 -0
- package/dist/JSChessEngine/FEN.utils.d.ts +51 -0
- package/dist/JSChessEngine/JSChessEngine.d.ts +383 -0
- package/dist/JSChessEngine/__tests__/FEN.utils.test.d.ts +1 -0
- package/dist/JSChessEngine/__tests__/chessState.mock.d.ts +3 -0
- package/dist/JSChessEngine/chess.consts.d.ts +49 -0
- package/dist/JSChessEngine/index.d.ts +3 -0
- package/dist/index.css +132 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2835 -0
- package/dist/index.js.map +1 -0
- package/dist/index.modern.js +2817 -0
- package/dist/index.modern.js.map +1 -0
- package/dist/index.test.d.ts +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,2817 @@
|
|
|
1
|
+
import React, { useState, useEffect, useMemo, useCallback } from 'react';
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
|
|
4
|
+
function _extends() {
|
|
5
|
+
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
6
|
+
for (var e = 1; e < arguments.length; e++) {
|
|
7
|
+
var t = arguments[e];
|
|
8
|
+
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
9
|
+
}
|
|
10
|
+
return n;
|
|
11
|
+
}, _extends.apply(null, arguments);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
var DIRECTIONS_D = ['top-right', 'bottom-right', 'bottom-left', 'top-left'];
|
|
15
|
+
var DIRECTIONS_VH = ['top', 'right', 'bottom', 'left'];
|
|
16
|
+
var FIGURES_COUNTS = {
|
|
17
|
+
PAWNS_COUNT: 8,
|
|
18
|
+
KNIGHTS_COUNT: 2,
|
|
19
|
+
BISHOPS_COUNT: 2,
|
|
20
|
+
ROOKS_COUNT: 2,
|
|
21
|
+
QUEENS_COUNT: 1,
|
|
22
|
+
KINGS_COUNT: 1
|
|
23
|
+
};
|
|
24
|
+
var JSChessEngine = /*#__PURE__*/function () {
|
|
25
|
+
function JSChessEngine() {}
|
|
26
|
+
JSChessEngine.detectDrawByRepeatMoves = function detectDrawByRepeatMoves(fenMoves) {
|
|
27
|
+
if (fenMoves.length < 8) return false;
|
|
28
|
+
var lastMoves = fenMoves.slice(fenMoves.length - 8);
|
|
29
|
+
var firstFromSelectedMoves = lastMoves.slice(0, 4);
|
|
30
|
+
var lastFromSelectedMoves = lastMoves.slice(4);
|
|
31
|
+
var firstResultsFENs = firstFromSelectedMoves.join('');
|
|
32
|
+
var lastResultsFENs = lastFromSelectedMoves.join('');
|
|
33
|
+
return firstResultsFENs === lastResultsFENs;
|
|
34
|
+
};
|
|
35
|
+
JSChessEngine.getCastlingType = function getCastlingType(move) {
|
|
36
|
+
if (move.figure.touched || move.figure.type !== 'king') return undefined;
|
|
37
|
+
var horizontalDiff = move.to[0] - move.from[0];
|
|
38
|
+
if (horizontalDiff === 0 || Math.abs(horizontalDiff) === 1) return undefined;
|
|
39
|
+
if (horizontalDiff > 0) return '0-0';
|
|
40
|
+
return '0-0-0';
|
|
41
|
+
};
|
|
42
|
+
return JSChessEngine;
|
|
43
|
+
}();
|
|
44
|
+
JSChessEngine.getNextMoves = function (state, _ref, linesWithCheck, revese) {
|
|
45
|
+
var i = _ref[0],
|
|
46
|
+
j = _ref[1];
|
|
47
|
+
if (revese === void 0) {
|
|
48
|
+
revese = false;
|
|
49
|
+
}
|
|
50
|
+
var figure = state[j][i].figure;
|
|
51
|
+
var type = figure.type;
|
|
52
|
+
var nextPositions = [];
|
|
53
|
+
switch (type) {
|
|
54
|
+
case 'pawn':
|
|
55
|
+
var pawnPossibleMoves = JSChessEngine.getNextMovesPawn(state, [i, j], revese);
|
|
56
|
+
nextPositions = JSChessEngine.correctionPossibleMoves(state, [i, j], pawnPossibleMoves, linesWithCheck);
|
|
57
|
+
break;
|
|
58
|
+
case 'bishop':
|
|
59
|
+
var bishopPossibleMoves = JSChessEngine.getNextMovesBishop(state, [i, j]);
|
|
60
|
+
nextPositions = JSChessEngine.correctionPossibleMoves(state, [i, j], bishopPossibleMoves, linesWithCheck);
|
|
61
|
+
break;
|
|
62
|
+
case 'knigts':
|
|
63
|
+
var knigtPossibleMoves = JSChessEngine.getNextMovesKnigts(state, [i, j]);
|
|
64
|
+
nextPositions = JSChessEngine.correctionPossibleMoves(state, [i, j], knigtPossibleMoves, linesWithCheck);
|
|
65
|
+
break;
|
|
66
|
+
case 'rook':
|
|
67
|
+
var rookPossibleMovese = JSChessEngine.getNextMovesRook(state, [i, j]);
|
|
68
|
+
nextPositions = JSChessEngine.correctionPossibleMoves(state, [i, j], rookPossibleMovese, linesWithCheck);
|
|
69
|
+
break;
|
|
70
|
+
case 'queen':
|
|
71
|
+
var queenPossibleMoves = JSChessEngine.getNextMovesQueen(state, [i, j]);
|
|
72
|
+
nextPositions = JSChessEngine.correctionPossibleMoves(state, [i, j], queenPossibleMoves, linesWithCheck);
|
|
73
|
+
break;
|
|
74
|
+
case 'king':
|
|
75
|
+
nextPositions = JSChessEngine.getNextMovesKing(state, [i, j], revese);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
return nextPositions;
|
|
79
|
+
};
|
|
80
|
+
JSChessEngine.reverseChessBoard = function (state) {
|
|
81
|
+
var prepareCells = [].concat(state);
|
|
82
|
+
var reversedCells = [].concat(prepareCells.reverse());
|
|
83
|
+
return reversedCells.map(function (row) {
|
|
84
|
+
return [].concat(row).reverse();
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
JSChessEngine.reverseMove = function (moveData, boardSize) {
|
|
88
|
+
var from = moveData.from,
|
|
89
|
+
to = moveData.to,
|
|
90
|
+
figure = moveData.figure,
|
|
91
|
+
type = moveData.type;
|
|
92
|
+
var reversedMove = {
|
|
93
|
+
figure: figure,
|
|
94
|
+
from: [boardSize - (from[0] + 1), boardSize - (from[1] + 1)],
|
|
95
|
+
to: [boardSize - (to[0] + 1), boardSize - (to[1] + 1)],
|
|
96
|
+
type: type
|
|
97
|
+
};
|
|
98
|
+
return reversedMove;
|
|
99
|
+
};
|
|
100
|
+
JSChessEngine.reverseMoveVector = function (moveVector, boardSize) {
|
|
101
|
+
if (boardSize === void 0) {
|
|
102
|
+
boardSize = 8;
|
|
103
|
+
}
|
|
104
|
+
var from = moveVector[0],
|
|
105
|
+
to = moveVector[1];
|
|
106
|
+
var reversedMoveVector = [[boardSize - (from[0] + 1), boardSize - (from[1] + 1)], [boardSize - (to[0] + 1), boardSize - (to[1] + 1)]];
|
|
107
|
+
return reversedMoveVector;
|
|
108
|
+
};
|
|
109
|
+
JSChessEngine.checkInBorderBoard = function (state, pos) {
|
|
110
|
+
return pos[0] >= 0 && pos[0] < state.length && pos[1] >= 0 && pos[1] < state.length;
|
|
111
|
+
};
|
|
112
|
+
JSChessEngine.getFigureColor = function (state, pos) {
|
|
113
|
+
return state[pos[1]][pos[0]].figure.color;
|
|
114
|
+
};
|
|
115
|
+
JSChessEngine.getFigureType = function (state, pos) {
|
|
116
|
+
var _state$pos$1$pos$0$fi;
|
|
117
|
+
return (_state$pos$1$pos$0$fi = state[pos[1]][pos[0]].figure) === null || _state$pos$1$pos$0$fi === void 0 ? void 0 : _state$pos$1$pos$0$fi.type;
|
|
118
|
+
};
|
|
119
|
+
JSChessEngine.checkEnemy = function (state, pos, target) {
|
|
120
|
+
var _state$target$1$targe, _state$target$1$targe2;
|
|
121
|
+
var color = JSChessEngine.getFigureColor(state, pos);
|
|
122
|
+
var targetColor = (_state$target$1$targe = state[target[1]][target[0]]) === null || _state$target$1$targe === void 0 ? void 0 : (_state$target$1$targe2 = _state$target$1$targe.figure) === null || _state$target$1$targe2 === void 0 ? void 0 : _state$target$1$targe2.color;
|
|
123
|
+
return !!targetColor && targetColor !== color;
|
|
124
|
+
};
|
|
125
|
+
JSChessEngine.checkTeammate = function (state, pos, target) {
|
|
126
|
+
var _state$target$1$targe3;
|
|
127
|
+
var color = JSChessEngine.getFigureColor(state, pos);
|
|
128
|
+
var targetColor = (_state$target$1$targe3 = state[target[1]][target[0]].figure) === null || _state$target$1$targe3 === void 0 ? void 0 : _state$target$1$targe3.color;
|
|
129
|
+
return !!targetColor && targetColor === color;
|
|
130
|
+
};
|
|
131
|
+
JSChessEngine.checkEnemyKing = function (state, pos, target) {
|
|
132
|
+
var _state$target$1$targe4, _state$target$1$targe5;
|
|
133
|
+
var isKing = ((_state$target$1$targe4 = state[target[1]][target[0]]) === null || _state$target$1$targe4 === void 0 ? void 0 : (_state$target$1$targe5 = _state$target$1$targe4.figure) === null || _state$target$1$targe5 === void 0 ? void 0 : _state$target$1$targe5.type) === 'king';
|
|
134
|
+
if (!isKing) return false;
|
|
135
|
+
return JSChessEngine.checkEnemy(state, pos, target);
|
|
136
|
+
};
|
|
137
|
+
JSChessEngine.checkBeatedCell = function (state, target) {
|
|
138
|
+
var _state$target$1$targe6;
|
|
139
|
+
return !!((_state$target$1$targe6 = state[target[1]][target[0]]) !== null && _state$target$1$targe6 !== void 0 && _state$target$1$targe6.beated);
|
|
140
|
+
};
|
|
141
|
+
JSChessEngine.hasFigure = function (state, pos) {
|
|
142
|
+
var _state$pos$1$pos$;
|
|
143
|
+
return !!((_state$pos$1$pos$ = state[pos[1]][pos[0]]) !== null && _state$pos$1$pos$ !== void 0 && _state$pos$1$pos$.figure);
|
|
144
|
+
};
|
|
145
|
+
JSChessEngine.checkFigureIsLongRange = function (state, figurePos) {
|
|
146
|
+
var figure = state[figurePos[1]][figurePos[0]].figure;
|
|
147
|
+
return (figure === null || figure === void 0 ? void 0 : figure.type) === 'bishop' || (figure === null || figure === void 0 ? void 0 : figure.type) === 'rook' || (figure === null || figure === void 0 ? void 0 : figure.type) === 'queen';
|
|
148
|
+
};
|
|
149
|
+
JSChessEngine.getCountEnemys = function (state, figurePos, positions) {
|
|
150
|
+
var count = 0;
|
|
151
|
+
positions.forEach(function (pos) {
|
|
152
|
+
if (JSChessEngine.checkEnemy(state, figurePos, pos) && !JSChessEngine.checkEnemyKing(state, figurePos, pos)) {
|
|
153
|
+
count += 1;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return count;
|
|
157
|
+
};
|
|
158
|
+
JSChessEngine.getTeammateKingPos = function (state, figurePos) {
|
|
159
|
+
var figureColor = JSChessEngine.getFigureColor(state, figurePos);
|
|
160
|
+
var kingPos = undefined;
|
|
161
|
+
for (var j = 0; j < state.length; j++) {
|
|
162
|
+
var row = state[j];
|
|
163
|
+
for (var i = 0; i < row.length; i++) {
|
|
164
|
+
var figure = row[i].figure;
|
|
165
|
+
if ((figure === null || figure === void 0 ? void 0 : figure.color) === figureColor && figure.type === 'king') {
|
|
166
|
+
kingPos = [i, j];
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (!!kingPos) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return kingPos;
|
|
175
|
+
};
|
|
176
|
+
JSChessEngine.getAllEnemysPositions = function (state, pos) {
|
|
177
|
+
var enemysPos = [];
|
|
178
|
+
state.forEach(function (row, j) {
|
|
179
|
+
return row.forEach(function (_, i) {
|
|
180
|
+
JSChessEngine.checkEnemy(state, pos, [i, j]) && enemysPos.push([i, j]);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
return enemysPos;
|
|
184
|
+
};
|
|
185
|
+
JSChessEngine.getAllTeammatesPositionsByColor = function (state, color) {
|
|
186
|
+
var positions = [];
|
|
187
|
+
state.forEach(function (row, j) {
|
|
188
|
+
return row.forEach(function (cell, i) {
|
|
189
|
+
if (!!cell.figure && cell.figure.color === color) {
|
|
190
|
+
positions.push([i, j]);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
return positions;
|
|
195
|
+
};
|
|
196
|
+
JSChessEngine.checkPossibleMoveTo = function (state, pos, target) {
|
|
197
|
+
return JSChessEngine.checkInBorderBoard(state, target) && (!JSChessEngine.hasFigure(state, target) || JSChessEngine.hasFigure(state, target) && JSChessEngine.checkEnemy(state, pos, target) && !JSChessEngine.checkEnemyKing(state, pos, target));
|
|
198
|
+
};
|
|
199
|
+
JSChessEngine.checkPossibleAttackTo = function (state, figurePos, target) {
|
|
200
|
+
return JSChessEngine.checkInBorderBoard(state, target) && (!JSChessEngine.hasFigure(state, target) || JSChessEngine.checkEnemy(state, figurePos, target));
|
|
201
|
+
};
|
|
202
|
+
JSChessEngine.checkAttackedCell = function (state, pos, target) {
|
|
203
|
+
return JSChessEngine.checkInBorderBoard(state, target);
|
|
204
|
+
};
|
|
205
|
+
JSChessEngine.checkAttackedCellByPawn = function (state, pos, target) {
|
|
206
|
+
switch (target.typeMove) {
|
|
207
|
+
case 'default':
|
|
208
|
+
case 'first':
|
|
209
|
+
return false;
|
|
210
|
+
case 'attack':
|
|
211
|
+
return JSChessEngine.checkInBorderBoard(state, target.pos);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
JSChessEngine.checkPosBetweenAttckerAndKing = function (state, pos, kingPos, attackerPos) {
|
|
215
|
+
if (pos[0] === attackerPos[0] && pos[0] === kingPos[0]) {
|
|
216
|
+
return pos[1] > kingPos[1] && pos[1] < attackerPos[1] || pos[1] > attackerPos[1] && pos[1] < kingPos[1];
|
|
217
|
+
}
|
|
218
|
+
if (pos[1] === attackerPos[1] && pos[1] === kingPos[1]) {
|
|
219
|
+
return pos[0] > kingPos[0] && pos[0] < attackerPos[0] || pos[0] > attackerPos[0] && pos[0] < kingPos[0];
|
|
220
|
+
}
|
|
221
|
+
if (pos[1] > kingPos[1] && pos[1] < attackerPos[1] || pos[1] > attackerPos[1] && pos[1] < kingPos[1]) {
|
|
222
|
+
return pos[0] > kingPos[0] && pos[0] < attackerPos[0] || pos[0] > attackerPos[0] && pos[0] < kingPos[0];
|
|
223
|
+
}
|
|
224
|
+
if (pos[0] > kingPos[0] && pos[0] < attackerPos[0] || pos[0] > attackerPos[0] && pos[0] < kingPos[0]) {
|
|
225
|
+
return pos[1] > kingPos[1] && pos[1] < attackerPos[1] || pos[1] > attackerPos[1] && pos[1] < kingPos[1];
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
};
|
|
229
|
+
JSChessEngine.correctionPossibleMoves = function (state, figurePos, possibleMoves, linesWithCheck) {
|
|
230
|
+
var kingPos = JSChessEngine.getTeammateKingPos(state, figurePos);
|
|
231
|
+
var enemysPos = JSChessEngine.getAllEnemysPositions(state, figurePos);
|
|
232
|
+
var longrangeEnemysPos = enemysPos.filter(function (pos) {
|
|
233
|
+
return JSChessEngine.checkFigureIsLongRange(state, pos);
|
|
234
|
+
});
|
|
235
|
+
var correctedPossibleMoves = [];
|
|
236
|
+
var kingBehidFigure = false;
|
|
237
|
+
longrangeEnemysPos.forEach(function (enemyPos) {
|
|
238
|
+
var enemyType = state[enemyPos[1]][enemyPos[0]].figure.type;
|
|
239
|
+
switch (enemyType) {
|
|
240
|
+
case 'bishop':
|
|
241
|
+
DIRECTIONS_D.forEach(function (direction) {
|
|
242
|
+
if (!kingBehidFigure) {
|
|
243
|
+
var attackedLine = JSChessEngine.getFullAttackedLine(state, enemyPos, direction);
|
|
244
|
+
var foundIndexKingPos = attackedLine.findIndex(function (pos) {
|
|
245
|
+
return pos[0] === kingPos[0] && pos[1] === kingPos[1];
|
|
246
|
+
});
|
|
247
|
+
var foundIndexFigurePos = attackedLine.findIndex(function (pos) {
|
|
248
|
+
return pos[0] === figurePos[0] && pos[1] === figurePos[1];
|
|
249
|
+
});
|
|
250
|
+
var countFiguresBehindKing = JSChessEngine.getCountEnemys(state, enemyPos, attackedLine);
|
|
251
|
+
kingBehidFigure = foundIndexKingPos > -1 && foundIndexFigurePos > -1 && foundIndexKingPos > foundIndexFigurePos && countFiguresBehindKing === 1;
|
|
252
|
+
if (kingBehidFigure) {
|
|
253
|
+
possibleMoves.forEach(function (possibleMove) {
|
|
254
|
+
[].concat(attackedLine, [enemyPos]).forEach(function (attackedPos) {
|
|
255
|
+
if (attackedPos[0] === possibleMove[0] && attackedPos[1] === possibleMove[1]) {
|
|
256
|
+
correctedPossibleMoves.push(possibleMove);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
break;
|
|
264
|
+
case 'rook':
|
|
265
|
+
if (kingBehidFigure) {
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
DIRECTIONS_VH.forEach(function (direction) {
|
|
269
|
+
if (!kingBehidFigure) {
|
|
270
|
+
var attackedLine = JSChessEngine.getFullAttackedLine(state, enemyPos, direction);
|
|
271
|
+
var foundIndexKingPos = attackedLine.findIndex(function (pos) {
|
|
272
|
+
return pos[0] === kingPos[0] && pos[1] === kingPos[1];
|
|
273
|
+
});
|
|
274
|
+
var foundIndexFigurePos = attackedLine.findIndex(function (pos) {
|
|
275
|
+
return pos[0] === figurePos[0] && pos[1] === figurePos[1];
|
|
276
|
+
});
|
|
277
|
+
var countFiguresBehindKing = JSChessEngine.getCountEnemys(state, enemyPos, attackedLine);
|
|
278
|
+
kingBehidFigure = foundIndexKingPos > -1 && foundIndexFigurePos > -1 && foundIndexKingPos > foundIndexFigurePos && countFiguresBehindKing === 1;
|
|
279
|
+
if (kingBehidFigure) {
|
|
280
|
+
possibleMoves.forEach(function (possibleMove) {
|
|
281
|
+
[].concat(attackedLine, [enemyPos]).forEach(function (attackedPos) {
|
|
282
|
+
if (attackedPos[0] === possibleMove[0] && attackedPos[1] === possibleMove[1]) {
|
|
283
|
+
correctedPossibleMoves.push(possibleMove);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
break;
|
|
291
|
+
case 'queen':
|
|
292
|
+
if (kingBehidFigure) {
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
[].concat(DIRECTIONS_D, DIRECTIONS_VH).forEach(function (direction) {
|
|
296
|
+
if (!kingBehidFigure) {
|
|
297
|
+
var attackedLine = JSChessEngine.getFullAttackedLine(state, enemyPos, direction);
|
|
298
|
+
var foundIndexKingPos = attackedLine.findIndex(function (pos) {
|
|
299
|
+
return pos[0] === kingPos[0] && pos[1] === kingPos[1];
|
|
300
|
+
});
|
|
301
|
+
var foundIndexFigurePos = attackedLine.findIndex(function (pos) {
|
|
302
|
+
return pos[0] === figurePos[0] && pos[1] === figurePos[1];
|
|
303
|
+
});
|
|
304
|
+
var countFiguresBehindKing = JSChessEngine.getCountEnemys(state, enemyPos, attackedLine);
|
|
305
|
+
kingBehidFigure = foundIndexKingPos > -1 && foundIndexFigurePos > -1 && foundIndexKingPos > foundIndexFigurePos && countFiguresBehindKing === 1;
|
|
306
|
+
if (kingBehidFigure) {
|
|
307
|
+
possibleMoves.forEach(function (possibleMove) {
|
|
308
|
+
[].concat(attackedLine, [enemyPos]).forEach(function (attackedPos) {
|
|
309
|
+
if (attackedPos[0] === possibleMove[0] && attackedPos[1] === possibleMove[1]) {
|
|
310
|
+
correctedPossibleMoves.push(possibleMove);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
var preparedMoves = kingBehidFigure ? correctedPossibleMoves : possibleMoves;
|
|
321
|
+
if (linesWithCheck.length === 1) {
|
|
322
|
+
var correctedMovesForProtectKing = [];
|
|
323
|
+
var attackedLine = linesWithCheck[0];
|
|
324
|
+
var attackerPos = attackedLine[attackedLine.length - 1];
|
|
325
|
+
attackedLine.forEach(function (attackedPos) {
|
|
326
|
+
preparedMoves.forEach(function (possibleMove) {
|
|
327
|
+
if (attackedPos[0] === possibleMove[0] && attackedPos[1] === possibleMove[1] && (JSChessEngine.checkPosBetweenAttckerAndKing(state, possibleMove, kingPos, attackerPos) || JSChessEngine.checkEnemy(state, kingPos, possibleMove))) {
|
|
328
|
+
correctedMovesForProtectKing.push(possibleMove);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
return correctedMovesForProtectKing;
|
|
333
|
+
}
|
|
334
|
+
if (linesWithCheck.length > 1) return [];
|
|
335
|
+
return preparedMoves;
|
|
336
|
+
};
|
|
337
|
+
JSChessEngine.getFullAttackedLine = function (state, figurePos, direction) {
|
|
338
|
+
var nextMove;
|
|
339
|
+
var attackedPositions = [];
|
|
340
|
+
switch (direction) {
|
|
341
|
+
case 'top-right':
|
|
342
|
+
nextMove = [figurePos[0] + 1, figurePos[1] - 1];
|
|
343
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
344
|
+
attackedPositions.push(nextMove);
|
|
345
|
+
nextMove = [nextMove[0] + 1, nextMove[1] - 1];
|
|
346
|
+
}
|
|
347
|
+
break;
|
|
348
|
+
case 'bottom-right':
|
|
349
|
+
nextMove = [figurePos[0] + 1, figurePos[1] + 1];
|
|
350
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
351
|
+
attackedPositions.push(nextMove);
|
|
352
|
+
nextMove = [nextMove[0] + 1, nextMove[1] + 1];
|
|
353
|
+
}
|
|
354
|
+
break;
|
|
355
|
+
case 'bottom-left':
|
|
356
|
+
nextMove = [figurePos[0] - 1, figurePos[1] + 1];
|
|
357
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
358
|
+
attackedPositions.push(nextMove);
|
|
359
|
+
nextMove = [nextMove[0] - 1, nextMove[1] + 1];
|
|
360
|
+
}
|
|
361
|
+
break;
|
|
362
|
+
case 'top-left':
|
|
363
|
+
nextMove = [figurePos[0] - 1, figurePos[1] - 1];
|
|
364
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
365
|
+
attackedPositions.push(nextMove);
|
|
366
|
+
nextMove = [nextMove[0] - 1, nextMove[1] - 1];
|
|
367
|
+
}
|
|
368
|
+
break;
|
|
369
|
+
case 'top':
|
|
370
|
+
nextMove = [figurePos[0], figurePos[1] - 1];
|
|
371
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
372
|
+
attackedPositions.push(nextMove);
|
|
373
|
+
nextMove = [nextMove[0], nextMove[1] - 1];
|
|
374
|
+
}
|
|
375
|
+
break;
|
|
376
|
+
case 'right':
|
|
377
|
+
nextMove = [figurePos[0] + 1, figurePos[1]];
|
|
378
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
379
|
+
attackedPositions.push(nextMove);
|
|
380
|
+
nextMove = [nextMove[0] + 1, nextMove[1]];
|
|
381
|
+
}
|
|
382
|
+
break;
|
|
383
|
+
case 'bottom':
|
|
384
|
+
nextMove = [figurePos[0], figurePos[1] + 1];
|
|
385
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
386
|
+
attackedPositions.push(nextMove);
|
|
387
|
+
nextMove = [nextMove[0], nextMove[1] + 1];
|
|
388
|
+
}
|
|
389
|
+
break;
|
|
390
|
+
case 'left':
|
|
391
|
+
nextMove = [figurePos[0] - 1, figurePos[1]];
|
|
392
|
+
while (JSChessEngine.checkPossibleAttackTo(state, figurePos, nextMove)) {
|
|
393
|
+
attackedPositions.push(nextMove);
|
|
394
|
+
nextMove = [nextMove[0] - 1, nextMove[1]];
|
|
395
|
+
}
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
return attackedPositions;
|
|
399
|
+
};
|
|
400
|
+
JSChessEngine.getAllAttckedPostionsByEnemys = function (state, figurePos, reverse) {
|
|
401
|
+
var enemysPos = JSChessEngine.getAllEnemysPositions(state, figurePos);
|
|
402
|
+
var attackedPositions = [];
|
|
403
|
+
enemysPos.forEach(function (_ref2) {
|
|
404
|
+
var i = _ref2[0],
|
|
405
|
+
j = _ref2[1];
|
|
406
|
+
var figure = state[j][i].figure;
|
|
407
|
+
var type = figure.type;
|
|
408
|
+
switch (type) {
|
|
409
|
+
case 'pawn':
|
|
410
|
+
var pawnAttackedPos = JSChessEngine.calcPawnMoves(state, [i, j], reverse, JSChessEngine.checkAttackedCellByPawn);
|
|
411
|
+
attackedPositions = [].concat(attackedPositions, pawnAttackedPos);
|
|
412
|
+
break;
|
|
413
|
+
case 'bishop':
|
|
414
|
+
var bishopAttackedPos = JSChessEngine.calcDiagonalMoves(state, [i, j], JSChessEngine.checkAttackedCell, function (state, _, targetPos) {
|
|
415
|
+
return JSChessEngine.hasFigure(state, targetPos) && !JSChessEngine.checkEnemyKing(state, [i, j], targetPos);
|
|
416
|
+
});
|
|
417
|
+
attackedPositions = [].concat(attackedPositions, bishopAttackedPos);
|
|
418
|
+
break;
|
|
419
|
+
case 'knigts':
|
|
420
|
+
var knigtAttackedPos = JSChessEngine.calcKnigtsMoves(state, [i, j], JSChessEngine.checkAttackedCell);
|
|
421
|
+
attackedPositions = [].concat(attackedPositions, knigtAttackedPos);
|
|
422
|
+
break;
|
|
423
|
+
case 'rook':
|
|
424
|
+
var rookAttackedPos = JSChessEngine.calcHorizontalAndVerticalMoves(state, [i, j], JSChessEngine.checkAttackedCell, function (state, _, targetPos) {
|
|
425
|
+
return JSChessEngine.hasFigure(state, targetPos) && !JSChessEngine.checkEnemyKing(state, [i, j], targetPos);
|
|
426
|
+
});
|
|
427
|
+
attackedPositions = [].concat(attackedPositions, rookAttackedPos);
|
|
428
|
+
break;
|
|
429
|
+
case 'queen':
|
|
430
|
+
var queenAttachedPosD = JSChessEngine.calcDiagonalMoves(state, [i, j], JSChessEngine.checkAttackedCell, function (state, _, targetPos) {
|
|
431
|
+
return JSChessEngine.hasFigure(state, targetPos) && !JSChessEngine.checkEnemyKing(state, [i, j], targetPos);
|
|
432
|
+
});
|
|
433
|
+
var queenAttachedPosVH = JSChessEngine.calcHorizontalAndVerticalMoves(state, [i, j], JSChessEngine.checkAttackedCell, function (state, _, targetPos) {
|
|
434
|
+
return JSChessEngine.hasFigure(state, targetPos) && !JSChessEngine.checkEnemyKing(state, [i, j], targetPos);
|
|
435
|
+
});
|
|
436
|
+
attackedPositions = [].concat(attackedPositions, queenAttachedPosD, queenAttachedPosVH);
|
|
437
|
+
break;
|
|
438
|
+
case 'king':
|
|
439
|
+
var kingAttackedPos = JSChessEngine.calcKingMoves(state, [i, j], reverse, true);
|
|
440
|
+
attackedPositions = [].concat(attackedPositions, kingAttackedPos);
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
return attackedPositions;
|
|
445
|
+
};
|
|
446
|
+
JSChessEngine.calcDiagonalMoves = function (state, figurePos, onCheckPossible, onCheckFigureInCell) {
|
|
447
|
+
if (onCheckPossible === void 0) {
|
|
448
|
+
onCheckPossible = JSChessEngine.checkPossibleMoveTo;
|
|
449
|
+
}
|
|
450
|
+
if (onCheckFigureInCell === void 0) {
|
|
451
|
+
onCheckFigureInCell = JSChessEngine.checkEnemy;
|
|
452
|
+
}
|
|
453
|
+
var nextMoves = [];
|
|
454
|
+
var nextMove = [figurePos[0] - 1, figurePos[1] - 1];
|
|
455
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
456
|
+
nextMoves.push([].concat(nextMove));
|
|
457
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
nextMove = [nextMove[0] - 1, nextMove[1] - 1];
|
|
461
|
+
}
|
|
462
|
+
nextMove = [figurePos[0] + 1, figurePos[1] - 1];
|
|
463
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
464
|
+
nextMoves.push([].concat(nextMove));
|
|
465
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
nextMove = [nextMove[0] + 1, nextMove[1] - 1];
|
|
469
|
+
}
|
|
470
|
+
nextMove = [figurePos[0] + 1, figurePos[1] + 1];
|
|
471
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
472
|
+
nextMoves.push([].concat(nextMove));
|
|
473
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
474
|
+
break;
|
|
475
|
+
}
|
|
476
|
+
nextMove = [nextMove[0] + 1, nextMove[1] + 1];
|
|
477
|
+
}
|
|
478
|
+
nextMove = [figurePos[0] - 1, figurePos[1] + 1];
|
|
479
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
480
|
+
nextMoves.push([].concat(nextMove));
|
|
481
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
nextMove = [nextMove[0] - 1, nextMove[1] + 1];
|
|
485
|
+
}
|
|
486
|
+
return nextMoves;
|
|
487
|
+
};
|
|
488
|
+
JSChessEngine.calcHorizontalAndVerticalMoves = function (state, figurePos, onCheckPossible, onCheckFigureInCell) {
|
|
489
|
+
if (onCheckPossible === void 0) {
|
|
490
|
+
onCheckPossible = JSChessEngine.checkPossibleMoveTo;
|
|
491
|
+
}
|
|
492
|
+
if (onCheckFigureInCell === void 0) {
|
|
493
|
+
onCheckFigureInCell = JSChessEngine.checkEnemy;
|
|
494
|
+
}
|
|
495
|
+
var nextMoves = [];
|
|
496
|
+
var nextMove = [figurePos[0] - 1, figurePos[1]];
|
|
497
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
498
|
+
nextMoves.push([].concat(nextMove));
|
|
499
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
500
|
+
break;
|
|
501
|
+
}
|
|
502
|
+
nextMove = [nextMove[0] - 1, nextMove[1]];
|
|
503
|
+
}
|
|
504
|
+
nextMove = [figurePos[0], figurePos[1] - 1];
|
|
505
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
506
|
+
nextMoves.push([].concat(nextMove));
|
|
507
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
508
|
+
break;
|
|
509
|
+
}
|
|
510
|
+
nextMove = [nextMove[0], nextMove[1] - 1];
|
|
511
|
+
}
|
|
512
|
+
nextMove = [figurePos[0] + 1, figurePos[1]];
|
|
513
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
514
|
+
nextMoves.push([].concat(nextMove));
|
|
515
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
516
|
+
break;
|
|
517
|
+
}
|
|
518
|
+
nextMove = [nextMove[0] + 1, nextMove[1]];
|
|
519
|
+
}
|
|
520
|
+
nextMove = [figurePos[0], figurePos[1] + 1];
|
|
521
|
+
while (onCheckPossible(state, figurePos, nextMove)) {
|
|
522
|
+
nextMoves.push([].concat(nextMove));
|
|
523
|
+
if (onCheckFigureInCell(state, figurePos, nextMove)) {
|
|
524
|
+
break;
|
|
525
|
+
}
|
|
526
|
+
nextMove = [nextMove[0], nextMove[1] + 1];
|
|
527
|
+
}
|
|
528
|
+
return nextMoves;
|
|
529
|
+
};
|
|
530
|
+
JSChessEngine.calcKnigtsMoves = function (state, figurePos, onCheckPossible) {
|
|
531
|
+
if (onCheckPossible === void 0) {
|
|
532
|
+
onCheckPossible = JSChessEngine.checkPossibleMoveTo;
|
|
533
|
+
}
|
|
534
|
+
var nextMoves = [];
|
|
535
|
+
var possibleMoves = [[figurePos[0] + 1, figurePos[1] - 2], [figurePos[0] - 1, figurePos[1] - 2], [figurePos[0] - 2, figurePos[1] + 1], [figurePos[0] - 2, figurePos[1] - 1], [figurePos[0] + 2, figurePos[1] + 1], [figurePos[0] + 2, figurePos[1] - 1], [figurePos[0] + 1, figurePos[1] + 2], [figurePos[0] - 1, figurePos[1] + 2]];
|
|
536
|
+
possibleMoves.forEach(function (move) {
|
|
537
|
+
if (onCheckPossible(state, figurePos, move)) {
|
|
538
|
+
nextMoves.push(move);
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
return nextMoves;
|
|
542
|
+
};
|
|
543
|
+
JSChessEngine.checkPossiblePawnMoveToPos = function (state, pos, target, pawnColor, reverse) {
|
|
544
|
+
switch (target.typeMove) {
|
|
545
|
+
case 'first':
|
|
546
|
+
if (pawnColor === 'white' && reverse || pawnColor === 'black' && !reverse) {
|
|
547
|
+
return pos[1] === 1 && !JSChessEngine.hasFigure(state, [target.pos[0], target.pos[1] - 1]) && !JSChessEngine.hasFigure(state, target.pos);
|
|
548
|
+
}
|
|
549
|
+
return pos[1] === state.length - 2 && !JSChessEngine.hasFigure(state, [target.pos[0], target.pos[1] + 1]) && !JSChessEngine.hasFigure(state, target.pos);
|
|
550
|
+
case 'default':
|
|
551
|
+
return !JSChessEngine.hasFigure(state, target.pos);
|
|
552
|
+
case 'attack':
|
|
553
|
+
return JSChessEngine.checkInBorderBoard(state, target.pos) && JSChessEngine.hasFigure(state, target.pos) && JSChessEngine.checkEnemy(state, pos, target.pos) && !JSChessEngine.checkEnemyKing(state, pos, target.pos) || JSChessEngine.checkInBorderBoard(state, target.pos) && JSChessEngine.checkBeatedCell(state, target.pos);
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
JSChessEngine.calcPawnMoves = function (state, figurePos, revese, onCheckPossible) {
|
|
557
|
+
if (onCheckPossible === void 0) {
|
|
558
|
+
onCheckPossible = JSChessEngine.checkPossiblePawnMoveToPos;
|
|
559
|
+
}
|
|
560
|
+
var pawnColor = JSChessEngine.getFigureColor(state, figurePos);
|
|
561
|
+
var nextMoves = [];
|
|
562
|
+
var possibleMoves = [{
|
|
563
|
+
typeMove: 'first',
|
|
564
|
+
pos: [figurePos[0], figurePos[1] - 2]
|
|
565
|
+
}, {
|
|
566
|
+
typeMove: 'default',
|
|
567
|
+
pos: [figurePos[0], figurePos[1] - 1]
|
|
568
|
+
}, {
|
|
569
|
+
typeMove: 'attack',
|
|
570
|
+
pos: [figurePos[0] - 1, figurePos[1] - 1]
|
|
571
|
+
}, {
|
|
572
|
+
typeMove: 'attack',
|
|
573
|
+
pos: [figurePos[0] + 1, figurePos[1] - 1]
|
|
574
|
+
}];
|
|
575
|
+
var possibleMovesReverse = [{
|
|
576
|
+
typeMove: 'first',
|
|
577
|
+
pos: [figurePos[0], figurePos[1] + 2]
|
|
578
|
+
}, {
|
|
579
|
+
typeMove: 'default',
|
|
580
|
+
pos: [figurePos[0], figurePos[1] + 1]
|
|
581
|
+
}, {
|
|
582
|
+
typeMove: 'attack',
|
|
583
|
+
pos: [figurePos[0] - 1, figurePos[1] + 1]
|
|
584
|
+
}, {
|
|
585
|
+
typeMove: 'attack',
|
|
586
|
+
pos: [figurePos[0] + 1, figurePos[1] + 1]
|
|
587
|
+
}];
|
|
588
|
+
var possibleMovesForColor = pawnColor === 'white' && !revese || pawnColor === 'black' && revese ? possibleMoves : possibleMovesReverse;
|
|
589
|
+
possibleMovesForColor.forEach(function (move) {
|
|
590
|
+
onCheckPossible(state, figurePos, move, pawnColor, revese) && nextMoves.push(move.pos);
|
|
591
|
+
});
|
|
592
|
+
return nextMoves;
|
|
593
|
+
};
|
|
594
|
+
JSChessEngine.checkPossibleCastling = function (state, kingPos, castlingPath, reverse) {
|
|
595
|
+
var _state$kingPos$1$king, _state$rookPos$1$rook;
|
|
596
|
+
if (!!state[kingPos[1]][kingPos[0]].figure && (_state$kingPos$1$king = state[kingPos[1]][kingPos[0]].figure) !== null && _state$kingPos$1$king !== void 0 && _state$kingPos$1$king.touched) return false;
|
|
597
|
+
var allAttackedPositionsByEnemys = JSChessEngine.getAllAttckedPostionsByEnemys(state, kingPos, reverse);
|
|
598
|
+
var foundCheckKingPos = allAttackedPositionsByEnemys.find(function (attackedPos) {
|
|
599
|
+
return attackedPos[0] === kingPos[0] && attackedPos[1] === kingPos[1];
|
|
600
|
+
});
|
|
601
|
+
if (!!foundCheckKingPos) return false;
|
|
602
|
+
var castlingPathWithoutRook = [].concat(castlingPath);
|
|
603
|
+
var rookPos = castlingPathWithoutRook.pop();
|
|
604
|
+
if (!state[rookPos[1]][rookPos[0]] || !state[rookPos[1]][rookPos[0]].figure) return false;
|
|
605
|
+
if (!!state[rookPos[1]][rookPos[0]].figure && (_state$rookPos$1$rook = state[rookPos[1]][rookPos[0]].figure) !== null && _state$rookPos$1$rook !== void 0 && _state$rookPos$1$rook.touched) return false;
|
|
606
|
+
var castlinPathWithFigures = castlingPathWithoutRook.filter(function (castlingPos) {
|
|
607
|
+
return JSChessEngine.hasFigure(state, castlingPos);
|
|
608
|
+
});
|
|
609
|
+
if (castlinPathWithFigures.length > 0) return false;
|
|
610
|
+
var isPossibleCastling = true;
|
|
611
|
+
for (var i = 0; i < allAttackedPositionsByEnemys.length; i++) {
|
|
612
|
+
var attackedPos = allAttackedPositionsByEnemys[i];
|
|
613
|
+
for (var j = 0; j < castlingPathWithoutRook.length; j++) {
|
|
614
|
+
var castlingPos = castlingPathWithoutRook[j];
|
|
615
|
+
if (castlingPos[0] === attackedPos[0] && castlingPos[1] === attackedPos[1]) {
|
|
616
|
+
isPossibleCastling = false;
|
|
617
|
+
break;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
if (!isPossibleCastling) break;
|
|
621
|
+
}
|
|
622
|
+
return isPossibleCastling;
|
|
623
|
+
};
|
|
624
|
+
JSChessEngine.calcKingMoves = function (state, figurePos, reverse, onlyAttacks) {
|
|
625
|
+
if (onlyAttacks === void 0) {
|
|
626
|
+
onlyAttacks = false;
|
|
627
|
+
}
|
|
628
|
+
var nextMoves = [];
|
|
629
|
+
var possibleMoves = [[figurePos[0], figurePos[1] - 1], [figurePos[0] + 1, figurePos[1] - 1], [figurePos[0] + 1, figurePos[1]], [figurePos[0] + 1, figurePos[1] + 1], [figurePos[0], figurePos[1] + 1], [figurePos[0] - 1, figurePos[1] + 1], [figurePos[0] - 1, figurePos[1]], [figurePos[0] - 1, figurePos[1] - 1]];
|
|
630
|
+
var castlingMovesDefault = [[figurePos[0] + 1, figurePos[1]], [figurePos[0] + 2, figurePos[1]], [figurePos[0] + 3, figurePos[1]]];
|
|
631
|
+
var longCastlingMovesDefault = [[figurePos[0] - 1, figurePos[1]], [figurePos[0] - 2, figurePos[1]], [figurePos[0] - 3, figurePos[1]], [figurePos[0] - 4, figurePos[1]]];
|
|
632
|
+
var castlingMovesReversed = [[figurePos[0] - 1, figurePos[1]], [figurePos[0] - 2, figurePos[1]], [figurePos[0] - 3, figurePos[1]]];
|
|
633
|
+
var longCastlingMovesReversed = [[figurePos[0] + 1, figurePos[1]], [figurePos[0] + 2, figurePos[1]], [figurePos[0] + 3, figurePos[1]], [figurePos[0] + 4, figurePos[1]]];
|
|
634
|
+
var castlingMoves = reverse ? castlingMovesReversed : castlingMovesDefault;
|
|
635
|
+
var longCastlingMoves = reverse ? longCastlingMovesReversed : longCastlingMovesDefault;
|
|
636
|
+
if (onlyAttacks) return possibleMoves;
|
|
637
|
+
var allAttackedPositionsByEnemys = JSChessEngine.getAllAttckedPostionsByEnemys(state, figurePos, reverse);
|
|
638
|
+
possibleMoves.forEach(function (move) {
|
|
639
|
+
if (JSChessEngine.checkPossibleMoveTo(state, figurePos, move)) {
|
|
640
|
+
var foundInAttacked = allAttackedPositionsByEnemys.find(function (attackedMove) {
|
|
641
|
+
return attackedMove[0] === move[0] && attackedMove[1] === move[1];
|
|
642
|
+
});
|
|
643
|
+
foundInAttacked === undefined && nextMoves.push(move);
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
if (JSChessEngine.checkPossibleCastling(state, figurePos, castlingMoves, reverse)) {
|
|
647
|
+
castlingMoves.forEach(function (castlingPos) {
|
|
648
|
+
return nextMoves.push(castlingPos);
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
if (JSChessEngine.checkPossibleCastling(state, figurePos, longCastlingMoves, reverse)) {
|
|
652
|
+
longCastlingMoves.forEach(function (castlingPos) {
|
|
653
|
+
return nextMoves.push(castlingPos);
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
return nextMoves;
|
|
657
|
+
};
|
|
658
|
+
JSChessEngine.getNextMovesPawn = function (state, figurePos, reverse) {
|
|
659
|
+
return JSChessEngine.calcPawnMoves(state, figurePos, reverse);
|
|
660
|
+
};
|
|
661
|
+
JSChessEngine.getNextMovesBishop = function (state, figurePos) {
|
|
662
|
+
return JSChessEngine.calcDiagonalMoves(state, figurePos);
|
|
663
|
+
};
|
|
664
|
+
JSChessEngine.getNextMovesKnigts = function (state, figurePos) {
|
|
665
|
+
return JSChessEngine.calcKnigtsMoves(state, figurePos);
|
|
666
|
+
};
|
|
667
|
+
JSChessEngine.getNextMovesRook = function (state, figurePos) {
|
|
668
|
+
return JSChessEngine.calcHorizontalAndVerticalMoves(state, figurePos);
|
|
669
|
+
};
|
|
670
|
+
JSChessEngine.getNextMovesQueen = function (state, figurePos) {
|
|
671
|
+
var diagonalMoves = JSChessEngine.calcDiagonalMoves(state, figurePos);
|
|
672
|
+
var verticalAndHorizontalMoves = JSChessEngine.calcHorizontalAndVerticalMoves(state, figurePos);
|
|
673
|
+
var moves = [].concat(diagonalMoves, verticalAndHorizontalMoves);
|
|
674
|
+
return moves;
|
|
675
|
+
};
|
|
676
|
+
JSChessEngine.getNextMovesKing = function (state, figurePos, reverse) {
|
|
677
|
+
return JSChessEngine.calcKingMoves(state, figurePos, reverse);
|
|
678
|
+
};
|
|
679
|
+
JSChessEngine.getLinesWithCheck = function (state, activeColor, reverse) {
|
|
680
|
+
if (reverse === void 0) {
|
|
681
|
+
reverse = false;
|
|
682
|
+
}
|
|
683
|
+
var posTeammates = JSChessEngine.getAllTeammatesPositionsByColor(state, activeColor);
|
|
684
|
+
var linesWithCheck = [];
|
|
685
|
+
posTeammates.forEach(function (pos) {
|
|
686
|
+
var figureType = JSChessEngine.getFigureType(state, pos);
|
|
687
|
+
switch (figureType) {
|
|
688
|
+
case 'bishop':
|
|
689
|
+
DIRECTIONS_D.forEach(function (direction) {
|
|
690
|
+
var attackedLineBishop = JSChessEngine.getFullAttackedLine(state, pos, direction);
|
|
691
|
+
var hasAttackedEnemyKing = false;
|
|
692
|
+
for (var i = 0; i < attackedLineBishop.length; i++) {
|
|
693
|
+
var attackedPos = attackedLineBishop[i];
|
|
694
|
+
if (JSChessEngine.hasFigure(state, attackedPos) && !JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
695
|
+
break;
|
|
696
|
+
}
|
|
697
|
+
if (JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
698
|
+
hasAttackedEnemyKing = true;
|
|
699
|
+
break;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
if (hasAttackedEnemyKing) {
|
|
703
|
+
linesWithCheck.push([].concat(attackedLineBishop, [pos]));
|
|
704
|
+
}
|
|
705
|
+
});
|
|
706
|
+
break;
|
|
707
|
+
case 'rook':
|
|
708
|
+
DIRECTIONS_VH.forEach(function (direction) {
|
|
709
|
+
var attackedLineRook = JSChessEngine.getFullAttackedLine(state, pos, direction);
|
|
710
|
+
var hasAttackedEnemyKing = false;
|
|
711
|
+
for (var i = 0; i < attackedLineRook.length; i++) {
|
|
712
|
+
var attackedPos = attackedLineRook[i];
|
|
713
|
+
if (JSChessEngine.hasFigure(state, attackedPos) && !JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
714
|
+
break;
|
|
715
|
+
}
|
|
716
|
+
if (JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
717
|
+
hasAttackedEnemyKing = true;
|
|
718
|
+
break;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
if (hasAttackedEnemyKing) {
|
|
722
|
+
linesWithCheck.push([].concat(attackedLineRook, [pos]));
|
|
723
|
+
}
|
|
724
|
+
});
|
|
725
|
+
break;
|
|
726
|
+
case 'queen':
|
|
727
|
+
[].concat(DIRECTIONS_D, DIRECTIONS_VH).forEach(function (direction) {
|
|
728
|
+
var attackedLineQueen = JSChessEngine.getFullAttackedLine(state, pos, direction);
|
|
729
|
+
var hasAttackedEnemyKing = false;
|
|
730
|
+
for (var i = 0; i < attackedLineQueen.length; i++) {
|
|
731
|
+
var attackedPos = attackedLineQueen[i];
|
|
732
|
+
if (JSChessEngine.hasFigure(state, attackedPos) && !JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
733
|
+
break;
|
|
734
|
+
}
|
|
735
|
+
if (JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
736
|
+
hasAttackedEnemyKing = true;
|
|
737
|
+
break;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
if (hasAttackedEnemyKing) {
|
|
741
|
+
linesWithCheck.push([].concat(attackedLineQueen, [pos]));
|
|
742
|
+
}
|
|
743
|
+
});
|
|
744
|
+
break;
|
|
745
|
+
case 'pawn':
|
|
746
|
+
var pawnAttackedPositions = [];
|
|
747
|
+
if (reverse && activeColor === 'white' || !reverse && activeColor === 'black') {
|
|
748
|
+
pawnAttackedPositions.push([pos[0] + 1, pos[1] + 1]);
|
|
749
|
+
pawnAttackedPositions.push([pos[0] - 1, pos[1] + 1]);
|
|
750
|
+
}
|
|
751
|
+
if (reverse && activeColor === 'black' || !reverse && activeColor === 'white') {
|
|
752
|
+
pawnAttackedPositions.push([pos[0] + 1, pos[1] - 1]);
|
|
753
|
+
pawnAttackedPositions.push([pos[0] - 1, pos[1] - 1]);
|
|
754
|
+
}
|
|
755
|
+
pawnAttackedPositions.forEach(function (attackedPos) {
|
|
756
|
+
if (JSChessEngine.checkInBorderBoard(state, attackedPos) && JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
757
|
+
linesWithCheck.push([attackedPos, pos]);
|
|
758
|
+
}
|
|
759
|
+
});
|
|
760
|
+
break;
|
|
761
|
+
case 'knigts':
|
|
762
|
+
var knigtAttackedPositions = [[pos[0] + 1, pos[1] - 2], [pos[0] - 1, pos[1] - 2], [pos[0] - 2, pos[1] + 1], [pos[0] - 2, pos[1] - 1], [pos[0] + 2, pos[1] + 1], [pos[0] + 2, pos[1] - 1], [pos[0] + 1, pos[1] + 2], [pos[0] - 1, pos[1] + 2]];
|
|
763
|
+
knigtAttackedPositions.forEach(function (attackedPos) {
|
|
764
|
+
if (JSChessEngine.checkInBorderBoard(state, attackedPos) && JSChessEngine.checkEnemyKing(state, pos, attackedPos)) {
|
|
765
|
+
linesWithCheck.push([attackedPos, pos]);
|
|
766
|
+
}
|
|
767
|
+
});
|
|
768
|
+
break;
|
|
769
|
+
}
|
|
770
|
+
});
|
|
771
|
+
return linesWithCheck;
|
|
772
|
+
};
|
|
773
|
+
JSChessEngine.changeState = function (state, currentFigure, targetPos, prevPos, reverse) {
|
|
774
|
+
var attackedPos = undefined;
|
|
775
|
+
var diffHorizontal = targetPos[0] - prevPos[0];
|
|
776
|
+
if (currentFigure.type === 'king' && Math.abs(diffHorizontal) > 1) {
|
|
777
|
+
if (diffHorizontal > 0) {
|
|
778
|
+
if (reverse) {
|
|
779
|
+
var _updatedCells = state.map(function (row, j) {
|
|
780
|
+
return row.map(function (cell, i) {
|
|
781
|
+
if (j === prevPos[1] && i === 4) {
|
|
782
|
+
return _extends({}, cell, {
|
|
783
|
+
figure: {
|
|
784
|
+
type: 'rook',
|
|
785
|
+
color: currentFigure.color,
|
|
786
|
+
touched: true
|
|
787
|
+
}
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
if (j === prevPos[1] && i === 5) {
|
|
791
|
+
return _extends({}, cell, {
|
|
792
|
+
figure: {
|
|
793
|
+
type: 'king',
|
|
794
|
+
color: currentFigure.color,
|
|
795
|
+
touched: true
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
if (j === prevPos[1] && i === 7 || j === prevPos[1] && i === prevPos[0]) {
|
|
800
|
+
return _extends({}, cell, {
|
|
801
|
+
figure: undefined
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
return cell;
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
return {
|
|
808
|
+
updatedCells: _updatedCells,
|
|
809
|
+
attackedPos: attackedPos
|
|
810
|
+
};
|
|
811
|
+
} else {
|
|
812
|
+
var _updatedCells2 = state.map(function (row, j) {
|
|
813
|
+
return row.map(function (cell, i) {
|
|
814
|
+
if (j === prevPos[1] && i === 5) {
|
|
815
|
+
return _extends({}, cell, {
|
|
816
|
+
figure: {
|
|
817
|
+
type: 'rook',
|
|
818
|
+
color: currentFigure.color,
|
|
819
|
+
touched: true
|
|
820
|
+
}
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
if (j === prevPos[1] && i === 6) {
|
|
824
|
+
return _extends({}, cell, {
|
|
825
|
+
figure: {
|
|
826
|
+
type: 'king',
|
|
827
|
+
color: currentFigure.color,
|
|
828
|
+
touched: true
|
|
829
|
+
}
|
|
830
|
+
});
|
|
831
|
+
}
|
|
832
|
+
if (j === prevPos[1] && i === 7 || j === prevPos[1] && i === prevPos[0]) {
|
|
833
|
+
return _extends({}, cell, {
|
|
834
|
+
figure: undefined
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
return cell;
|
|
838
|
+
});
|
|
839
|
+
});
|
|
840
|
+
return {
|
|
841
|
+
updatedCells: _updatedCells2,
|
|
842
|
+
attackedPos: attackedPos
|
|
843
|
+
};
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
if (diffHorizontal < 0) {
|
|
847
|
+
if (reverse) {
|
|
848
|
+
var _updatedCells3 = state.map(function (row, j) {
|
|
849
|
+
return row.map(function (cell, i) {
|
|
850
|
+
if (j === prevPos[1] && i === 2) {
|
|
851
|
+
return _extends({}, cell, {
|
|
852
|
+
figure: {
|
|
853
|
+
type: 'rook',
|
|
854
|
+
color: currentFigure.color,
|
|
855
|
+
touched: true
|
|
856
|
+
}
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
if (j === prevPos[1] && i === 1) {
|
|
860
|
+
return _extends({}, cell, {
|
|
861
|
+
figure: {
|
|
862
|
+
type: 'king',
|
|
863
|
+
color: currentFigure.color,
|
|
864
|
+
touched: true
|
|
865
|
+
}
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
if (j === prevPos[1] && i === 0 || j === prevPos[1] && i === prevPos[0]) {
|
|
869
|
+
return _extends({}, cell, {
|
|
870
|
+
figure: undefined
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
return cell;
|
|
874
|
+
});
|
|
875
|
+
});
|
|
876
|
+
return {
|
|
877
|
+
updatedCells: _updatedCells3,
|
|
878
|
+
attackedPos: attackedPos
|
|
879
|
+
};
|
|
880
|
+
} else {
|
|
881
|
+
var _updatedCells4 = state.map(function (row, j) {
|
|
882
|
+
return row.map(function (cell, i) {
|
|
883
|
+
if (j === prevPos[1] && i === 3) {
|
|
884
|
+
return _extends({}, cell, {
|
|
885
|
+
figure: {
|
|
886
|
+
type: 'rook',
|
|
887
|
+
color: currentFigure.color,
|
|
888
|
+
touched: true
|
|
889
|
+
}
|
|
890
|
+
});
|
|
891
|
+
}
|
|
892
|
+
if (j === prevPos[1] && i === 2) {
|
|
893
|
+
return _extends({}, cell, {
|
|
894
|
+
figure: {
|
|
895
|
+
type: 'king',
|
|
896
|
+
color: currentFigure.color,
|
|
897
|
+
touched: true
|
|
898
|
+
}
|
|
899
|
+
});
|
|
900
|
+
}
|
|
901
|
+
if (j === prevPos[1] && i === 0 || j === prevPos[1] && i === prevPos[0]) {
|
|
902
|
+
return _extends({}, cell, {
|
|
903
|
+
figure: undefined
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
return cell;
|
|
907
|
+
});
|
|
908
|
+
});
|
|
909
|
+
return {
|
|
910
|
+
updatedCells: _updatedCells4,
|
|
911
|
+
attackedPos: attackedPos
|
|
912
|
+
};
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
var updatedCells = state.map(function (row, j) {
|
|
917
|
+
return row.map(function (cell, i) {
|
|
918
|
+
if (targetPos[0] === i && targetPos[1] === j) {
|
|
919
|
+
return {
|
|
920
|
+
figure: _extends({}, currentFigure, {
|
|
921
|
+
touched: true
|
|
922
|
+
})
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
if (prevPos[0] === i && prevPos[1] === j) {
|
|
926
|
+
return {
|
|
927
|
+
figure: undefined
|
|
928
|
+
};
|
|
929
|
+
}
|
|
930
|
+
if (currentFigure.type === 'pawn' && JSChessEngine.checkBeatedCell(state, targetPos) && j === prevPos[1] && i === targetPos[0]) {
|
|
931
|
+
attackedPos = [i, j];
|
|
932
|
+
return {
|
|
933
|
+
figure: undefined,
|
|
934
|
+
beated: false
|
|
935
|
+
};
|
|
936
|
+
}
|
|
937
|
+
if (currentFigure.type === 'pawn') {
|
|
938
|
+
var diff = targetPos[1] - prevPos[1];
|
|
939
|
+
if (Math.abs(diff) === 2) {
|
|
940
|
+
if (diff > 0 && j === targetPos[1] - 1 && targetPos[0] === i || diff < 0 && j === targetPos[1] + 1 && targetPos[0] === i) {
|
|
941
|
+
return {
|
|
942
|
+
figure: undefined,
|
|
943
|
+
beated: true
|
|
944
|
+
};
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
return _extends({}, cell, {
|
|
949
|
+
beated: cell.beated ? false : cell.beated
|
|
950
|
+
});
|
|
951
|
+
});
|
|
952
|
+
});
|
|
953
|
+
return {
|
|
954
|
+
updatedCells: updatedCells,
|
|
955
|
+
attackedPos: attackedPos
|
|
956
|
+
};
|
|
957
|
+
};
|
|
958
|
+
JSChessEngine.transformPawnToFigure = function (state, fromPos, targetPos, transformFigure) {
|
|
959
|
+
var preparedState = [].concat(state);
|
|
960
|
+
return preparedState.map(function (row, j) {
|
|
961
|
+
return row.map(function (cell, i) {
|
|
962
|
+
if (i === fromPos[0] && j === fromPos[1]) {
|
|
963
|
+
return {
|
|
964
|
+
beated: false,
|
|
965
|
+
figure: undefined
|
|
966
|
+
};
|
|
967
|
+
}
|
|
968
|
+
if (i === targetPos[0] && j === targetPos[1]) {
|
|
969
|
+
return {
|
|
970
|
+
beated: false,
|
|
971
|
+
figure: transformFigure
|
|
972
|
+
};
|
|
973
|
+
}
|
|
974
|
+
return _extends({}, cell);
|
|
975
|
+
});
|
|
976
|
+
});
|
|
977
|
+
};
|
|
978
|
+
JSChessEngine.getFieldsWithFigures = function (state) {
|
|
979
|
+
var fieldsWithFigures = [];
|
|
980
|
+
state.forEach(function (row) {
|
|
981
|
+
return row.forEach(function (cell) {
|
|
982
|
+
if (!!cell.figure) {
|
|
983
|
+
fieldsWithFigures.push(cell);
|
|
984
|
+
}
|
|
985
|
+
});
|
|
986
|
+
});
|
|
987
|
+
return fieldsWithFigures;
|
|
988
|
+
};
|
|
989
|
+
JSChessEngine.getGameResult = function (state, linesWithCheck, activeColor, reverse) {
|
|
990
|
+
var posTeammates = JSChessEngine.getAllTeammatesPositionsByColor(state, activeColor);
|
|
991
|
+
var cellsWithFigures = JSChessEngine.getFieldsWithFigures(state);
|
|
992
|
+
if (cellsWithFigures.length === 2) return {
|
|
993
|
+
resultType: 'draw'
|
|
994
|
+
};
|
|
995
|
+
if (cellsWithFigures.length === 3) {
|
|
996
|
+
var figureForCommon = cellsWithFigures.find(function (cell) {
|
|
997
|
+
var _cell$figure, _cell$figure2;
|
|
998
|
+
return ((_cell$figure = cell.figure) === null || _cell$figure === void 0 ? void 0 : _cell$figure.type) === 'knigts' || ((_cell$figure2 = cell.figure) === null || _cell$figure2 === void 0 ? void 0 : _cell$figure2.type) === 'bishop';
|
|
999
|
+
});
|
|
1000
|
+
if (!!figureForCommon) return {
|
|
1001
|
+
resultType: 'draw'
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
1004
|
+
var countsNextMoves = [];
|
|
1005
|
+
posTeammates.forEach(function (pos) {
|
|
1006
|
+
var nextMoves = JSChessEngine.getNextMoves(state, pos, linesWithCheck, reverse);
|
|
1007
|
+
countsNextMoves.push(nextMoves.length);
|
|
1008
|
+
});
|
|
1009
|
+
var countsSumResult = countsNextMoves.reduce(function (prevValue, curentValue) {
|
|
1010
|
+
return prevValue + curentValue;
|
|
1011
|
+
});
|
|
1012
|
+
if (linesWithCheck.length > 0 && countsSumResult === 0) return {
|
|
1013
|
+
resultType: 'mat',
|
|
1014
|
+
winColor: activeColor === 'white' ? 'black' : 'white'
|
|
1015
|
+
};
|
|
1016
|
+
if (linesWithCheck.length === 0 && countsSumResult === 0) return {
|
|
1017
|
+
resultType: 'pat'
|
|
1018
|
+
};
|
|
1019
|
+
return undefined;
|
|
1020
|
+
};
|
|
1021
|
+
JSChessEngine.getFiguresCountByType = function (flatState, figureType) {
|
|
1022
|
+
var filtred = flatState.filter(function (_ref3) {
|
|
1023
|
+
var figure = _ref3.figure;
|
|
1024
|
+
return (figure === null || figure === void 0 ? void 0 : figure.type) === figureType;
|
|
1025
|
+
});
|
|
1026
|
+
var count = filtred.length;
|
|
1027
|
+
return count;
|
|
1028
|
+
};
|
|
1029
|
+
JSChessEngine.getBeatedFigures = function (state, color, countsConfig) {
|
|
1030
|
+
if (countsConfig === void 0) {
|
|
1031
|
+
countsConfig = FIGURES_COUNTS;
|
|
1032
|
+
}
|
|
1033
|
+
var cellsWithFigures = [];
|
|
1034
|
+
state.forEach(function (row) {
|
|
1035
|
+
var filtredCells = row.filter(function (cell) {
|
|
1036
|
+
return !!cell.figure && cell.figure.color === color;
|
|
1037
|
+
});
|
|
1038
|
+
if (filtredCells.length > 0) {
|
|
1039
|
+
cellsWithFigures = [].concat(cellsWithFigures, filtredCells);
|
|
1040
|
+
}
|
|
1041
|
+
});
|
|
1042
|
+
var beatedCountsData = {
|
|
1043
|
+
pawn: countsConfig.PAWNS_COUNT - JSChessEngine.getFiguresCountByType(cellsWithFigures, 'pawn'),
|
|
1044
|
+
knigts: countsConfig.KNIGHTS_COUNT - JSChessEngine.getFiguresCountByType(cellsWithFigures, 'knigts'),
|
|
1045
|
+
bishop: countsConfig.BISHOPS_COUNT - JSChessEngine.getFiguresCountByType(cellsWithFigures, 'bishop'),
|
|
1046
|
+
rook: countsConfig.ROOKS_COUNT - JSChessEngine.getFiguresCountByType(cellsWithFigures, 'rook'),
|
|
1047
|
+
queen: countsConfig.QUEENS_COUNT - JSChessEngine.getFiguresCountByType(cellsWithFigures, 'queen')
|
|
1048
|
+
};
|
|
1049
|
+
return beatedCountsData;
|
|
1050
|
+
};
|
|
1051
|
+
|
|
1052
|
+
var LETTERS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
|
|
1053
|
+
var FIGURES_LATTERS_NOTATIONS = {
|
|
1054
|
+
white: {
|
|
1055
|
+
pawn: 'P',
|
|
1056
|
+
knigts: 'N',
|
|
1057
|
+
bishop: 'B',
|
|
1058
|
+
rook: 'R',
|
|
1059
|
+
queen: 'Q',
|
|
1060
|
+
king: 'K'
|
|
1061
|
+
},
|
|
1062
|
+
black: {
|
|
1063
|
+
pawn: 'p',
|
|
1064
|
+
knigts: 'n',
|
|
1065
|
+
bishop: 'b',
|
|
1066
|
+
rook: 'r',
|
|
1067
|
+
queen: 'q',
|
|
1068
|
+
king: 'k'
|
|
1069
|
+
}
|
|
1070
|
+
};
|
|
1071
|
+
var LETTER_TO_FIGURE_MAP = {
|
|
1072
|
+
P: {
|
|
1073
|
+
type: 'pawn',
|
|
1074
|
+
color: 'white'
|
|
1075
|
+
},
|
|
1076
|
+
N: {
|
|
1077
|
+
type: 'knigts',
|
|
1078
|
+
color: 'white'
|
|
1079
|
+
},
|
|
1080
|
+
B: {
|
|
1081
|
+
type: 'bishop',
|
|
1082
|
+
color: 'white'
|
|
1083
|
+
},
|
|
1084
|
+
R: {
|
|
1085
|
+
type: 'rook',
|
|
1086
|
+
color: 'white'
|
|
1087
|
+
},
|
|
1088
|
+
Q: {
|
|
1089
|
+
type: 'queen',
|
|
1090
|
+
color: 'white'
|
|
1091
|
+
},
|
|
1092
|
+
K: {
|
|
1093
|
+
type: 'king',
|
|
1094
|
+
color: 'white'
|
|
1095
|
+
},
|
|
1096
|
+
p: {
|
|
1097
|
+
type: 'pawn',
|
|
1098
|
+
color: 'black'
|
|
1099
|
+
},
|
|
1100
|
+
n: {
|
|
1101
|
+
type: 'knigts',
|
|
1102
|
+
color: 'black'
|
|
1103
|
+
},
|
|
1104
|
+
b: {
|
|
1105
|
+
type: 'bishop',
|
|
1106
|
+
color: 'black'
|
|
1107
|
+
},
|
|
1108
|
+
r: {
|
|
1109
|
+
type: 'rook',
|
|
1110
|
+
color: 'black'
|
|
1111
|
+
},
|
|
1112
|
+
q: {
|
|
1113
|
+
type: 'queen',
|
|
1114
|
+
color: 'black'
|
|
1115
|
+
},
|
|
1116
|
+
k: {
|
|
1117
|
+
type: 'king',
|
|
1118
|
+
color: 'black'
|
|
1119
|
+
}
|
|
1120
|
+
};
|
|
1121
|
+
var ALL_FIGURES = [{
|
|
1122
|
+
type: 'pawn',
|
|
1123
|
+
color: 'white'
|
|
1124
|
+
}, {
|
|
1125
|
+
type: 'knigts',
|
|
1126
|
+
color: 'white'
|
|
1127
|
+
}, {
|
|
1128
|
+
type: 'bishop',
|
|
1129
|
+
color: 'white'
|
|
1130
|
+
}, {
|
|
1131
|
+
type: 'rook',
|
|
1132
|
+
color: 'white'
|
|
1133
|
+
}, {
|
|
1134
|
+
type: 'queen',
|
|
1135
|
+
color: 'white'
|
|
1136
|
+
}, {
|
|
1137
|
+
type: 'king',
|
|
1138
|
+
color: 'white'
|
|
1139
|
+
}, {
|
|
1140
|
+
type: 'pawn',
|
|
1141
|
+
color: 'black'
|
|
1142
|
+
}, {
|
|
1143
|
+
type: 'knigts',
|
|
1144
|
+
color: 'black'
|
|
1145
|
+
}, {
|
|
1146
|
+
type: 'bishop',
|
|
1147
|
+
color: 'black'
|
|
1148
|
+
}, {
|
|
1149
|
+
type: 'rook',
|
|
1150
|
+
color: 'black'
|
|
1151
|
+
}, {
|
|
1152
|
+
type: 'queen',
|
|
1153
|
+
color: 'black'
|
|
1154
|
+
}, {
|
|
1155
|
+
type: 'king',
|
|
1156
|
+
color: 'black'
|
|
1157
|
+
}];
|
|
1158
|
+
var CHESS_BOARD_CONFIG = {
|
|
1159
|
+
cellWhiteBg: '#FFFFFF',
|
|
1160
|
+
cellBlackBg: '#E2E4ED',
|
|
1161
|
+
cellSelectedBg: '#728bc1',
|
|
1162
|
+
cellSize: 80,
|
|
1163
|
+
figures: {
|
|
1164
|
+
white: {
|
|
1165
|
+
pawn: '',
|
|
1166
|
+
bishop: '',
|
|
1167
|
+
knigts: '',
|
|
1168
|
+
rook: '',
|
|
1169
|
+
queen: '',
|
|
1170
|
+
king: ''
|
|
1171
|
+
},
|
|
1172
|
+
black: {
|
|
1173
|
+
pawn: '',
|
|
1174
|
+
bishop: '',
|
|
1175
|
+
knigts: '',
|
|
1176
|
+
rook: '',
|
|
1177
|
+
queen: '',
|
|
1178
|
+
king: ''
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
};
|
|
1182
|
+
var INITIAL_CELLS = [[{
|
|
1183
|
+
figure: {
|
|
1184
|
+
type: 'rook',
|
|
1185
|
+
color: 'black',
|
|
1186
|
+
touched: false
|
|
1187
|
+
}
|
|
1188
|
+
}, {
|
|
1189
|
+
figure: {
|
|
1190
|
+
type: 'knigts',
|
|
1191
|
+
color: 'black',
|
|
1192
|
+
touched: false
|
|
1193
|
+
}
|
|
1194
|
+
}, {
|
|
1195
|
+
figure: {
|
|
1196
|
+
type: 'bishop',
|
|
1197
|
+
color: 'black',
|
|
1198
|
+
touched: false
|
|
1199
|
+
}
|
|
1200
|
+
}, {
|
|
1201
|
+
figure: {
|
|
1202
|
+
type: 'queen',
|
|
1203
|
+
color: 'black',
|
|
1204
|
+
touched: false
|
|
1205
|
+
}
|
|
1206
|
+
}, {
|
|
1207
|
+
figure: {
|
|
1208
|
+
type: 'king',
|
|
1209
|
+
color: 'black',
|
|
1210
|
+
touched: false
|
|
1211
|
+
}
|
|
1212
|
+
}, {
|
|
1213
|
+
figure: {
|
|
1214
|
+
type: 'bishop',
|
|
1215
|
+
color: 'black',
|
|
1216
|
+
touched: false
|
|
1217
|
+
}
|
|
1218
|
+
}, {
|
|
1219
|
+
figure: {
|
|
1220
|
+
type: 'knigts',
|
|
1221
|
+
color: 'black',
|
|
1222
|
+
touched: false
|
|
1223
|
+
}
|
|
1224
|
+
}, {
|
|
1225
|
+
figure: {
|
|
1226
|
+
type: 'rook',
|
|
1227
|
+
color: 'black',
|
|
1228
|
+
touched: false
|
|
1229
|
+
}
|
|
1230
|
+
}], [{
|
|
1231
|
+
figure: {
|
|
1232
|
+
type: 'pawn',
|
|
1233
|
+
color: 'black',
|
|
1234
|
+
touched: false
|
|
1235
|
+
}
|
|
1236
|
+
}, {
|
|
1237
|
+
figure: {
|
|
1238
|
+
type: 'pawn',
|
|
1239
|
+
color: 'black',
|
|
1240
|
+
touched: false
|
|
1241
|
+
}
|
|
1242
|
+
}, {
|
|
1243
|
+
figure: {
|
|
1244
|
+
type: 'pawn',
|
|
1245
|
+
color: 'black',
|
|
1246
|
+
touched: false
|
|
1247
|
+
}
|
|
1248
|
+
}, {
|
|
1249
|
+
figure: {
|
|
1250
|
+
type: 'pawn',
|
|
1251
|
+
color: 'black',
|
|
1252
|
+
touched: false
|
|
1253
|
+
}
|
|
1254
|
+
}, {
|
|
1255
|
+
figure: {
|
|
1256
|
+
type: 'pawn',
|
|
1257
|
+
color: 'black',
|
|
1258
|
+
touched: false
|
|
1259
|
+
}
|
|
1260
|
+
}, {
|
|
1261
|
+
figure: {
|
|
1262
|
+
type: 'pawn',
|
|
1263
|
+
color: 'black',
|
|
1264
|
+
touched: false
|
|
1265
|
+
}
|
|
1266
|
+
}, {
|
|
1267
|
+
figure: {
|
|
1268
|
+
type: 'pawn',
|
|
1269
|
+
color: 'black',
|
|
1270
|
+
touched: false
|
|
1271
|
+
}
|
|
1272
|
+
}, {
|
|
1273
|
+
figure: {
|
|
1274
|
+
type: 'pawn',
|
|
1275
|
+
color: 'black',
|
|
1276
|
+
touched: false
|
|
1277
|
+
}
|
|
1278
|
+
}], [{
|
|
1279
|
+
figure: undefined
|
|
1280
|
+
}, {
|
|
1281
|
+
figure: undefined
|
|
1282
|
+
}, {
|
|
1283
|
+
figure: undefined
|
|
1284
|
+
}, {
|
|
1285
|
+
figure: undefined
|
|
1286
|
+
}, {
|
|
1287
|
+
figure: undefined
|
|
1288
|
+
}, {
|
|
1289
|
+
figure: undefined
|
|
1290
|
+
}, {
|
|
1291
|
+
figure: undefined
|
|
1292
|
+
}, {
|
|
1293
|
+
figure: undefined
|
|
1294
|
+
}], [{
|
|
1295
|
+
figure: undefined
|
|
1296
|
+
}, {
|
|
1297
|
+
figure: undefined
|
|
1298
|
+
}, {
|
|
1299
|
+
figure: undefined
|
|
1300
|
+
}, {
|
|
1301
|
+
figure: undefined
|
|
1302
|
+
}, {
|
|
1303
|
+
figure: undefined
|
|
1304
|
+
}, {
|
|
1305
|
+
figure: undefined
|
|
1306
|
+
}, {
|
|
1307
|
+
figure: undefined
|
|
1308
|
+
}, {
|
|
1309
|
+
figure: undefined
|
|
1310
|
+
}], [{
|
|
1311
|
+
figure: undefined
|
|
1312
|
+
}, {
|
|
1313
|
+
figure: undefined
|
|
1314
|
+
}, {
|
|
1315
|
+
figure: undefined
|
|
1316
|
+
}, {
|
|
1317
|
+
figure: undefined
|
|
1318
|
+
}, {
|
|
1319
|
+
figure: undefined
|
|
1320
|
+
}, {
|
|
1321
|
+
figure: undefined
|
|
1322
|
+
}, {
|
|
1323
|
+
figure: undefined
|
|
1324
|
+
}, {
|
|
1325
|
+
figure: undefined
|
|
1326
|
+
}], [{
|
|
1327
|
+
figure: undefined
|
|
1328
|
+
}, {
|
|
1329
|
+
figure: undefined
|
|
1330
|
+
}, {
|
|
1331
|
+
figure: undefined
|
|
1332
|
+
}, {
|
|
1333
|
+
figure: undefined
|
|
1334
|
+
}, {
|
|
1335
|
+
figure: undefined
|
|
1336
|
+
}, {
|
|
1337
|
+
figure: undefined
|
|
1338
|
+
}, {
|
|
1339
|
+
figure: undefined
|
|
1340
|
+
}, {
|
|
1341
|
+
figure: undefined
|
|
1342
|
+
}], [{
|
|
1343
|
+
figure: {
|
|
1344
|
+
type: 'pawn',
|
|
1345
|
+
color: 'white',
|
|
1346
|
+
touched: false
|
|
1347
|
+
}
|
|
1348
|
+
}, {
|
|
1349
|
+
figure: {
|
|
1350
|
+
type: 'pawn',
|
|
1351
|
+
color: 'white',
|
|
1352
|
+
touched: false
|
|
1353
|
+
}
|
|
1354
|
+
}, {
|
|
1355
|
+
figure: {
|
|
1356
|
+
type: 'pawn',
|
|
1357
|
+
color: 'white',
|
|
1358
|
+
touched: false
|
|
1359
|
+
}
|
|
1360
|
+
}, {
|
|
1361
|
+
figure: {
|
|
1362
|
+
type: 'pawn',
|
|
1363
|
+
color: 'white',
|
|
1364
|
+
touched: false
|
|
1365
|
+
}
|
|
1366
|
+
}, {
|
|
1367
|
+
figure: {
|
|
1368
|
+
type: 'pawn',
|
|
1369
|
+
color: 'white',
|
|
1370
|
+
touched: false
|
|
1371
|
+
}
|
|
1372
|
+
}, {
|
|
1373
|
+
figure: {
|
|
1374
|
+
type: 'pawn',
|
|
1375
|
+
color: 'white',
|
|
1376
|
+
touched: false
|
|
1377
|
+
}
|
|
1378
|
+
}, {
|
|
1379
|
+
figure: {
|
|
1380
|
+
type: 'pawn',
|
|
1381
|
+
color: 'white',
|
|
1382
|
+
touched: false
|
|
1383
|
+
}
|
|
1384
|
+
}, {
|
|
1385
|
+
figure: {
|
|
1386
|
+
type: 'pawn',
|
|
1387
|
+
color: 'white',
|
|
1388
|
+
touched: false
|
|
1389
|
+
}
|
|
1390
|
+
}], [{
|
|
1391
|
+
figure: {
|
|
1392
|
+
type: 'rook',
|
|
1393
|
+
color: 'white',
|
|
1394
|
+
touched: false
|
|
1395
|
+
}
|
|
1396
|
+
}, {
|
|
1397
|
+
figure: {
|
|
1398
|
+
type: 'knigts',
|
|
1399
|
+
color: 'white',
|
|
1400
|
+
touched: false
|
|
1401
|
+
}
|
|
1402
|
+
}, {
|
|
1403
|
+
figure: {
|
|
1404
|
+
type: 'bishop',
|
|
1405
|
+
color: 'white',
|
|
1406
|
+
touched: false
|
|
1407
|
+
}
|
|
1408
|
+
}, {
|
|
1409
|
+
figure: {
|
|
1410
|
+
type: 'queen',
|
|
1411
|
+
color: 'white',
|
|
1412
|
+
touched: false
|
|
1413
|
+
}
|
|
1414
|
+
}, {
|
|
1415
|
+
figure: {
|
|
1416
|
+
type: 'king',
|
|
1417
|
+
color: 'white',
|
|
1418
|
+
touched: false
|
|
1419
|
+
}
|
|
1420
|
+
}, {
|
|
1421
|
+
figure: {
|
|
1422
|
+
type: 'bishop',
|
|
1423
|
+
color: 'white',
|
|
1424
|
+
touched: false
|
|
1425
|
+
}
|
|
1426
|
+
}, {
|
|
1427
|
+
figure: {
|
|
1428
|
+
type: 'knigts',
|
|
1429
|
+
color: 'white',
|
|
1430
|
+
touched: false
|
|
1431
|
+
}
|
|
1432
|
+
}, {
|
|
1433
|
+
figure: {
|
|
1434
|
+
type: 'rook',
|
|
1435
|
+
color: 'white',
|
|
1436
|
+
touched: false
|
|
1437
|
+
}
|
|
1438
|
+
}]];
|
|
1439
|
+
|
|
1440
|
+
var getPositionByFEN = function getPositionByFEN(positionFEN) {
|
|
1441
|
+
return [8 - parseInt(positionFEN[1]) + 1, LETTERS.findIndex(function (letter) {
|
|
1442
|
+
return letter === positionFEN[0];
|
|
1443
|
+
})];
|
|
1444
|
+
};
|
|
1445
|
+
var prepareCastlingByFEN = function prepareCastlingByFEN(castlingNotation, state) {
|
|
1446
|
+
if (castlingNotation === '-') return state;
|
|
1447
|
+
var preparedState = [].concat(state);
|
|
1448
|
+
if (castlingNotation.includes('K')) {
|
|
1449
|
+
preparedState[preparedState.length - 1][preparedState.length - 1].figure = _extends({}, preparedState[preparedState.length - 1][preparedState.length - 1].figure, {
|
|
1450
|
+
touched: false
|
|
1451
|
+
});
|
|
1452
|
+
preparedState[preparedState.length - 1][4].figure = _extends({}, preparedState[preparedState.length - 1][4].figure, {
|
|
1453
|
+
touched: false
|
|
1454
|
+
});
|
|
1455
|
+
}
|
|
1456
|
+
if (castlingNotation.includes('Q')) {
|
|
1457
|
+
preparedState[preparedState.length - 1][0].figure = _extends({}, preparedState[preparedState.length - 1][0].figure, {
|
|
1458
|
+
touched: false
|
|
1459
|
+
});
|
|
1460
|
+
preparedState[preparedState.length - 1][4].figure = _extends({}, preparedState[preparedState.length - 1][4].figure, {
|
|
1461
|
+
touched: false
|
|
1462
|
+
});
|
|
1463
|
+
}
|
|
1464
|
+
if (castlingNotation.includes('k')) {
|
|
1465
|
+
preparedState[0][preparedState.length - 1].figure = _extends({}, preparedState[0][preparedState.length - 1].figure, {
|
|
1466
|
+
touched: false
|
|
1467
|
+
});
|
|
1468
|
+
preparedState[0][4].figure = _extends({}, preparedState[0][4].figure, {
|
|
1469
|
+
touched: false
|
|
1470
|
+
});
|
|
1471
|
+
}
|
|
1472
|
+
if (castlingNotation.includes('q')) {
|
|
1473
|
+
preparedState[0][0].figure = _extends({}, preparedState[0][preparedState.length - 1].figure, {
|
|
1474
|
+
touched: false
|
|
1475
|
+
});
|
|
1476
|
+
preparedState[0][4].figure = _extends({}, preparedState[0][4].figure, {
|
|
1477
|
+
touched: false
|
|
1478
|
+
});
|
|
1479
|
+
}
|
|
1480
|
+
return preparedState;
|
|
1481
|
+
};
|
|
1482
|
+
var partFENtoState = function partFENtoState(notation) {
|
|
1483
|
+
var restoredState = [];
|
|
1484
|
+
var stateRows = notation.split('/');
|
|
1485
|
+
stateRows.forEach(function (stateRow) {
|
|
1486
|
+
var rowCells = [];
|
|
1487
|
+
for (var i = 0; i < stateRow.length; i++) {
|
|
1488
|
+
var cellNotation = stateRow[i];
|
|
1489
|
+
if (cellNotation === '.') {
|
|
1490
|
+
rowCells.push({
|
|
1491
|
+
figure: undefined
|
|
1492
|
+
});
|
|
1493
|
+
} else {
|
|
1494
|
+
var figure = LETTER_TO_FIGURE_MAP[cellNotation];
|
|
1495
|
+
rowCells.push({
|
|
1496
|
+
figure: _extends({}, figure, {
|
|
1497
|
+
touched: true
|
|
1498
|
+
})
|
|
1499
|
+
});
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
restoredState.push(rowCells);
|
|
1503
|
+
});
|
|
1504
|
+
return restoredState.filter(function (row) {
|
|
1505
|
+
return row.length > 0;
|
|
1506
|
+
});
|
|
1507
|
+
};
|
|
1508
|
+
var FENtoGameState = function FENtoGameState(FEN) {
|
|
1509
|
+
var gameState = {
|
|
1510
|
+
boardState: [],
|
|
1511
|
+
currentColor: 'white'
|
|
1512
|
+
};
|
|
1513
|
+
var _FEN$split = FEN.split(' '),
|
|
1514
|
+
stateNotaion = _FEN$split[0],
|
|
1515
|
+
currentColor = _FEN$split[1],
|
|
1516
|
+
FENcastling = _FEN$split[2],
|
|
1517
|
+
beatedField = _FEN$split[3],
|
|
1518
|
+
_ = _FEN$split.slice(4);
|
|
1519
|
+
var preparedStateNotation = '';
|
|
1520
|
+
for (var i = 0; i < stateNotaion.length; i++) {
|
|
1521
|
+
if (!isNaN(parseInt(stateNotaion[i]))) {
|
|
1522
|
+
var dotsCount = parseInt(stateNotaion[i]);
|
|
1523
|
+
for (var dotI = 0; dotI < dotsCount; dotI++) preparedStateNotation += '.';
|
|
1524
|
+
continue;
|
|
1525
|
+
}
|
|
1526
|
+
preparedStateNotation += stateNotaion[i];
|
|
1527
|
+
}
|
|
1528
|
+
gameState.boardState = partFENtoState(preparedStateNotation);
|
|
1529
|
+
gameState.currentColor = currentColor === 'w' ? 'white' : 'black';
|
|
1530
|
+
gameState.boardState = prepareCastlingByFEN(FENcastling, gameState.boardState);
|
|
1531
|
+
if (beatedField !== '-') {
|
|
1532
|
+
var posBeatedCell = getPositionByFEN(beatedField);
|
|
1533
|
+
gameState.boardState[posBeatedCell[0]][posBeatedCell[1]] = _extends({}, gameState.boardState[posBeatedCell[0]][posBeatedCell[1]], {
|
|
1534
|
+
beated: true
|
|
1535
|
+
});
|
|
1536
|
+
}
|
|
1537
|
+
return gameState;
|
|
1538
|
+
};
|
|
1539
|
+
var getBeatedCellFENfromState = function getBeatedCellFENfromState(state) {
|
|
1540
|
+
var beatedFieldFEN = '-';
|
|
1541
|
+
for (var j = 0; j < state.length; j++) {
|
|
1542
|
+
for (var i = 0; i < state[j].length; i++) {
|
|
1543
|
+
if (state[j][i].beated) {
|
|
1544
|
+
beatedFieldFEN = LETTERS[i] + (state.length - j).toString();
|
|
1545
|
+
break;
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1549
|
+
return beatedFieldFEN;
|
|
1550
|
+
};
|
|
1551
|
+
var getFENpositionsFromState = function getFENpositionsFromState(state) {
|
|
1552
|
+
var positionsFEN = '';
|
|
1553
|
+
var emptyCellsCount = 0;
|
|
1554
|
+
state.forEach(function (row, j) {
|
|
1555
|
+
row.forEach(function (cell, i) {
|
|
1556
|
+
if (cell.figure) {
|
|
1557
|
+
if (emptyCellsCount > 0) {
|
|
1558
|
+
positionsFEN += emptyCellsCount.toString();
|
|
1559
|
+
emptyCellsCount = 0;
|
|
1560
|
+
}
|
|
1561
|
+
positionsFEN += FIGURES_LATTERS_NOTATIONS[cell.figure.color][cell.figure.type];
|
|
1562
|
+
} else {
|
|
1563
|
+
emptyCellsCount += 1;
|
|
1564
|
+
}
|
|
1565
|
+
});
|
|
1566
|
+
if (emptyCellsCount > 0) {
|
|
1567
|
+
positionsFEN += emptyCellsCount.toString();
|
|
1568
|
+
emptyCellsCount = 0;
|
|
1569
|
+
}
|
|
1570
|
+
if (j !== state.length - 1) {
|
|
1571
|
+
positionsFEN += '/';
|
|
1572
|
+
}
|
|
1573
|
+
});
|
|
1574
|
+
return positionsFEN;
|
|
1575
|
+
};
|
|
1576
|
+
var getFENcastlingFromState = function getFENcastlingFromState(state) {
|
|
1577
|
+
var whiteCastlingFEN = '';
|
|
1578
|
+
var blackCastlingFEN = '';
|
|
1579
|
+
var stateLastCell = state.length - 1;
|
|
1580
|
+
state.forEach(function (row, j) {
|
|
1581
|
+
return row.forEach(function (cell, i) {
|
|
1582
|
+
if (j === 0 && i === 0) {
|
|
1583
|
+
if (!!cell.figure && cell.figure.type === 'rook' && !cell.figure.touched) {
|
|
1584
|
+
blackCastlingFEN = 'q';
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1587
|
+
if (j === 0 && i === 4) {
|
|
1588
|
+
if (!cell.figure || cell.figure.type !== 'king' || cell.figure.touched) {
|
|
1589
|
+
blackCastlingFEN = '-';
|
|
1590
|
+
}
|
|
1591
|
+
}
|
|
1592
|
+
if (j === 0 && i === stateLastCell) {
|
|
1593
|
+
if (!!cell.figure && cell.figure.type === 'rook' && !cell.figure.touched && blackCastlingFEN !== '-') {
|
|
1594
|
+
blackCastlingFEN = 'k' + blackCastlingFEN;
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
if (j === stateLastCell && i === 0) {
|
|
1598
|
+
if (!!cell.figure && cell.figure.type === 'rook' && !cell.figure.touched) {
|
|
1599
|
+
whiteCastlingFEN = 'Q';
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
if (j === stateLastCell && i === 4) {
|
|
1603
|
+
if (!cell.figure || cell.figure.type !== 'king' || cell.figure.touched) {
|
|
1604
|
+
whiteCastlingFEN = '-';
|
|
1605
|
+
}
|
|
1606
|
+
}
|
|
1607
|
+
if (j === stateLastCell && i === stateLastCell) {
|
|
1608
|
+
if (!!cell.figure && cell.figure.type === 'rook' && !cell.figure.touched && blackCastlingFEN !== '-') {
|
|
1609
|
+
whiteCastlingFEN = 'K' + whiteCastlingFEN;
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1612
|
+
});
|
|
1613
|
+
});
|
|
1614
|
+
if (whiteCastlingFEN === '-' && blackCastlingFEN === '-') return '-';
|
|
1615
|
+
return (whiteCastlingFEN + blackCastlingFEN).replace('-', '');
|
|
1616
|
+
};
|
|
1617
|
+
var stateToFEN = function stateToFEN(state, currentColor, countMoves) {
|
|
1618
|
+
if (countMoves === void 0) {
|
|
1619
|
+
countMoves = 1;
|
|
1620
|
+
}
|
|
1621
|
+
var casttlingFEN = getFENcastlingFromState(state);
|
|
1622
|
+
var positionsFEN = getFENpositionsFromState(state);
|
|
1623
|
+
var colorFEN = currentColor === 'white' ? 'w' : 'b';
|
|
1624
|
+
var beatedFieldFEN = getBeatedCellFENfromState(state);
|
|
1625
|
+
var blackMoves = countMoves === 0 ? 0 : countMoves - 1;
|
|
1626
|
+
return positionsFEN + " " + colorFEN + " " + casttlingFEN + " " + beatedFieldFEN + " " + blackMoves + " " + countMoves;
|
|
1627
|
+
};
|
|
1628
|
+
|
|
1629
|
+
var styles = {"chessBoard":"_3XI6H","figuresLayout":"_2SyRK","controlLayout":"_3OVc8","controlLayoutGrabbing":"_G0IIl","interactiveLayout":"_3THn5","selectedCell":"_3vcXe","controlCell":"_2yJs1","interactiveCell":"_27yHq","possibleMoveMark":"_UYGA_","row":"_2XKSc","cell":"_ssFQn","cellLight":"_1407I","figure":"_19mE-","holdedFigure":"_3u_-s","bluredFigure":"_3SfMJ","hiddenFigure":"_1cIvE","markedCell":"_Zly-L","checkedCell":"_31pmr","arrow":"_12Bbd","arrowEnd":"_1BC3I","figurePicker":"_13OXq","figurePickerItem":"_16zCe","chessBoardFigurePicker":"_1ZGj2"};
|
|
1630
|
+
|
|
1631
|
+
var CHESS_PIECES_MAP = {
|
|
1632
|
+
'pawn-white': function pawnWhite(size) {
|
|
1633
|
+
return React.createElement("svg", {
|
|
1634
|
+
width: size,
|
|
1635
|
+
height: size,
|
|
1636
|
+
viewBox: "0 0 56 56",
|
|
1637
|
+
fill: "none",
|
|
1638
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1639
|
+
}, React.createElement("path", {
|
|
1640
|
+
d: "M37.3492 12.5238C37.3492 15.286 36.1576 17.7735 34.2541 19.5131L39.1587 22.9297V29.1905H34.3573C34.5888 32.0925 36.4757 34.9969 38.9172 37.5303C41.5083 40.2188 44.6258 42.3871 46.6961 43.5546L47 43.726V53H9V43.726L9.30392 43.5546C11.3742 42.3871 14.4917 40.2188 17.0828 37.5303C19.5243 34.9969 21.4112 32.0925 21.6427 29.1905H16.8413V22.9297L21.4091 19.7477C19.351 18.0011 18.0476 15.4127 18.0476 12.5238C18.0476 7.26396 22.3684 3 27.6984 3C33.0284 3 37.3492 7.26396 37.3492 12.5238Z",
|
|
1641
|
+
fill: "white"
|
|
1642
|
+
}), React.createElement("path", {
|
|
1643
|
+
"fill-rule": "evenodd",
|
|
1644
|
+
"clip-rule": "evenodd",
|
|
1645
|
+
d: "M31.8338 19.6768C31.7847 18.906 32.0841 18.155 32.6449 17.6425C34.0658 16.344 34.9237 14.522 34.9237 12.5238C34.9237 8.74601 31.7893 5.5 27.6984 5.5C23.6075 5.5 20.4732 8.74601 20.4732 12.5238C20.4732 14.6125 21.4113 16.5112 22.9509 17.8177C23.5415 18.319 23.8681 19.0781 23.8319 19.8658C23.7958 20.6535 23.4012 21.3775 22.7673 21.819L19.2668 24.2575V26.6905H21.6427C22.3206 26.6905 22.9675 26.9828 23.4267 27.4967C23.886 28.0106 24.1157 28.6991 24.0601 29.3954C23.757 33.1938 21.3675 36.6318 18.8036 39.2921C16.3921 41.7943 13.5841 43.8574 11.4255 45.1831V50.5H44.5745V45.1831C42.4159 43.8574 39.6079 41.7943 37.1964 39.2921C34.6325 36.6318 32.243 33.1938 31.9399 29.3954C31.8843 28.6991 32.114 28.0106 32.5733 27.4967C33.0325 26.9828 33.6794 26.6905 34.3573 26.6905H36.7332V24.2575L32.8959 21.5844C32.2749 21.1519 31.8828 20.4477 31.8338 19.6768ZM39.1587 22.9297V29.1905H34.3573C34.424 30.0266 34.6281 30.8629 34.9433 31.6905C35.7221 33.7353 37.1791 35.7268 38.9172 37.5303C41.5083 40.2188 44.6258 42.3871 46.6961 43.5546L47 43.726V53H9V43.726L9.30392 43.5546C11.3742 42.3871 14.4917 40.2188 17.0828 37.5303C18.8209 35.7268 20.2779 33.7353 21.0567 31.6905C21.3719 30.8629 21.576 30.0266 21.6427 29.1905H16.8413V22.9297L21.4091 19.7477C20.7719 19.207 20.207 18.5855 19.7308 17.8994C18.6689 16.3695 18.0476 14.5183 18.0476 12.5238C18.0476 7.26396 22.3684 3 27.6984 3C33.0284 3 37.3492 7.26396 37.3492 12.5238C37.3492 14.3952 36.8023 16.1405 35.8575 17.6126C35.4078 18.3133 34.868 18.9521 34.2541 19.5131L39.1587 22.9297Z",
|
|
1646
|
+
fill: "#3E3F4F"
|
|
1647
|
+
}));
|
|
1648
|
+
},
|
|
1649
|
+
'knigts-white': function knigtsWhite(size) {
|
|
1650
|
+
return React.createElement("svg", {
|
|
1651
|
+
width: size,
|
|
1652
|
+
height: size,
|
|
1653
|
+
viewBox: "0 0 56 56",
|
|
1654
|
+
fill: "none",
|
|
1655
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1656
|
+
}, React.createElement("path", {
|
|
1657
|
+
"fill-rule": "evenodd",
|
|
1658
|
+
"clip-rule": "evenodd",
|
|
1659
|
+
d: "M32.9167 12.8482L25.1852 4.08704C24.066 6.15131 22.981 9.79459 24.5409 12.4247C23.7838 12.4902 23.0602 12.6146 22.5005 12.8328C18.9299 14.225 15.012 17.8218 13.0863 25.3052C12.5287 27.4722 11.5252 28.5098 10.3324 29.7432C9.2073 30.9065 7.91384 32.244 6.66755 34.8675C4.10004 40.2722 11.0292 45.6769 16.0818 40.768C18.9224 38.0082 21.4054 36.8689 23.49 35.9123C26.4905 34.5356 28.6657 33.5374 29.8944 28.6312C30.479 30.9197 30.2452 36.3207 24.6331 39.6161C19.0211 42.9116 17.8519 49.8534 17.9688 51.9131H49.8874C49.8874 32.359 47.2227 15.4643 32.9167 12.8482Z",
|
|
1660
|
+
fill: "white"
|
|
1661
|
+
}), React.createElement("path", {
|
|
1662
|
+
"fill-rule": "evenodd",
|
|
1663
|
+
"clip-rule": "evenodd",
|
|
1664
|
+
d: "M25.0604 3.00684C25.4257 2.96664 25.7878 3.10529 26.0279 3.37731L33.5087 11.8544C40.9503 13.3628 45.3275 18.5751 47.8193 25.6764C50.3374 32.853 51 42.1196 51 51.913C51 52.5133 50.5018 53 49.8871 53H17.9686C17.3779 53 16.8901 52.5493 16.8574 51.9732C16.7889 50.7648 17.0879 48.3569 18.1183 45.8263C19.1555 43.279 20.9809 40.4923 24.0595 38.6845C26.1617 37.4501 27.4243 35.8968 28.1465 34.3608C28.1439 34.3633 28.1412 34.3659 28.1385 34.3685C26.9293 35.5354 25.4847 36.198 24.0415 36.86L23.963 36.896C21.9061 37.8398 19.5666 38.9151 16.8664 41.5386C13.9475 44.3745 10.348 44.2838 7.87371 42.5723C5.44537 40.8925 4.12188 37.6432 5.65784 34.4099C6.98024 31.6262 8.37192 30.1871 9.5232 28.9967C10.6946 27.7855 11.5232 26.9197 12.0068 25.0402C14.0037 17.28 18.1294 13.3666 22.0877 11.8232C22.3618 11.7164 22.6569 11.6305 22.9621 11.5613C22.5948 10.3424 22.5869 9.0646 22.7562 7.89187C22.9933 6.24878 23.5924 4.7017 24.2015 3.5783C24.3735 3.26093 24.695 3.04705 25.0604 3.00684ZM25.4952 6.10342C25.259 6.75438 25.0651 7.46829 24.9601 8.19533C24.764 9.5541 24.8927 10.8497 25.5037 11.8797C25.6943 12.2012 25.7037 12.5955 25.5285 12.9253C25.3533 13.255 25.0178 13.4745 24.6389 13.5073C23.9231 13.5692 23.3246 13.6817 22.9129 13.8422C19.7299 15.0832 16.0198 18.3634 14.1654 25.5701C13.537 28.0123 12.367 29.2221 11.1592 30.4709L11.1412 30.4895C10.0423 31.6257 8.84692 32.8618 7.67682 35.3249C6.64528 37.4963 7.50259 39.6517 9.16009 40.7983C10.7717 41.913 13.163 42.0703 15.2967 39.9973C18.2743 37.1045 20.898 35.9006 23.0092 34.9318L23.0166 34.9284C24.5479 34.2258 25.6605 33.7038 26.5743 32.822C27.4586 31.9686 28.2317 30.6948 28.8132 28.3729C28.9348 27.8873 29.3798 27.5454 29.8916 27.5442C30.4035 27.5431 30.8501 27.883 30.974 28.368C31.6414 30.9807 31.3516 36.9391 25.2063 40.5476C22.6729 42.0353 21.1077 44.3672 20.1865 46.6297C19.5273 48.2485 19.2218 49.7734 19.1174 50.8261H48.7714C48.722 41.4882 48.0155 32.9409 45.7138 26.3812C43.3397 19.6151 39.3401 15.1286 32.7117 13.9165C32.4634 13.8711 32.2384 13.7446 32.0735 13.5578L25.4952 6.10342Z",
|
|
1665
|
+
fill: "#3E3F4F"
|
|
1666
|
+
}), React.createElement("path", {
|
|
1667
|
+
d: "M23.9202 21.4782C23.9202 22.6789 22.9237 23.6521 21.6945 23.6521C20.4652 23.6521 19.4688 22.6789 19.4688 21.4782C19.4688 20.2776 20.4652 19.3043 21.6945 19.3043C22.9237 19.3043 23.9202 20.2776 23.9202 21.4782Z",
|
|
1668
|
+
fill: "#3E3F4F"
|
|
1669
|
+
}));
|
|
1670
|
+
},
|
|
1671
|
+
'bishop-white': function bishopWhite(size) {
|
|
1672
|
+
return React.createElement("svg", {
|
|
1673
|
+
width: size,
|
|
1674
|
+
height: size,
|
|
1675
|
+
viewBox: "0 0 56 56",
|
|
1676
|
+
fill: "none",
|
|
1677
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1678
|
+
}, React.createElement("path", {
|
|
1679
|
+
d: "M29.8545 30.4038H26.0727C26.0727 23.7267 28.1789 17.0608 32.8385 12.1815C33.5687 11.2259 34 10.046 34 8.76923C34 5.58296 31.3137 3 28 3C24.6863 3 22 5.58296 22 8.76923C22 10.3412 22.6539 11.7664 23.7144 12.807C19.9664 15.3761 13 22.2626 13 30.8846C13 39.5857 20.0948 43.1084 23.8167 43.8315L10 46.1818V53L46 53V46.1818L31.8556 43.7965C35.6197 42.9999 42.5 39.4532 42.5 30.8846C42.5 25.2741 39.7818 20.2727 36.4727 16.6364C32.8385 19.3636 29.8545 25.7273 29.8545 30.4038Z",
|
|
1680
|
+
fill: "white"
|
|
1681
|
+
}), React.createElement("path", {
|
|
1682
|
+
"fill-rule": "evenodd",
|
|
1683
|
+
"clip-rule": "evenodd",
|
|
1684
|
+
d: "M28 5.27273C25.4418 5.27273 23.4694 7.28575 23.4694 9.64336C23.4694 10.8145 23.9467 11.8863 24.7431 12.6809C24.9818 12.919 25.1036 13.2554 25.0746 13.5966C25.0457 13.9377 24.8691 14.2472 24.594 14.439C22.9307 15.5983 20.5141 17.7636 18.5232 20.6218C16.5325 23.4797 15.0204 26.9522 15.0204 30.7535C15.0204 34.5515 16.5284 37.1728 18.4256 38.9466C20.3531 40.7487 22.6967 41.683 24.2802 41.9959C24.8042 42.0994 25.181 42.575 25.1748 43.1251C25.1687 43.6751 24.7813 44.1416 24.2552 44.2326L12.2041 46.317V50.7273L43.7959 50.7273V46.3184L31.4388 44.1995C30.9156 44.1098 30.5286 43.6485 30.5178 43.1018C30.5069 42.555 30.8753 42.0778 31.3944 41.9661C34.7008 41.2546 40.5102 38.1436 40.5102 30.7535C40.5102 26.1643 38.4904 21.9735 35.8369 18.7327C34.6056 19.9172 33.4539 21.6155 32.5602 23.5208C31.4833 25.8165 30.843 28.2803 30.843 30.2946C30.843 30.9222 30.3496 31.4309 29.741 31.4309H26.1907C25.5821 31.4309 25.0887 30.9222 25.0887 30.2946C25.0887 23.7121 27.1242 17.0654 31.7054 12.1582C32.2285 11.4429 32.5306 10.5762 32.5306 9.64336C32.5306 7.28575 30.5582 5.27273 28 5.27273ZM21.2653 9.64336C21.2653 5.91808 24.3365 3 28 3C31.6635 3 34.7347 5.91808 34.7347 9.64336C34.7347 11.1277 34.2402 12.4962 33.4134 13.5965C33.3886 13.6295 33.3621 13.6611 33.3339 13.6911C29.4537 17.8225 27.5365 23.4098 27.3146 29.1582H28.6902C28.8791 27.0011 29.5778 24.6592 30.576 22.5311C31.751 20.0265 33.4032 17.6856 35.2985 16.2394C35.7507 15.8944 36.3823 15.9559 36.7639 16.3822C39.9902 19.9872 42.7143 25.0235 42.7143 30.7535C42.7143 37.0527 39.2071 40.7331 35.8163 42.6462L45.0787 44.2344C45.6103 44.3255 46 44.7997 46 45.3554V51.8636C46 52.165 45.8839 52.4541 45.6772 52.6672C45.4705 52.8803 45.1902 53 44.898 53L11.102 53C10.4934 53 10 52.4912 10 51.8636V45.3554C10 44.8003 10.3889 44.3265 10.9197 44.2347L19.799 42.6989C18.8291 42.1599 17.8509 41.4771 16.9451 40.6303C14.6386 38.4738 12.8163 35.2611 12.8163 30.7535C12.8163 26.3247 14.5742 22.3954 16.7331 19.296C18.5307 16.7151 20.6432 14.6555 22.3709 13.2919C21.675 12.2488 21.2653 10.9955 21.2653 9.64336Z",
|
|
1685
|
+
fill: "#3E3F4F"
|
|
1686
|
+
}));
|
|
1687
|
+
},
|
|
1688
|
+
'rook-white': function rookWhite(size) {
|
|
1689
|
+
return React.createElement("svg", {
|
|
1690
|
+
width: size,
|
|
1691
|
+
height: size,
|
|
1692
|
+
viewBox: "0 0 56 56",
|
|
1693
|
+
fill: "none",
|
|
1694
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1695
|
+
}, React.createElement("path", {
|
|
1696
|
+
d: "M9 5H18.7436V10.434H22.641V5H33.359V10.434H37.2564V5H47V13.1509L39.2051 18.5849L41.1538 36H14.8462L16.7949 18.5849L9 13.1509V5Z",
|
|
1697
|
+
fill: "white"
|
|
1698
|
+
}), React.createElement("path", {
|
|
1699
|
+
d: "M14.8462 39H41.1538L47 45.7547V53H9V45.7547L14.8462 39Z",
|
|
1700
|
+
fill: "white"
|
|
1701
|
+
}), React.createElement("path", {
|
|
1702
|
+
"fill-rule": "evenodd",
|
|
1703
|
+
"clip-rule": "evenodd",
|
|
1704
|
+
d: "M18.7436 12.834C17.404 12.834 16.3181 11.7594 16.3181 10.434V7.4H11.4255V11.906L18.1919 16.6229C18.9198 17.1304 19.3082 17.9918 19.2036 18.8668L17.5 33.5H38.5L36.7964 18.8668C36.6918 17.9918 37.0802 17.1304 37.8081 16.6229L44.5745 11.906V7.4H39.6819V10.434C39.6819 11.7594 38.596 12.834 37.2564 12.834H33.359C32.0194 12.834 30.9334 11.7594 30.9334 10.434V7.4H25.0666V10.434C25.0666 11.7594 23.9806 12.834 22.641 12.834H18.7436ZM22.641 5H33.359V10.434H37.2564V5H47V13.1509L39.2051 18.5849L41.1538 36H14.8462L16.7949 18.5849L9 13.1509V5H18.7436V10.434H22.641V5ZM16 41.5L11.4255 46.5953V50.6H44.5745V46.5953L40 41.5H16ZM41.1538 39H14.8462L9 45.7547V53H47V45.7547L41.1538 39Z",
|
|
1705
|
+
fill: "#3E3F4F"
|
|
1706
|
+
}));
|
|
1707
|
+
},
|
|
1708
|
+
'queen-white': function queenWhite(size) {
|
|
1709
|
+
return React.createElement("svg", {
|
|
1710
|
+
width: size,
|
|
1711
|
+
height: size,
|
|
1712
|
+
viewBox: "0 0 56 56",
|
|
1713
|
+
fill: "none",
|
|
1714
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1715
|
+
}, React.createElement("path", {
|
|
1716
|
+
d: "M21.9569 11.4809C23.5293 10.8482 24.6452 9.25337 24.6452 7.38596C24.6452 4.96366 22.7676 3 20.4516 3C18.1356 3 16.2581 4.96366 16.2581 7.38596C16.2581 9.62443 17.8614 11.4712 19.9325 11.7387L18.0624 27.5614L9.04701 19.372C9.87134 18.5711 10.3871 17.4275 10.3871 16.1579C10.3871 13.7356 8.50958 11.7719 6.19355 11.7719C3.87752 11.7719 2 13.7356 2 16.1579C2 18.5802 3.87752 20.5439 6.19355 20.5439C6.60125 20.5439 6.99537 20.483 7.36805 20.3695L12.0645 37.2105L16.9212 45.5224L12.0645 46.421V53L44 53V46.421L39.081 45.5187L43.9355 37.2105L48.632 20.3695C49.0046 20.483 49.3987 20.5439 49.8064 20.5439C52.1225 20.5439 54 18.5802 54 16.1579C54 13.7356 52.1225 11.7719 49.8064 11.7719C47.4904 11.7719 45.6129 13.7356 45.6129 16.1579C45.6129 17.4275 46.1287 18.5711 46.953 19.372L37.9376 27.5614L36.0675 11.7387C38.1386 11.4712 39.7419 9.62443 39.7419 7.38596C39.7419 4.96366 37.8644 3 35.5484 3C33.2324 3 31.3548 4.96366 31.3548 7.38596C31.3548 9.25337 32.4707 10.8482 34.0431 11.4809L28 25.807L21.9569 11.4809Z",
|
|
1717
|
+
fill: "white"
|
|
1718
|
+
}), React.createElement("path", {
|
|
1719
|
+
"fill-rule": "evenodd",
|
|
1720
|
+
"clip-rule": "evenodd",
|
|
1721
|
+
d: "M20.6997 9.60433C20.8359 9.50943 20.9831 9.42951 21.139 9.36676C21.8633 9.07534 22.4166 8.31673 22.4166 7.38596C22.4166 6.16443 21.4841 5.27273 20.4516 5.27273C19.4191 5.27273 18.4866 6.16443 18.4866 7.38596C18.4866 8.50989 19.2842 9.36408 20.2124 9.48393C20.3823 9.50587 20.5454 9.54678 20.6997 9.60433ZM19.9325 11.7387C19.8677 11.7303 19.8034 11.7204 19.7396 11.709C17.7627 11.3553 16.2581 9.55443 16.2581 7.38596C16.2581 4.96366 18.1356 3 20.4516 3C22.7676 3 24.6452 4.96366 24.6452 7.38596C24.6452 9.16107 23.6369 10.6899 22.1867 11.3801C22.1702 11.3879 22.1538 11.3956 22.1372 11.4032C22.0778 11.4305 22.0177 11.4564 21.9569 11.4809L28 25.807L34.0431 11.4809C33.9823 11.4564 33.9222 11.4305 33.8628 11.4032C33.8462 11.3956 33.8298 11.3879 33.8134 11.3801C32.3631 10.6899 31.3548 9.16108 31.3548 7.38596C31.3548 4.96366 33.2324 3 35.5484 3C37.8644 3 39.7419 4.96366 39.7419 7.38596C39.7419 9.55443 38.2373 11.3553 36.2604 11.709C36.1966 11.7204 36.1323 11.7303 36.0675 11.7387L37.9376 27.5614L46.953 19.372C46.8819 19.3029 46.8132 19.2313 46.7468 19.1573C46.6555 19.0555 46.5688 18.9491 46.487 18.8384C45.939 18.0972 45.6129 17.1674 45.6129 16.1579C45.6129 13.7356 47.4904 11.7719 49.8064 11.7719C52.1225 11.7719 54 13.7356 54 16.1579C54 18.5802 52.1225 20.5439 49.8064 20.5439C49.5014 20.5439 49.204 20.5098 48.9175 20.4451C48.8561 20.4313 48.7952 20.416 48.7349 20.3994C48.7004 20.3899 48.6661 20.3799 48.632 20.3695L43.9355 37.2105L39.081 45.5187L44 46.421V53L12.0645 53V46.421L16.9212 45.5224L12.0645 37.2105L7.36805 20.3695C7.33392 20.3799 7.29961 20.3899 7.26513 20.3994C7.20478 20.416 7.1439 20.4313 7.08252 20.4451C6.79599 20.5098 6.49857 20.5439 6.19355 20.5439C3.87752 20.5439 2 18.5802 2 16.1579C2 13.7356 3.87752 11.7719 6.19355 11.7719C8.50958 11.7719 10.3871 13.7356 10.3871 16.1579C10.3871 17.1674 10.061 18.0972 9.51303 18.8384C9.43124 18.9491 9.34451 19.0555 9.25318 19.1573C9.18684 19.2313 9.11807 19.3029 9.04701 19.372L18.0624 27.5614L19.9325 11.7387ZM10.6656 23.8859L16.5801 29.2585C17.1997 29.8213 18.0746 29.9865 18.8507 29.6872C19.6269 29.3878 20.1756 28.6735 20.2749 27.8334L21.6218 16.4377L25.9528 26.7051C26.3047 27.5392 27.1096 28.0797 28 28.0797C28.8904 28.0797 29.6953 27.5392 30.0472 26.7051L34.3782 16.4377L35.7251 27.8334C35.8244 28.6735 36.3731 29.3878 37.1493 29.6872C37.9254 29.9865 38.8003 29.8213 39.4199 29.2585L45.3344 23.8859L41.8717 36.3027L37.1665 44.3554C36.7923 44.9959 36.7499 45.783 37.0532 46.4615C37.3565 47.14 37.9668 47.6236 38.6865 47.7556L41.7714 48.3215V50.7273L14.2931 50.7273V48.3185L17.319 47.7587C18.0379 47.6257 18.6471 47.1418 18.9497 46.4636C19.2522 45.7854 19.2096 44.9991 18.8356 44.3591L14.1283 36.3027L10.6656 23.8859ZM7.19788 18.1034C7.28739 17.9677 7.39172 17.8412 7.50978 17.7265C7.90424 17.3432 8.15853 16.7895 8.15853 16.1579C8.15853 14.9364 7.22608 14.0447 6.19355 14.0447C5.16102 14.0447 4.22857 14.9364 4.22857 16.1579C4.22857 17.3794 5.16102 18.2711 6.19355 18.2711C6.38265 18.2711 6.56206 18.2431 6.73038 18.1918C6.88389 18.1451 7.04061 18.1157 7.19788 18.1034ZM48.8021 18.1034C48.9594 18.1157 49.1161 18.1451 49.2696 18.1918C49.4379 18.2431 49.6174 18.2711 49.8064 18.2711C50.839 18.2711 51.7714 17.3794 51.7714 16.1579C51.7714 14.9364 50.839 14.0447 49.8064 14.0447C48.7739 14.0447 47.8415 14.9364 47.8415 16.1579C47.8415 16.7895 48.0958 17.3432 48.4902 17.7265C48.6083 17.8412 48.7126 17.9677 48.8021 18.1034ZM35.3003 9.60433C35.4546 9.54678 35.6177 9.50587 35.7876 9.48393C36.7158 9.36408 37.5134 8.50989 37.5134 7.38596C37.5134 6.16443 36.5809 5.27273 35.5484 5.27273C34.5159 5.27273 33.5834 6.16443 33.5834 7.38596C33.5834 8.31673 34.1367 9.07534 34.861 9.36676C35.0169 9.42951 35.1641 9.50943 35.3003 9.60433Z",
|
|
1722
|
+
fill: "#3E3F4F"
|
|
1723
|
+
}));
|
|
1724
|
+
},
|
|
1725
|
+
'king-white': function kingWhite(size) {
|
|
1726
|
+
return React.createElement("svg", {
|
|
1727
|
+
width: size,
|
|
1728
|
+
height: size,
|
|
1729
|
+
viewBox: "0 0 56 56",
|
|
1730
|
+
fill: "none",
|
|
1731
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1732
|
+
}, React.createElement("path", {
|
|
1733
|
+
"fill-rule": "evenodd",
|
|
1734
|
+
"clip-rule": "evenodd",
|
|
1735
|
+
d: "M25.4055 3H30.5945L30.7296 7.31034H35.7835V12.4828H30.8918L31.1294 18.3388C31.2242 18.2274 31.3219 18.1182 31.4225 18.0116C36.1472 13.0061 43.1524 10.3424 48.3235 14.6379C53.5125 18.9483 53.5125 28.8621 46.3679 34.5958C42.3207 37.8438 38.6956 40.9749 38.8743 45.5544L46.1437 46.5345V53H9.85632V46.5345L17.1257 45.5544C17.3044 40.9749 13.6793 37.8438 9.6321 34.5958C2.4875 28.8621 2.4875 18.9483 7.67648 14.6379C12.8476 10.3424 19.8528 13.0061 24.5775 18.0116C24.6781 18.1182 24.7758 18.2274 24.8706 18.3388L25.1082 12.4828H20.2165V7.31034H25.2704L25.4055 3ZM20.5175 22.8044C23.6886 27.982 24.1083 34.0345 24.1083 36.6666C22.5188 36.6694 16.527 34.0418 13.3546 29.7281C11.0708 26.6226 10.4753 22.0151 12.433 20.2263C14.3908 18.4375 18.5356 19.5685 20.5175 22.8044ZM35.4825 22.8044C32.3114 27.982 31.8917 34.0345 31.8917 36.6666C33.4812 36.6694 39.473 34.0418 42.6454 29.7281C44.9292 26.6226 45.5248 22.0151 43.567 20.2263C41.6092 18.4375 37.4644 19.5685 35.4825 22.8044Z",
|
|
1736
|
+
fill: "white"
|
|
1737
|
+
}), React.createElement("path", {
|
|
1738
|
+
"fill-rule": "evenodd",
|
|
1739
|
+
"clip-rule": "evenodd",
|
|
1740
|
+
d: "M24.4333 4.05309C24.4517 3.46625 24.9344 3 25.5236 3H30.4764C31.0656 3 31.5483 3.46625 31.5667 4.05309L31.6627 7.12294H35.4291C36.0316 7.12294 36.52 7.60959 36.52 8.20989V13.1574C36.52 13.2013 36.5173 13.2446 36.5123 13.2871C37.2951 12.9327 38.0953 12.6474 38.9042 12.4427C42.0378 11.6496 45.3184 12.0711 48.0977 14.3847C53.6752 19.0278 53.4681 29.323 46.2168 35.1549C44.2754 36.7163 42.5402 38.17 41.3011 39.7435C40.2848 41.0341 39.6388 42.3604 39.4947 43.845L45.4642 44.6515C46.0051 44.7246 46.4085 45.1848 46.4085 45.7286V51.913C46.4085 52.5134 45.9201 53 45.3177 53H10.6823C10.0799 53 9.59149 52.5134 9.59149 51.913V45.7286C9.59149 45.1848 9.9949 44.7246 10.5358 44.6515L16.5053 43.845C16.3612 42.3604 15.7152 41.0341 14.6989 39.7435C13.4598 38.17 11.7246 36.7163 9.78319 35.1549L10.4085 34.3829L9.78319 35.1549C2.5319 29.323 2.32478 19.0278 7.90235 14.3847L8.60171 15.2189L7.90235 14.3847C10.6816 12.0711 13.9622 11.6496 17.0958 12.4427C17.9047 12.6474 18.7049 12.9327 19.4877 13.2871C19.4827 13.2446 19.48 13.2013 19.48 13.1574V8.20989C19.48 7.60959 19.9684 7.12294 20.5709 7.12294H24.3373L24.4333 4.05309ZM21.2957 14.2444C22.2495 14.8239 23.1645 15.5005 24.0229 16.2506L24.1041 14.2444H21.2957ZM23.9379 19.1897C21.7887 16.9079 19.1629 15.2087 16.5588 14.5497C13.9879 13.899 11.4575 14.2579 9.30107 16.0531C4.97314 19.6559 4.76602 28.3262 11.1534 33.4632C13.0749 35.0086 15.0012 36.6058 16.4153 38.4015C17.8503 40.224 18.8089 42.3135 18.7108 44.8333C18.6903 45.3608 18.2923 45.7974 17.7674 45.8683L11.7731 46.6782V50.8261H44.2269V46.6782L38.2327 45.8683C37.7077 45.7974 37.3097 45.3608 37.2892 44.8333C37.1911 42.3135 38.1497 40.224 39.5847 38.4015C40.9988 36.6058 42.9251 35.0086 44.8466 33.4632C51.234 28.3262 51.0269 19.6559 46.6989 16.0531C44.5425 14.2579 42.0121 13.899 39.4412 14.5497C36.8371 15.2087 34.2113 16.9079 32.0621 19.1897C31.9794 19.2776 31.8985 19.3682 31.8194 19.4612C31.5289 19.8031 31.0575 19.9324 30.6323 19.7867C30.2071 19.6411 29.9151 19.2503 29.897 18.8026L29.6702 13.2012C29.6582 12.9056 29.7677 12.6179 29.9734 12.4045C30.1791 12.1911 30.4632 12.0705 30.7601 12.0705H34.3383V9.29685H30.6054C30.0161 9.29685 29.5334 8.8306 29.5151 8.24376L29.419 5.17391H26.581L26.4849 8.24376C26.4666 8.8306 25.9839 9.29685 25.3946 9.29685H21.6617V12.0705H25.2399C25.5368 12.0705 25.8209 12.1911 26.0266 12.4045C26.2323 12.6179 26.3418 12.9056 26.3298 13.2012L26.103 18.8026C26.0849 19.2503 25.7929 19.6411 25.3677 19.7867C24.9425 19.9324 24.4711 19.8031 24.1806 19.4612C24.1015 19.3682 24.0207 19.2776 23.9379 19.1898M31.9771 16.2506C32.8355 15.5005 33.7505 14.8239 34.7042 14.2444H31.8959L31.9771 16.2506ZM17.3096 18.9553C19.0173 19.4744 20.7009 20.6833 21.7898 22.465C24.9721 27.672 25.3763 33.7022 25.3763 36.2898C25.3763 36.8893 24.8891 37.3756 24.2874 37.3767C23.6967 37.3778 22.8967 37.1574 22.0822 36.8511C21.2259 36.529 20.2214 36.0603 19.1766 35.4622C17.0987 34.2726 14.7747 32.521 13.1408 30.2946C11.9357 28.6523 11.1798 26.6258 10.9787 24.7519C10.7832 22.9302 11.0918 20.9651 12.4037 19.7639L13.1417 20.5643L12.4037 19.7639C13.7217 18.5571 15.6305 18.4449 17.3096 18.9553ZM16.673 21.0346C15.434 20.658 14.4305 20.8605 13.8798 21.3646C13.323 21.8745 12.9814 22.9684 13.148 24.5208C13.3089 26.0208 13.9272 27.6832 14.9019 29.0114C16.296 30.9111 18.3454 32.4792 20.2634 33.5772C21.2164 34.1228 22.1154 34.5399 22.8527 34.8172C22.9599 34.8576 23.0615 34.8941 23.1574 34.9271C23.0096 32.1253 22.348 27.558 19.9265 23.5957C19.1237 22.2821 17.8834 21.4025 16.673 21.0346ZM39.327 21.0346C38.1166 21.4025 36.8763 22.2821 36.0735 23.5957C33.652 27.558 32.9904 32.1253 32.8426 34.9271C32.9385 34.8941 33.0401 34.8576 33.1473 34.8172C33.8846 34.5399 34.7836 34.1228 35.7366 33.5772C37.6546 32.4792 39.704 30.9111 41.0981 29.0114C42.0728 27.6832 42.6911 26.0208 42.852 24.5208C43.0186 22.9684 42.677 21.8745 42.1202 21.3646C41.5695 20.8605 40.566 20.658 39.327 21.0346ZM38.6904 18.9553C40.3695 18.4449 42.2783 18.5571 43.5963 19.7639C44.9082 20.9651 45.2168 22.9302 45.0213 24.7519C44.8202 26.6258 44.0643 28.6523 42.8592 30.2946C41.2253 32.521 38.9013 34.2726 36.8234 35.4622C35.7786 36.0603 34.7741 36.529 33.9178 36.8511C33.1033 37.1574 32.3033 37.3778 31.7126 37.3767C31.1109 37.3756 30.6237 36.8893 30.6237 36.2898C30.6237 33.7022 31.0279 27.672 34.2102 22.465C35.2991 20.6833 36.9827 19.4744 38.6904 18.9553Z",
|
|
1741
|
+
fill: "#3E3F4F"
|
|
1742
|
+
}));
|
|
1743
|
+
},
|
|
1744
|
+
'pawn-black': function pawnBlack(size) {
|
|
1745
|
+
return React.createElement("svg", {
|
|
1746
|
+
width: size,
|
|
1747
|
+
height: size,
|
|
1748
|
+
viewBox: "0 0 56 56",
|
|
1749
|
+
fill: "none",
|
|
1750
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1751
|
+
}, React.createElement("path", {
|
|
1752
|
+
d: "M37.3492 12.5238C37.3492 15.286 36.1576 17.7735 34.2541 19.5131L39.1587 22.9297V29.1905H34.3573C34.5888 32.0925 36.4757 34.9969 38.9172 37.5303C41.5083 40.2188 44.6258 42.3871 46.6961 43.5546L47 43.726V53H9V43.726L9.30392 43.5546C11.3742 42.3871 14.4917 40.2188 17.0828 37.5303C19.5243 34.9969 21.4112 32.0925 21.6427 29.1905H16.8413V22.9297L21.4091 19.7477C19.351 18.0011 18.0476 15.4127 18.0476 12.5238C18.0476 7.26396 22.3684 3 27.6984 3C33.0284 3 37.3492 7.26396 37.3492 12.5238Z",
|
|
1753
|
+
fill: "#2A2B37"
|
|
1754
|
+
}));
|
|
1755
|
+
},
|
|
1756
|
+
'knigts-black': function knigtsBlack(size) {
|
|
1757
|
+
return React.createElement("svg", {
|
|
1758
|
+
width: size,
|
|
1759
|
+
height: size,
|
|
1760
|
+
viewBox: "0 0 56 56",
|
|
1761
|
+
fill: "none",
|
|
1762
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1763
|
+
}, React.createElement("path", {
|
|
1764
|
+
"fill-rule": "evenodd",
|
|
1765
|
+
"clip-rule": "evenodd",
|
|
1766
|
+
d: "M33.1658 12.1594L25.0408 3C23.8647 5.1581 22.7245 8.96699 24.3638 11.7166C23.5681 11.7851 22.8078 11.9152 22.2196 12.1433C18.4672 13.5988 14.35 17.3591 12.3263 25.1827C11.7404 27.4481 10.6857 28.5329 9.43229 29.8223C8.24992 31.0386 6.89064 32.4368 5.58093 35.1795C2.88277 40.8299 10.1645 46.4803 15.4742 41.3483C18.4594 38.463 21.0687 37.2719 23.2594 36.2719C26.4125 34.8325 28.6985 33.7891 29.9897 28.6598C30.6041 31.0524 30.3583 36.6988 24.4607 40.1441C18.5631 43.5893 17.3344 50.8467 17.4573 53H51C51 32.5571 48.1997 14.8944 33.1658 12.1594Z",
|
|
1767
|
+
fill: "#2A2B37"
|
|
1768
|
+
}), React.createElement("ellipse", {
|
|
1769
|
+
cx: "21.3721",
|
|
1770
|
+
cy: "21.1814",
|
|
1771
|
+
rx: "2.33898",
|
|
1772
|
+
ry: "2.27273",
|
|
1773
|
+
fill: "white"
|
|
1774
|
+
}));
|
|
1775
|
+
},
|
|
1776
|
+
'bishop-black': function bishopBlack(size) {
|
|
1777
|
+
return React.createElement("svg", {
|
|
1778
|
+
width: size,
|
|
1779
|
+
height: size,
|
|
1780
|
+
viewBox: "0 0 56 56",
|
|
1781
|
+
fill: "none",
|
|
1782
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1783
|
+
}, React.createElement("path", {
|
|
1784
|
+
d: "M29.8545 30.4038H26.0727C26.0727 23.7267 28.1789 17.0608 32.8385 12.1815C33.5687 11.2259 34 10.046 34 8.76923C34 5.58296 31.3137 3 28 3C24.6863 3 22 5.58296 22 8.76923C22 10.3412 22.6539 11.7664 23.7144 12.807C19.9664 15.3761 13 22.2626 13 30.8846C13 39.5857 20.0948 43.1084 23.8167 43.8315L10 46.1818V53L46 53V46.1818L31.8556 43.7965C35.6197 42.9999 42.5 39.4532 42.5 30.8846C42.5 25.2741 39.7818 20.2727 36.4727 16.6364C32.8385 19.3636 29.8545 25.7273 29.8545 30.4038Z",
|
|
1785
|
+
fill: "#2A2B37"
|
|
1786
|
+
}));
|
|
1787
|
+
},
|
|
1788
|
+
'rook-black': function rookBlack(size) {
|
|
1789
|
+
return React.createElement("svg", {
|
|
1790
|
+
width: size,
|
|
1791
|
+
height: size,
|
|
1792
|
+
viewBox: "0 0 56 56",
|
|
1793
|
+
fill: "none",
|
|
1794
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1795
|
+
}, React.createElement("path", {
|
|
1796
|
+
d: "M9 5H18.7436V10.434H22.641V5H33.359V10.434H37.2564V5H47V13.1509L39.2051 18.5849L41.1538 36H14.8462L16.7949 18.5849L9 13.1509V5Z",
|
|
1797
|
+
fill: "#2A2B37"
|
|
1798
|
+
}), React.createElement("path", {
|
|
1799
|
+
d: "M14.8462 39H41.1538L47 45.7547V53H9V45.7547L14.8462 39Z",
|
|
1800
|
+
fill: "#2A2B37"
|
|
1801
|
+
}));
|
|
1802
|
+
},
|
|
1803
|
+
'queen-black': function queenBlack(size) {
|
|
1804
|
+
return React.createElement("svg", {
|
|
1805
|
+
width: size,
|
|
1806
|
+
height: size,
|
|
1807
|
+
viewBox: "0 0 56 56",
|
|
1808
|
+
fill: "none",
|
|
1809
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1810
|
+
}, React.createElement("path", {
|
|
1811
|
+
d: "M21.9569 11.4809C23.5293 10.8482 24.6452 9.25337 24.6452 7.38596C24.6452 4.96366 22.7676 3 20.4516 3C18.1356 3 16.2581 4.96366 16.2581 7.38596C16.2581 9.62443 17.8614 11.4712 19.9325 11.7387L18.0624 27.5614L9.04701 19.372C9.87134 18.5711 10.3871 17.4275 10.3871 16.1579C10.3871 13.7356 8.50958 11.7719 6.19355 11.7719C3.87752 11.7719 2 13.7356 2 16.1579C2 18.5802 3.87752 20.5439 6.19355 20.5439C6.60125 20.5439 6.99537 20.483 7.36805 20.3695L12.0645 37.2105L16.9212 45.5224L12.0645 46.421V53L44 53V46.421L39.081 45.5187L43.9355 37.2105L48.632 20.3695C49.0046 20.483 49.3987 20.5439 49.8064 20.5439C52.1225 20.5439 54 18.5802 54 16.1579C54 13.7356 52.1225 11.7719 49.8064 11.7719C47.4904 11.7719 45.6129 13.7356 45.6129 16.1579C45.6129 17.4275 46.1287 18.5711 46.953 19.372L37.9376 27.5614L36.0675 11.7387C38.1386 11.4712 39.7419 9.62443 39.7419 7.38596C39.7419 4.96366 37.8644 3 35.5484 3C33.2324 3 31.3548 4.96366 31.3548 7.38596C31.3548 9.25337 32.4707 10.8482 34.0431 11.4809L28 25.807L21.9569 11.4809Z",
|
|
1812
|
+
fill: "#2A2B37"
|
|
1813
|
+
}));
|
|
1814
|
+
},
|
|
1815
|
+
'king-black': function kingBlack(size) {
|
|
1816
|
+
return React.createElement("svg", {
|
|
1817
|
+
width: size,
|
|
1818
|
+
height: size,
|
|
1819
|
+
viewBox: "0 0 56 56",
|
|
1820
|
+
fill: "none",
|
|
1821
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
1822
|
+
}, React.createElement("path", {
|
|
1823
|
+
"fill-rule": "evenodd",
|
|
1824
|
+
"clip-rule": "evenodd",
|
|
1825
|
+
d: "M25.4055 3H30.5945L30.7296 7.31034H35.7835V12.4828H30.8918L31.1294 18.3388C31.2242 18.2274 31.3219 18.1182 31.4225 18.0116C36.1472 13.0061 43.1524 10.3424 48.3235 14.6379C53.5125 18.9483 53.5125 28.8621 46.3679 34.5958C42.3207 37.8438 38.6956 40.9749 38.8743 45.5544L46.1437 46.5345V53H9.85632V46.5345L17.1257 45.5544C17.3044 40.9749 13.6793 37.8438 9.6321 34.5958C2.4875 28.8621 2.4875 18.9483 7.67648 14.6379C12.8476 10.3424 19.8528 13.0061 24.5775 18.0116C24.6781 18.1182 24.7758 18.2274 24.8706 18.3388L25.1082 12.4828H20.2165V7.31034H25.2704L25.4055 3ZM20.5175 22.8044C23.6886 27.982 24.1083 34.0345 24.1083 36.6666C22.5188 36.6694 16.527 34.0418 13.3546 29.7281C11.0708 26.6226 10.4753 22.0151 12.433 20.2263C14.3908 18.4375 18.5356 19.5685 20.5175 22.8044ZM35.4825 22.8044C32.3114 27.982 31.8917 34.0345 31.8917 36.6666C33.4812 36.6694 39.473 34.0418 42.6454 29.7281C44.9292 26.6226 45.5248 22.0151 43.567 20.2263C41.6092 18.4375 37.4644 19.5685 35.4825 22.8044Z",
|
|
1826
|
+
fill: "#2A2B37"
|
|
1827
|
+
}));
|
|
1828
|
+
}
|
|
1829
|
+
};
|
|
1830
|
+
|
|
1831
|
+
var DEFAULT_CELL_SIZE = 92;
|
|
1832
|
+
var FACTOR_FOR_SIZE_CIRCLE_MARK = 4.6;
|
|
1833
|
+
var DEFAULT_CIRCLE_MARK_COLOR = '#3697ce';
|
|
1834
|
+
var DEFAULT_WHITE_CELL_COLOR = '#fafafc';
|
|
1835
|
+
var DEFAULT_BLACK_CELL_COLOR = '#d8d9e6';
|
|
1836
|
+
var DEFAULT_SELECTED_CELL_COLOR = '#e3f1fe';
|
|
1837
|
+
var DEFAULT_SELECTED_CELL_BORDER = '3px solid #6ac2fd';
|
|
1838
|
+
var DEFAULT_ARROW_COLOR = '#6ac2fd';
|
|
1839
|
+
var DEFAULT_MARKED_CELL_COLOR = '#3697ce';
|
|
1840
|
+
var DEFAULT_CHECKED_CELL_COLOR = '#e95b5c';
|
|
1841
|
+
var DEFAULT_PIECES_MAP = CHESS_PIECES_MAP;
|
|
1842
|
+
var DEFAULT_CHESSBORD_CONFIG = {
|
|
1843
|
+
cellSize: DEFAULT_CELL_SIZE,
|
|
1844
|
+
circleMarkColor: DEFAULT_CIRCLE_MARK_COLOR,
|
|
1845
|
+
whiteCellColor: DEFAULT_WHITE_CELL_COLOR,
|
|
1846
|
+
blackCellColor: DEFAULT_BLACK_CELL_COLOR,
|
|
1847
|
+
selectedCellColor: DEFAULT_SELECTED_CELL_COLOR,
|
|
1848
|
+
selectedCellBorder: DEFAULT_SELECTED_CELL_BORDER,
|
|
1849
|
+
arrowColor: DEFAULT_ARROW_COLOR,
|
|
1850
|
+
markedCellColor: DEFAULT_MARKED_CELL_COLOR,
|
|
1851
|
+
checkedCellColor: DEFAULT_CHECKED_CELL_COLOR,
|
|
1852
|
+
piecesMap: DEFAULT_PIECES_MAP
|
|
1853
|
+
};
|
|
1854
|
+
|
|
1855
|
+
var getFigureCSS = function getFigureCSS(figure) {
|
|
1856
|
+
return figure.type + "-" + figure.color;
|
|
1857
|
+
};
|
|
1858
|
+
var getIsLightCell = function getIsLightCell(rowId, cellId) {
|
|
1859
|
+
return rowId % 2 === 0 && cellId % 2 === 0 || rowId % 2 > 0 && cellId % 2 > 0;
|
|
1860
|
+
};
|
|
1861
|
+
var getFilledArrayBySize = function getFilledArrayBySize(size) {
|
|
1862
|
+
var array = [];
|
|
1863
|
+
for (var i = 0; i < size; i++) {
|
|
1864
|
+
array.push(i);
|
|
1865
|
+
}
|
|
1866
|
+
return array;
|
|
1867
|
+
};
|
|
1868
|
+
var mapCellsToFiguresArray = function mapCellsToFiguresArray(boardState) {
|
|
1869
|
+
var figuresWithPosition = [];
|
|
1870
|
+
boardState.forEach(function (row, j) {
|
|
1871
|
+
return row.forEach(function (cell, i) {
|
|
1872
|
+
if (cell.figure) {
|
|
1873
|
+
figuresWithPosition.push(_extends({}, cell.figure, {
|
|
1874
|
+
position: [i, j]
|
|
1875
|
+
}));
|
|
1876
|
+
}
|
|
1877
|
+
});
|
|
1878
|
+
});
|
|
1879
|
+
return figuresWithPosition;
|
|
1880
|
+
};
|
|
1881
|
+
var checkIsPossibleMove = function checkIsPossibleMove(possibleMoves, position) {
|
|
1882
|
+
return !!possibleMoves.find(function (possibleMove) {
|
|
1883
|
+
return possibleMove[0] === position[0] && possibleMove[1] === position[1];
|
|
1884
|
+
});
|
|
1885
|
+
};
|
|
1886
|
+
var checkPositionsHas = function checkPositionsHas(positions, pos) {
|
|
1887
|
+
if (!positions) return false;
|
|
1888
|
+
return !!positions.find(function (posItem) {
|
|
1889
|
+
return posItem[0] === pos[0] && posItem[1] === pos[1];
|
|
1890
|
+
});
|
|
1891
|
+
};
|
|
1892
|
+
var checkIsCastlingMove = function checkIsCastlingMove(moveData) {
|
|
1893
|
+
var figure = moveData.figure,
|
|
1894
|
+
from = moveData.from,
|
|
1895
|
+
to = moveData.to;
|
|
1896
|
+
if (figure.type !== 'king') return false;
|
|
1897
|
+
if (from[1] !== to[1]) return false;
|
|
1898
|
+
var horizontalDiff = Math.abs(to[0] - from[0]);
|
|
1899
|
+
if (horizontalDiff === 1) return false;
|
|
1900
|
+
return true;
|
|
1901
|
+
};
|
|
1902
|
+
var hasCheck = function hasCheck(cell, currentColor, linesWithCheck) {
|
|
1903
|
+
return !!cell.figure && cell.figure.type === 'king' && cell.figure.color === currentColor && linesWithCheck.length > 0;
|
|
1904
|
+
};
|
|
1905
|
+
var degrees = function degrees(a, b) {
|
|
1906
|
+
return Math.atan(a / b) * 180 / Math.PI;
|
|
1907
|
+
};
|
|
1908
|
+
var calcAngle = function calcAngle(start, end) {
|
|
1909
|
+
var x = end[0] - start[0];
|
|
1910
|
+
var y = end[1] - start[1];
|
|
1911
|
+
if (x > 0 && y > 0) {
|
|
1912
|
+
return degrees(y, x) - 90;
|
|
1913
|
+
}
|
|
1914
|
+
if (x < 0 && y < 0) {
|
|
1915
|
+
return degrees(y, x) + 90;
|
|
1916
|
+
}
|
|
1917
|
+
if (x < 0 && y > 0) {
|
|
1918
|
+
return degrees(y, x) + 90;
|
|
1919
|
+
}
|
|
1920
|
+
if (x > 0 && y < 0) {
|
|
1921
|
+
return degrees(y, x) - 90;
|
|
1922
|
+
}
|
|
1923
|
+
if (y === 0 && x > 0) return -90;
|
|
1924
|
+
if (y === 0 && x < 0) return 90;
|
|
1925
|
+
if (x === 0 && y < 0) return 180;
|
|
1926
|
+
return 0;
|
|
1927
|
+
};
|
|
1928
|
+
var getChessBoardConfig = function getChessBoardConfig(config) {
|
|
1929
|
+
if (!config) return DEFAULT_CHESSBORD_CONFIG;
|
|
1930
|
+
var configKeyes = Object.keys(DEFAULT_CHESSBORD_CONFIG);
|
|
1931
|
+
var buildedConfig = {};
|
|
1932
|
+
configKeyes.forEach(function (key) {
|
|
1933
|
+
buildedConfig[key] = config[key] || DEFAULT_CHESSBORD_CONFIG[key];
|
|
1934
|
+
});
|
|
1935
|
+
return buildedConfig;
|
|
1936
|
+
};
|
|
1937
|
+
var getFiguresByColor = function getFiguresByColor(color, forPawnTransform) {
|
|
1938
|
+
if (forPawnTransform === void 0) {
|
|
1939
|
+
forPawnTransform = false;
|
|
1940
|
+
}
|
|
1941
|
+
if (forPawnTransform) {
|
|
1942
|
+
var figureNamesForPawn = ['queen', 'rook', 'bishop', 'knigts'];
|
|
1943
|
+
return figureNamesForPawn.map(function (figureName) {
|
|
1944
|
+
return {
|
|
1945
|
+
type: figureName,
|
|
1946
|
+
color: color,
|
|
1947
|
+
touched: true
|
|
1948
|
+
};
|
|
1949
|
+
});
|
|
1950
|
+
}
|
|
1951
|
+
var figureNames = ['pawn', 'knigts', 'bishop', 'rook', 'queen', 'king'];
|
|
1952
|
+
return figureNames.map(function (figureName) {
|
|
1953
|
+
return {
|
|
1954
|
+
type: figureName,
|
|
1955
|
+
color: color,
|
|
1956
|
+
touched: true
|
|
1957
|
+
};
|
|
1958
|
+
});
|
|
1959
|
+
};
|
|
1960
|
+
|
|
1961
|
+
var BASE_BOARD_SIZE = 8;
|
|
1962
|
+
var ChessBoardCellsLayout = function ChessBoardCellsLayout(_ref) {
|
|
1963
|
+
var _ref$size = _ref.size,
|
|
1964
|
+
size = _ref$size === void 0 ? BASE_BOARD_SIZE : _ref$size,
|
|
1965
|
+
boardConfig = _ref.boardConfig;
|
|
1966
|
+
return React.createElement("div", null, getFilledArrayBySize(size).map(function (_, j) {
|
|
1967
|
+
return React.createElement("div", {
|
|
1968
|
+
className: styles.row,
|
|
1969
|
+
key: "cells-layout-" + j
|
|
1970
|
+
}, getFilledArrayBySize(size).map(function (_, i) {
|
|
1971
|
+
return React.createElement("div", {
|
|
1972
|
+
style: {
|
|
1973
|
+
width: boardConfig.cellSize,
|
|
1974
|
+
height: boardConfig.cellSize,
|
|
1975
|
+
backgroundColor: getIsLightCell(j, i) ? boardConfig.whiteCellColor : boardConfig.blackCellColor
|
|
1976
|
+
},
|
|
1977
|
+
key: "cells-layout-" + i
|
|
1978
|
+
});
|
|
1979
|
+
}));
|
|
1980
|
+
}));
|
|
1981
|
+
};
|
|
1982
|
+
|
|
1983
|
+
var ChessBoardFiguresLayout = function ChessBoardFiguresLayout(props) {
|
|
1984
|
+
var initialState = props.initialState,
|
|
1985
|
+
change = props.change,
|
|
1986
|
+
reversed = props.reversed,
|
|
1987
|
+
boardConfig = props.boardConfig;
|
|
1988
|
+
var _useState = useState([]),
|
|
1989
|
+
actualState = _useState[0],
|
|
1990
|
+
setActualState = _useState[1];
|
|
1991
|
+
useEffect(function () {
|
|
1992
|
+
setActualState(mapCellsToFiguresArray(initialState));
|
|
1993
|
+
}, [initialState]);
|
|
1994
|
+
useEffect(function () {
|
|
1995
|
+
if (!!change) {
|
|
1996
|
+
setActualState(function (prevState) {
|
|
1997
|
+
var updatedState = [].concat(prevState);
|
|
1998
|
+
var move = change.move,
|
|
1999
|
+
attackedPos = change.attackedPos,
|
|
2000
|
+
transformTo = change.transformTo;
|
|
2001
|
+
if (checkIsCastlingMove(move)) {
|
|
2002
|
+
var castlingType = JSChessEngine.getCastlingType(move);
|
|
2003
|
+
var color = move.figure.color;
|
|
2004
|
+
if (color === 'white') {
|
|
2005
|
+
var kingIndex = updatedState.findIndex(function (figure) {
|
|
2006
|
+
return figure.color === 'white' && figure.type === 'king';
|
|
2007
|
+
});
|
|
2008
|
+
if (castlingType === '0-0') {
|
|
2009
|
+
var _rookIndex = updatedState.findIndex(function (figure) {
|
|
2010
|
+
return figure.color === color && figure.type === 'rook' && figure.position[0] === 7;
|
|
2011
|
+
});
|
|
2012
|
+
updatedState[_rookIndex].position[0] = 5;
|
|
2013
|
+
updatedState[kingIndex].position[0] = 6;
|
|
2014
|
+
return updatedState;
|
|
2015
|
+
}
|
|
2016
|
+
var rookIndex = updatedState.findIndex(function (figure) {
|
|
2017
|
+
return figure.color === color && figure.type === 'rook' && figure.position[0] === 0;
|
|
2018
|
+
});
|
|
2019
|
+
updatedState[rookIndex].position[0] = 3;
|
|
2020
|
+
updatedState[kingIndex].position[0] = 2;
|
|
2021
|
+
return updatedState;
|
|
2022
|
+
}
|
|
2023
|
+
if (color === 'black') {
|
|
2024
|
+
var _kingIndex = updatedState.findIndex(function (figure) {
|
|
2025
|
+
return figure.color === 'black' && figure.type === 'king';
|
|
2026
|
+
});
|
|
2027
|
+
if (castlingType === '0-0') {
|
|
2028
|
+
var _rookIndex2 = updatedState.findIndex(function (figure) {
|
|
2029
|
+
return figure.color === color && figure.type === 'rook' && figure.position[0] === 7;
|
|
2030
|
+
});
|
|
2031
|
+
updatedState[_rookIndex2].position[0] = 5;
|
|
2032
|
+
updatedState[_kingIndex].position[0] = 6;
|
|
2033
|
+
return updatedState;
|
|
2034
|
+
}
|
|
2035
|
+
var _rookIndex3 = updatedState.findIndex(function (figure) {
|
|
2036
|
+
return figure.color === color && figure.type === 'rook' && figure.position[0] === 0;
|
|
2037
|
+
});
|
|
2038
|
+
updatedState[_rookIndex3].position[0] = 3;
|
|
2039
|
+
updatedState[_kingIndex].position[0] = 2;
|
|
2040
|
+
return updatedState;
|
|
2041
|
+
}
|
|
2042
|
+
return updatedState;
|
|
2043
|
+
}
|
|
2044
|
+
var from = move.from,
|
|
2045
|
+
to = move.to;
|
|
2046
|
+
var foundAttactedFigure = updatedState.find(function (figure) {
|
|
2047
|
+
if (attackedPos) return figure.position[0] === attackedPos[0] && figure.position[1] === attackedPos[1];
|
|
2048
|
+
return figure.position[0] === to[0] && figure.position[1] === to[1];
|
|
2049
|
+
});
|
|
2050
|
+
if (foundAttactedFigure) {
|
|
2051
|
+
foundAttactedFigure.color === 'white' ? foundAttactedFigure.position = [8, foundAttactedFigure.position[1]] : foundAttactedFigure.position = [-1, foundAttactedFigure.position[1]];
|
|
2052
|
+
}
|
|
2053
|
+
var foundFigureByPositionFrom = updatedState.find(function (figure) {
|
|
2054
|
+
return figure.position[0] === from[0] && figure.position[1] === from[1];
|
|
2055
|
+
});
|
|
2056
|
+
foundFigureByPositionFrom.position = move.to;
|
|
2057
|
+
if (!!transformTo) {
|
|
2058
|
+
foundFigureByPositionFrom.type = transformTo.type;
|
|
2059
|
+
foundFigureByPositionFrom.color = transformTo.color;
|
|
2060
|
+
}
|
|
2061
|
+
return updatedState;
|
|
2062
|
+
});
|
|
2063
|
+
}
|
|
2064
|
+
}, [change]);
|
|
2065
|
+
useEffect(function () {
|
|
2066
|
+
if (!reversed) return;
|
|
2067
|
+
setActualState(function (prevState) {
|
|
2068
|
+
var preparedState = [].concat(prevState);
|
|
2069
|
+
return preparedState.map(function (figure) {
|
|
2070
|
+
return _extends({}, figure, {
|
|
2071
|
+
position: [Math.abs(7 - figure.position[0]), Math.abs(7 - figure.position[1])]
|
|
2072
|
+
});
|
|
2073
|
+
});
|
|
2074
|
+
});
|
|
2075
|
+
}, [reversed, initialState]);
|
|
2076
|
+
return React.createElement("div", {
|
|
2077
|
+
className: styles.figuresLayout
|
|
2078
|
+
}, actualState.map(function (figure, i) {
|
|
2079
|
+
var _cn;
|
|
2080
|
+
return React.createElement("div", {
|
|
2081
|
+
key: i,
|
|
2082
|
+
className: cn([styles.figure], (_cn = {}, _cn[styles.hiddenFigure] = figure.position[0] === -1 || figure.position[0] === 8, _cn)),
|
|
2083
|
+
style: {
|
|
2084
|
+
top: boardConfig.cellSize * figure.position[1] + "px",
|
|
2085
|
+
left: boardConfig.cellSize * figure.position[0] + "px",
|
|
2086
|
+
transition: !!change && change.withTransition ? 'all .15s ease-out' : 'none',
|
|
2087
|
+
width: boardConfig.cellSize,
|
|
2088
|
+
height: boardConfig.cellSize
|
|
2089
|
+
}
|
|
2090
|
+
}, boardConfig.piecesMap[getFigureCSS(figure)]('80%'));
|
|
2091
|
+
}));
|
|
2092
|
+
};
|
|
2093
|
+
|
|
2094
|
+
var BASE_BOARD_SIZE$1 = 8;
|
|
2095
|
+
var ChessBoardControlLayout = function ChessBoardControlLayout(props) {
|
|
2096
|
+
var _cn;
|
|
2097
|
+
var _props$size = props.size,
|
|
2098
|
+
size = _props$size === void 0 ? BASE_BOARD_SIZE$1 : _props$size,
|
|
2099
|
+
boardConfig = props.boardConfig,
|
|
2100
|
+
onClick = props.onClick,
|
|
2101
|
+
onGrabEnd = props.onGrabEnd,
|
|
2102
|
+
onGrabbing = props.onGrabbing,
|
|
2103
|
+
onGrabStart = props.onGrabStart,
|
|
2104
|
+
onRightClick = props.onRightClick,
|
|
2105
|
+
onGrabEndRight = props.onGrabEndRight,
|
|
2106
|
+
onGrabStartRight = props.onGrabStartRight;
|
|
2107
|
+
var _useState = useState(false),
|
|
2108
|
+
pressed = _useState[0],
|
|
2109
|
+
setPressed = _useState[1];
|
|
2110
|
+
var handleClick = function handleClick(cellPos) {
|
|
2111
|
+
onClick(cellPos);
|
|
2112
|
+
};
|
|
2113
|
+
var handleGrabStart = function handleGrabStart(cellPos) {
|
|
2114
|
+
return function (event) {
|
|
2115
|
+
setPressed(true);
|
|
2116
|
+
if (event.button === 0) {
|
|
2117
|
+
onGrabStart(cellPos);
|
|
2118
|
+
}
|
|
2119
|
+
if (event.button === 2) {
|
|
2120
|
+
onGrabStartRight(cellPos);
|
|
2121
|
+
}
|
|
2122
|
+
};
|
|
2123
|
+
};
|
|
2124
|
+
var handleGrabEnd = function handleGrabEnd(cellPos) {
|
|
2125
|
+
return function (event) {
|
|
2126
|
+
if (event.button === 0) {
|
|
2127
|
+
setPressed(false);
|
|
2128
|
+
onGrabEnd(cellPos);
|
|
2129
|
+
}
|
|
2130
|
+
if (event.button === 2) {
|
|
2131
|
+
onGrabEndRight(cellPos);
|
|
2132
|
+
}
|
|
2133
|
+
};
|
|
2134
|
+
};
|
|
2135
|
+
var handleGrabing = function handleGrabing(event) {
|
|
2136
|
+
if (pressed) {
|
|
2137
|
+
var pageX = event.pageX,
|
|
2138
|
+
pageY = event.pageY;
|
|
2139
|
+
onGrabbing(pageX, pageY);
|
|
2140
|
+
}
|
|
2141
|
+
};
|
|
2142
|
+
var handleContextMenu = function handleContextMenu(cellPos) {
|
|
2143
|
+
return function (event) {
|
|
2144
|
+
event.preventDefault();
|
|
2145
|
+
onRightClick(cellPos);
|
|
2146
|
+
};
|
|
2147
|
+
};
|
|
2148
|
+
return React.createElement("div", {
|
|
2149
|
+
className: cn(styles.controlLayout, (_cn = {}, _cn[styles.controlLayoutGrabbing] = pressed, _cn)),
|
|
2150
|
+
onMouseMove: handleGrabing
|
|
2151
|
+
}, getFilledArrayBySize(size).map(function (_, j) {
|
|
2152
|
+
return React.createElement("div", {
|
|
2153
|
+
className: styles.row,
|
|
2154
|
+
key: "control-layout-" + j
|
|
2155
|
+
}, getFilledArrayBySize(size).map(function (_, i) {
|
|
2156
|
+
return React.createElement("div", {
|
|
2157
|
+
key: "control-layout-" + i,
|
|
2158
|
+
className: styles.controlCell,
|
|
2159
|
+
style: {
|
|
2160
|
+
width: boardConfig.cellSize,
|
|
2161
|
+
height: boardConfig.cellSize
|
|
2162
|
+
},
|
|
2163
|
+
onClick: function onClick() {
|
|
2164
|
+
return handleClick([i, j]);
|
|
2165
|
+
},
|
|
2166
|
+
onMouseDown: handleGrabStart([i, j]),
|
|
2167
|
+
onMouseUp: handleGrabEnd([i, j]),
|
|
2168
|
+
onContextMenu: handleContextMenu([i, j])
|
|
2169
|
+
});
|
|
2170
|
+
}));
|
|
2171
|
+
}));
|
|
2172
|
+
};
|
|
2173
|
+
|
|
2174
|
+
var useChessBoardInteractive = function useChessBoardInteractive(props) {
|
|
2175
|
+
var config = props.config,
|
|
2176
|
+
onChange = props.onChange,
|
|
2177
|
+
onEndGame = props.onEndGame;
|
|
2178
|
+
var _useState = useState(DEFAULT_CHESSBORD_CONFIG),
|
|
2179
|
+
boardConfig = _useState[0],
|
|
2180
|
+
setBoardConfig = _useState[1];
|
|
2181
|
+
var _useState2 = useState([]),
|
|
2182
|
+
initialState = _useState2[0],
|
|
2183
|
+
setInitialState = _useState2[1];
|
|
2184
|
+
var _useState3 = useState([]),
|
|
2185
|
+
actualState = _useState3[0],
|
|
2186
|
+
setActualState = _useState3[1];
|
|
2187
|
+
var _useState4 = useState([-1, -1]),
|
|
2188
|
+
fromPos = _useState4[0],
|
|
2189
|
+
setFromPos = _useState4[1];
|
|
2190
|
+
var _useState5 = useState(),
|
|
2191
|
+
holdedFigure = _useState5[0],
|
|
2192
|
+
setHoldedFigure = _useState5[1];
|
|
2193
|
+
var _useState6 = useState([-1, -1]),
|
|
2194
|
+
grabbingPos = _useState6[0],
|
|
2195
|
+
setGrabbingPos = _useState6[1];
|
|
2196
|
+
var _useState7 = useState([]),
|
|
2197
|
+
possibleMoves = _useState7[0],
|
|
2198
|
+
setPossibleMoves = _useState7[1];
|
|
2199
|
+
var _useState8 = useState(false),
|
|
2200
|
+
boardReversed = _useState8[0],
|
|
2201
|
+
setBoardReversed = _useState8[1];
|
|
2202
|
+
var _useState9 = useState('white'),
|
|
2203
|
+
currentColor = _useState9[0],
|
|
2204
|
+
setCurrentColor = _useState9[1];
|
|
2205
|
+
var _useState10 = useState(),
|
|
2206
|
+
playerColor = _useState10[0];
|
|
2207
|
+
var _useState11 = useState(),
|
|
2208
|
+
newMove = _useState11[0],
|
|
2209
|
+
setNewMove = _useState11[1];
|
|
2210
|
+
var _useState12 = useState([]),
|
|
2211
|
+
linesWithCheck = _useState12[0],
|
|
2212
|
+
setLinesWithCheck = _useState12[1];
|
|
2213
|
+
var _useState13 = useState([]),
|
|
2214
|
+
markedCells = _useState13[0],
|
|
2215
|
+
setMarkedCells = _useState13[1];
|
|
2216
|
+
var _useState14 = useState([-1, -1]),
|
|
2217
|
+
clickedPos = _useState14[0],
|
|
2218
|
+
setClickedPos = _useState14[1];
|
|
2219
|
+
var _useState15 = useState(),
|
|
2220
|
+
clickedFigure = _useState15[0],
|
|
2221
|
+
setClickedFigure = _useState15[1];
|
|
2222
|
+
var _useState16 = useState([]),
|
|
2223
|
+
clickPossibleMoves = _useState16[0],
|
|
2224
|
+
setClickPossibleMoves = _useState16[1];
|
|
2225
|
+
var _useState17 = useState([-1, -1]),
|
|
2226
|
+
startArrowCoord = _useState17[0],
|
|
2227
|
+
setStartArrowCoord = _useState17[1];
|
|
2228
|
+
var _useState18 = useState([]),
|
|
2229
|
+
arrowsCoords = _useState18[0],
|
|
2230
|
+
setArrowsCoords = _useState18[1];
|
|
2231
|
+
var _useState19 = useState(false),
|
|
2232
|
+
showFigurePicker = _useState19[0],
|
|
2233
|
+
setShowFigurePicker = _useState19[1];
|
|
2234
|
+
var _useState20 = useState([-1, -1]),
|
|
2235
|
+
targetPos = _useState20[0],
|
|
2236
|
+
setTargetPos = _useState20[1];
|
|
2237
|
+
var clearFromPos = function clearFromPos() {
|
|
2238
|
+
return setFromPos([-1, -1]);
|
|
2239
|
+
};
|
|
2240
|
+
var clearGrabbingPos = function clearGrabbingPos() {
|
|
2241
|
+
return setGrabbingPos([-1, -1]);
|
|
2242
|
+
};
|
|
2243
|
+
var clearPossibleMoves = function clearPossibleMoves() {
|
|
2244
|
+
return setPossibleMoves([]);
|
|
2245
|
+
};
|
|
2246
|
+
var clearClickPossibleMoves = function clearClickPossibleMoves() {
|
|
2247
|
+
return setClickPossibleMoves([]);
|
|
2248
|
+
};
|
|
2249
|
+
var toggleCurrentColor = function toggleCurrentColor() {
|
|
2250
|
+
return setCurrentColor(function (prevColor) {
|
|
2251
|
+
return prevColor === 'white' ? 'black' : 'white';
|
|
2252
|
+
});
|
|
2253
|
+
};
|
|
2254
|
+
var clearMarkedCells = function clearMarkedCells() {
|
|
2255
|
+
return setMarkedCells([]);
|
|
2256
|
+
};
|
|
2257
|
+
var clearClickedPos = function clearClickedPos() {
|
|
2258
|
+
return setClickedPos([-1, -1]);
|
|
2259
|
+
};
|
|
2260
|
+
var clearArrows = function clearArrows() {
|
|
2261
|
+
return setArrowsCoords([]);
|
|
2262
|
+
};
|
|
2263
|
+
useEffect(function () {
|
|
2264
|
+
setBoardConfig(getChessBoardConfig(config));
|
|
2265
|
+
}, []);
|
|
2266
|
+
useEffect(function () {
|
|
2267
|
+
if (linesWithCheck.length > 0) {
|
|
2268
|
+
var gameResult = JSChessEngine.getGameResult(actualState, linesWithCheck, currentColor, boardReversed);
|
|
2269
|
+
if (gameResult) onEndGame(gameResult);
|
|
2270
|
+
}
|
|
2271
|
+
}, [actualState, linesWithCheck, boardReversed, currentColor]);
|
|
2272
|
+
var cleanAllForFigure = function cleanAllForFigure() {
|
|
2273
|
+
setHoldedFigure(undefined);
|
|
2274
|
+
clearFromPos();
|
|
2275
|
+
clearGrabbingPos();
|
|
2276
|
+
clearPossibleMoves();
|
|
2277
|
+
};
|
|
2278
|
+
var cleanAllForClickedFigure = function cleanAllForClickedFigure() {
|
|
2279
|
+
setClickedFigure(undefined);
|
|
2280
|
+
clearClickedPos();
|
|
2281
|
+
clearClickPossibleMoves();
|
|
2282
|
+
};
|
|
2283
|
+
var reverseChessBoard = function reverseChessBoard() {
|
|
2284
|
+
cleanAllForFigure();
|
|
2285
|
+
setActualState(function (prevState) {
|
|
2286
|
+
return JSChessEngine.reverseChessBoard(prevState);
|
|
2287
|
+
});
|
|
2288
|
+
setBoardReversed(function (prevReversed) {
|
|
2289
|
+
return !prevReversed;
|
|
2290
|
+
});
|
|
2291
|
+
};
|
|
2292
|
+
var selectFigureFrom = function selectFigureFrom(cellPos) {
|
|
2293
|
+
var cell = actualState[cellPos[1]][cellPos[0]];
|
|
2294
|
+
if (!cell.figure) {
|
|
2295
|
+
cleanAllForFigure();
|
|
2296
|
+
return {
|
|
2297
|
+
figure: undefined,
|
|
2298
|
+
nextMoves: []
|
|
2299
|
+
};
|
|
2300
|
+
}
|
|
2301
|
+
var figure = cell.figure;
|
|
2302
|
+
if (figure.color !== currentColor) {
|
|
2303
|
+
cleanAllForFigure();
|
|
2304
|
+
return {
|
|
2305
|
+
figure: undefined,
|
|
2306
|
+
nextMoves: []
|
|
2307
|
+
};
|
|
2308
|
+
}
|
|
2309
|
+
var nextMoves = JSChessEngine.getNextMoves(actualState, cellPos, linesWithCheck, boardReversed);
|
|
2310
|
+
return {
|
|
2311
|
+
figure: cell.figure,
|
|
2312
|
+
nextMoves: nextMoves
|
|
2313
|
+
};
|
|
2314
|
+
};
|
|
2315
|
+
var selectClickFrom = function selectClickFrom(cellPos) {
|
|
2316
|
+
var _selectFigureFrom = selectFigureFrom(cellPos),
|
|
2317
|
+
figure = _selectFigureFrom.figure,
|
|
2318
|
+
nextMoves = _selectFigureFrom.nextMoves;
|
|
2319
|
+
if (!figure) return;
|
|
2320
|
+
setClickedFigure(figure);
|
|
2321
|
+
setClickedPos(cellPos);
|
|
2322
|
+
setClickPossibleMoves(nextMoves);
|
|
2323
|
+
};
|
|
2324
|
+
var selectHoverFrom = function selectHoverFrom(cellPos) {
|
|
2325
|
+
var _selectFigureFrom2 = selectFigureFrom(cellPos),
|
|
2326
|
+
figure = _selectFigureFrom2.figure,
|
|
2327
|
+
nextMoves = _selectFigureFrom2.nextMoves;
|
|
2328
|
+
if (!figure) return;
|
|
2329
|
+
setHoldedFigure(figure);
|
|
2330
|
+
setPossibleMoves(nextMoves);
|
|
2331
|
+
setFromPos(cellPos);
|
|
2332
|
+
};
|
|
2333
|
+
var moveFigure = function moveFigure(from, to, figure) {
|
|
2334
|
+
var inNextMoves = checkPositionsHas(possibleMoves, to);
|
|
2335
|
+
var conditionForDoMove = (to[0] !== from[0] || to[1] !== from[1]) && inNextMoves;
|
|
2336
|
+
if (!conditionForDoMove) return {};
|
|
2337
|
+
var _JSChessEngine$change = JSChessEngine.changeState(actualState, figure, to, from, boardReversed),
|
|
2338
|
+
updatedCells = _JSChessEngine$change.updatedCells,
|
|
2339
|
+
attackedPos = _JSChessEngine$change.attackedPos;
|
|
2340
|
+
var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
|
|
2341
|
+
setLinesWithCheck(linesCheck);
|
|
2342
|
+
if (playerColor === undefined) setActualState(updatedCells);
|
|
2343
|
+
if (figure.type === 'pawn' && (to[1] === 0 || to[1] === actualState.length - 1)) {
|
|
2344
|
+
setTargetPos(to);
|
|
2345
|
+
setShowFigurePicker(true);
|
|
2346
|
+
return {};
|
|
2347
|
+
}
|
|
2348
|
+
var colorFEN = currentColor === 'white' ? 'black' : 'white';
|
|
2349
|
+
var FEN = stateToFEN(updatedCells, colorFEN);
|
|
2350
|
+
var moveData = {
|
|
2351
|
+
figure: figure,
|
|
2352
|
+
from: from,
|
|
2353
|
+
to: to,
|
|
2354
|
+
FEN: FEN
|
|
2355
|
+
};
|
|
2356
|
+
toggleCurrentColor();
|
|
2357
|
+
setHoldedFigure(undefined);
|
|
2358
|
+
clearFromPos();
|
|
2359
|
+
clearGrabbingPos();
|
|
2360
|
+
clearArrows();
|
|
2361
|
+
clearMarkedCells();
|
|
2362
|
+
return {
|
|
2363
|
+
moveData: moveData,
|
|
2364
|
+
attackedPos: attackedPos
|
|
2365
|
+
};
|
|
2366
|
+
};
|
|
2367
|
+
var moveFigureByClick = function moveFigureByClick(from, to, figure) {
|
|
2368
|
+
var inNextMoves = checkPositionsHas(clickPossibleMoves, to);
|
|
2369
|
+
var conditionForDoMove = (to[0] !== from[0] || to[1] !== from[1]) && inNextMoves;
|
|
2370
|
+
if (!conditionForDoMove) return {};
|
|
2371
|
+
var _JSChessEngine$change2 = JSChessEngine.changeState(actualState, figure, to, from, boardReversed),
|
|
2372
|
+
updatedCells = _JSChessEngine$change2.updatedCells,
|
|
2373
|
+
attackedPos = _JSChessEngine$change2.attackedPos;
|
|
2374
|
+
var linesCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
|
|
2375
|
+
setLinesWithCheck(linesCheck);
|
|
2376
|
+
if (playerColor === undefined) setActualState(updatedCells);
|
|
2377
|
+
if (figure.type === 'pawn' && (to[1] === 0 || to[1] === actualState.length - 1)) {
|
|
2378
|
+
setTargetPos(to);
|
|
2379
|
+
setShowFigurePicker(true);
|
|
2380
|
+
return {};
|
|
2381
|
+
}
|
|
2382
|
+
var colorFEN = currentColor === 'white' ? 'black' : 'white';
|
|
2383
|
+
var FEN = stateToFEN(updatedCells, colorFEN);
|
|
2384
|
+
var moveData = {
|
|
2385
|
+
figure: figure,
|
|
2386
|
+
from: from,
|
|
2387
|
+
to: to,
|
|
2388
|
+
FEN: FEN
|
|
2389
|
+
};
|
|
2390
|
+
toggleCurrentColor();
|
|
2391
|
+
setClickedFigure(undefined);
|
|
2392
|
+
clearClickedPos();
|
|
2393
|
+
clearGrabbingPos();
|
|
2394
|
+
clearArrows();
|
|
2395
|
+
clearMarkedCells();
|
|
2396
|
+
return {
|
|
2397
|
+
moveData: moveData,
|
|
2398
|
+
attackedPos: attackedPos
|
|
2399
|
+
};
|
|
2400
|
+
};
|
|
2401
|
+
var handleGrabbing = function handleGrabbing(x, y) {
|
|
2402
|
+
setGrabbingPos([x, y]);
|
|
2403
|
+
};
|
|
2404
|
+
var handleGrabEnd = function handleGrabEnd(cellPos, withTransition) {
|
|
2405
|
+
if (withTransition === void 0) {
|
|
2406
|
+
withTransition = false;
|
|
2407
|
+
}
|
|
2408
|
+
if (fromPos[0] === -1) {
|
|
2409
|
+
clearGrabbingPos();
|
|
2410
|
+
return;
|
|
2411
|
+
}
|
|
2412
|
+
if (!holdedFigure) {
|
|
2413
|
+
return;
|
|
2414
|
+
}
|
|
2415
|
+
if (possibleMoves.length === 0) {
|
|
2416
|
+
clearGrabbingPos();
|
|
2417
|
+
return;
|
|
2418
|
+
}
|
|
2419
|
+
var foundPosInPossible = checkIsPossibleMove(possibleMoves, cellPos);
|
|
2420
|
+
if (!foundPosInPossible) {
|
|
2421
|
+
clearGrabbingPos();
|
|
2422
|
+
return;
|
|
2423
|
+
}
|
|
2424
|
+
var _moveFigure = moveFigure(fromPos, cellPos, holdedFigure),
|
|
2425
|
+
moveData = _moveFigure.moveData,
|
|
2426
|
+
attackedPos = _moveFigure.attackedPos;
|
|
2427
|
+
if (!moveData) {
|
|
2428
|
+
clearGrabbingPos();
|
|
2429
|
+
return;
|
|
2430
|
+
}
|
|
2431
|
+
onChange(moveData);
|
|
2432
|
+
setNewMove({
|
|
2433
|
+
move: moveData,
|
|
2434
|
+
withTransition: withTransition,
|
|
2435
|
+
attackedPos: attackedPos
|
|
2436
|
+
});
|
|
2437
|
+
clearGrabbingPos();
|
|
2438
|
+
clearPossibleMoves();
|
|
2439
|
+
};
|
|
2440
|
+
var handleClickForTargetCell = function handleClickForTargetCell(cellPos, withTransition) {
|
|
2441
|
+
if (withTransition === void 0) {
|
|
2442
|
+
withTransition = false;
|
|
2443
|
+
}
|
|
2444
|
+
if (clickedPos[0] === -1) return;
|
|
2445
|
+
if (!clickedFigure) return;
|
|
2446
|
+
if (clickPossibleMoves.length === 0) return;
|
|
2447
|
+
var foundPosInPossible = checkIsPossibleMove(clickPossibleMoves, cellPos);
|
|
2448
|
+
if (!foundPosInPossible) return;
|
|
2449
|
+
var _moveFigureByClick = moveFigureByClick(clickedPos, cellPos, clickedFigure),
|
|
2450
|
+
moveData = _moveFigureByClick.moveData,
|
|
2451
|
+
attackedPos = _moveFigureByClick.attackedPos;
|
|
2452
|
+
if (!moveData) return;
|
|
2453
|
+
onChange(moveData);
|
|
2454
|
+
setNewMove({
|
|
2455
|
+
move: moveData,
|
|
2456
|
+
withTransition: withTransition,
|
|
2457
|
+
attackedPos: attackedPos
|
|
2458
|
+
});
|
|
2459
|
+
clearClickedPos();
|
|
2460
|
+
clearClickPossibleMoves();
|
|
2461
|
+
};
|
|
2462
|
+
var handleClick = function handleClick(cellPos) {
|
|
2463
|
+
clearMarkedCells();
|
|
2464
|
+
clearArrows();
|
|
2465
|
+
if (clickedPos[0] === -1) {
|
|
2466
|
+
selectClickFrom(cellPos);
|
|
2467
|
+
return;
|
|
2468
|
+
}
|
|
2469
|
+
var foundPosInPossible = checkIsPossibleMove(clickPossibleMoves, cellPos);
|
|
2470
|
+
if (!foundPosInPossible) {
|
|
2471
|
+
cleanAllForClickedFigure();
|
|
2472
|
+
return;
|
|
2473
|
+
}
|
|
2474
|
+
handleClickForTargetCell(cellPos, true);
|
|
2475
|
+
};
|
|
2476
|
+
var markCell = function markCell(cellPos) {
|
|
2477
|
+
cleanAllForFigure();
|
|
2478
|
+
setMarkedCells(function (prev) {
|
|
2479
|
+
var preparedPrev = [].concat(prev);
|
|
2480
|
+
var foundCellIndex = preparedPrev.findIndex(function (_ref) {
|
|
2481
|
+
var x = _ref[0],
|
|
2482
|
+
y = _ref[1];
|
|
2483
|
+
return x === cellPos[0] && y === cellPos[1];
|
|
2484
|
+
});
|
|
2485
|
+
if (foundCellIndex !== -1) return prev.filter(function (_, i) {
|
|
2486
|
+
return i !== foundCellIndex;
|
|
2487
|
+
});
|
|
2488
|
+
return [].concat(preparedPrev, [cellPos]);
|
|
2489
|
+
});
|
|
2490
|
+
};
|
|
2491
|
+
var getHasCheckByCellPos = function getHasCheckByCellPos(_ref2) {
|
|
2492
|
+
var x = _ref2[0],
|
|
2493
|
+
y = _ref2[1];
|
|
2494
|
+
if (actualState.length === 0) return false;
|
|
2495
|
+
var cell = actualState[y][x];
|
|
2496
|
+
if (!cell.figure) return false;
|
|
2497
|
+
return hasCheck(cell, currentColor, linesWithCheck);
|
|
2498
|
+
};
|
|
2499
|
+
var startRenderArrow = function startRenderArrow(pos) {
|
|
2500
|
+
var startPos = [(pos[0] + 1) * boardConfig.cellSize - boardConfig.cellSize / 2 - 10, (pos[1] + 1) * boardConfig.cellSize - boardConfig.cellSize / 2];
|
|
2501
|
+
setStartArrowCoord(startPos);
|
|
2502
|
+
};
|
|
2503
|
+
var endRenderArrow = function endRenderArrow(_ref3) {
|
|
2504
|
+
var x = _ref3[0],
|
|
2505
|
+
y = _ref3[1];
|
|
2506
|
+
if (startArrowCoord[0] === -1) return;
|
|
2507
|
+
setArrowsCoords(function (arrows) {
|
|
2508
|
+
var copiedArrows = [].concat(arrows);
|
|
2509
|
+
return [].concat(copiedArrows, [{
|
|
2510
|
+
start: [].concat(startArrowCoord),
|
|
2511
|
+
end: [x * boardConfig.cellSize + (boardConfig.cellSize / 2 - 10), y * boardConfig.cellSize + boardConfig.cellSize / 2]
|
|
2512
|
+
}]);
|
|
2513
|
+
});
|
|
2514
|
+
setStartArrowCoord([-1, -1]);
|
|
2515
|
+
};
|
|
2516
|
+
var handleSelectFigurePicker = function handleSelectFigurePicker(figure) {
|
|
2517
|
+
var startPos = fromPos[0] > -1 ? fromPos : clickedPos;
|
|
2518
|
+
var updatedCells = JSChessEngine.transformPawnToFigure(actualState, startPos, targetPos, figure);
|
|
2519
|
+
var moveData = {
|
|
2520
|
+
figure: figure,
|
|
2521
|
+
from: startPos,
|
|
2522
|
+
to: targetPos,
|
|
2523
|
+
type: 'transform'
|
|
2524
|
+
};
|
|
2525
|
+
onChange(moveData);
|
|
2526
|
+
setActualState(updatedCells);
|
|
2527
|
+
toggleCurrentColor();
|
|
2528
|
+
setNewMove({
|
|
2529
|
+
move: moveData,
|
|
2530
|
+
withTransition: false,
|
|
2531
|
+
transformTo: figure
|
|
2532
|
+
});
|
|
2533
|
+
var linesWithCheck = JSChessEngine.getLinesWithCheck(updatedCells, currentColor, boardReversed);
|
|
2534
|
+
setLinesWithCheck(linesWithCheck);
|
|
2535
|
+
clearGrabbingPos();
|
|
2536
|
+
clearPossibleMoves();
|
|
2537
|
+
clearMarkedCells();
|
|
2538
|
+
setShowFigurePicker(false);
|
|
2539
|
+
clearClickedPos();
|
|
2540
|
+
setHoldedFigure(undefined);
|
|
2541
|
+
setFromPos([-1, -1]);
|
|
2542
|
+
setClickedPos([-1, -1]);
|
|
2543
|
+
clearArrows();
|
|
2544
|
+
};
|
|
2545
|
+
return {
|
|
2546
|
+
fromPos: fromPos,
|
|
2547
|
+
newMove: newMove,
|
|
2548
|
+
boardConfig: boardConfig,
|
|
2549
|
+
markedCells: markedCells,
|
|
2550
|
+
grabbingPos: grabbingPos,
|
|
2551
|
+
actualState: actualState,
|
|
2552
|
+
currentColor: currentColor,
|
|
2553
|
+
arrowsCoords: arrowsCoords,
|
|
2554
|
+
initialState: initialState,
|
|
2555
|
+
holdedFigure: holdedFigure,
|
|
2556
|
+
possibleMoves: possibleMoves,
|
|
2557
|
+
linesWithCheck: linesWithCheck,
|
|
2558
|
+
startArrowCoord: startArrowCoord,
|
|
2559
|
+
showFigurePicker: showFigurePicker,
|
|
2560
|
+
markCell: markCell,
|
|
2561
|
+
setNewMove: setNewMove,
|
|
2562
|
+
handleClick: handleClick,
|
|
2563
|
+
clearFromPos: clearFromPos,
|
|
2564
|
+
handleGrabEnd: handleGrabEnd,
|
|
2565
|
+
handleGrabbing: handleGrabbing,
|
|
2566
|
+
endRenderArrow: endRenderArrow,
|
|
2567
|
+
setActualState: setActualState,
|
|
2568
|
+
setCurrentColor: setCurrentColor,
|
|
2569
|
+
selectClickFrom: selectClickFrom,
|
|
2570
|
+
selectHoverFrom: selectHoverFrom,
|
|
2571
|
+
setInitialState: setInitialState,
|
|
2572
|
+
startRenderArrow: startRenderArrow,
|
|
2573
|
+
reverseChessBoard: reverseChessBoard,
|
|
2574
|
+
getHasCheckByCellPos: getHasCheckByCellPos,
|
|
2575
|
+
handleSelectFigurePicker: handleSelectFigurePicker
|
|
2576
|
+
};
|
|
2577
|
+
};
|
|
2578
|
+
|
|
2579
|
+
var HoldedFigure = function HoldedFigure(props) {
|
|
2580
|
+
var holdedFigure = props.holdedFigure,
|
|
2581
|
+
grabbingPos = props.grabbingPos,
|
|
2582
|
+
boardConfig = props.boardConfig;
|
|
2583
|
+
var isCanShowFigure = holdedFigure && grabbingPos[0] > -1 && grabbingPos[1] > -1;
|
|
2584
|
+
return isCanShowFigure && React.createElement("div", {
|
|
2585
|
+
className: cn([styles.figure, styles.holdedFigure]),
|
|
2586
|
+
style: {
|
|
2587
|
+
position: 'fixed',
|
|
2588
|
+
zIndex: 6,
|
|
2589
|
+
top: grabbingPos[1] - boardConfig.cellSize / 2 + "px",
|
|
2590
|
+
left: grabbingPos[0] - boardConfig.cellSize / 2 + "px",
|
|
2591
|
+
width: boardConfig.cellSize,
|
|
2592
|
+
height: boardConfig.cellSize
|
|
2593
|
+
}
|
|
2594
|
+
}, " ", boardConfig.piecesMap[getFigureCSS(holdedFigure)]('80%'));
|
|
2595
|
+
};
|
|
2596
|
+
|
|
2597
|
+
var BASE_BOARD_SIZE$2 = 8;
|
|
2598
|
+
var ChessBoardInteractiveLayout = function ChessBoardInteractiveLayout(props) {
|
|
2599
|
+
var _props$size = props.size,
|
|
2600
|
+
size = _props$size === void 0 ? BASE_BOARD_SIZE$2 : _props$size,
|
|
2601
|
+
boardConfig = props.boardConfig,
|
|
2602
|
+
selectedPos = props.selectedPos,
|
|
2603
|
+
possibleMoves = props.possibleMoves,
|
|
2604
|
+
holdedFigure = props.holdedFigure,
|
|
2605
|
+
grabbingPos = props.grabbingPos,
|
|
2606
|
+
markedCells = props.markedCells,
|
|
2607
|
+
onHasCheck = props.onHasCheck;
|
|
2608
|
+
return React.createElement("div", null, React.createElement(HoldedFigure, {
|
|
2609
|
+
holdedFigure: holdedFigure,
|
|
2610
|
+
grabbingPos: grabbingPos,
|
|
2611
|
+
boardConfig: boardConfig
|
|
2612
|
+
}), React.createElement("div", {
|
|
2613
|
+
className: styles.interactiveLayout
|
|
2614
|
+
}, getFilledArrayBySize(size).map(function (_, j) {
|
|
2615
|
+
return React.createElement("div", {
|
|
2616
|
+
className: styles.row,
|
|
2617
|
+
key: "interactive-layout-" + j
|
|
2618
|
+
}, getFilledArrayBySize(size).map(function (_, i) {
|
|
2619
|
+
var _cn, _cn2;
|
|
2620
|
+
return React.createElement("div", {
|
|
2621
|
+
className: cn(styles.interactiveCell, (_cn = {}, _cn[styles.selectedCell] = selectedPos[0] === i && selectedPos[1] === j, _cn[styles.markedCell] = checkIsPossibleMove(markedCells, [i, j]), _cn[styles.checkedCell] = onHasCheck([i, j]), _cn)),
|
|
2622
|
+
key: "interactive-layout-" + i,
|
|
2623
|
+
style: {
|
|
2624
|
+
width: boardConfig.cellSize,
|
|
2625
|
+
height: boardConfig.cellSize,
|
|
2626
|
+
backgroundColor: selectedPos[0] === i && selectedPos[1] === j ? boardConfig.selectedCellColor : 'transparent',
|
|
2627
|
+
border: selectedPos[0] === i && selectedPos[1] === j ? boardConfig.selectedCellBorder : 'none',
|
|
2628
|
+
boxShadow: checkIsPossibleMove(markedCells, [i, j]) ? "inset 0 0 30px " + boardConfig.markedCellColor : onHasCheck([i, j]) ? "inset 0 0 30px " + boardConfig.checkedCellColor : 'none'
|
|
2629
|
+
}
|
|
2630
|
+
}, selectedPos[0] === i && selectedPos[1] === j && holdedFigure && React.createElement("div", {
|
|
2631
|
+
className: cn([styles.figure, styles.holdedFigure], (_cn2 = {}, _cn2[styles.bluredFigure] = grabbingPos[0] !== -1, _cn2)),
|
|
2632
|
+
style: {
|
|
2633
|
+
width: boardConfig.cellSize,
|
|
2634
|
+
height: boardConfig.cellSize
|
|
2635
|
+
}
|
|
2636
|
+
}, boardConfig.piecesMap[getFigureCSS(holdedFigure)]('80%')), checkIsPossibleMove(possibleMoves, [i, j]) && React.createElement("div", {
|
|
2637
|
+
className: styles.possibleMoveMark,
|
|
2638
|
+
style: {
|
|
2639
|
+
width: boardConfig.cellSize / FACTOR_FOR_SIZE_CIRCLE_MARK,
|
|
2640
|
+
height: boardConfig.cellSize / FACTOR_FOR_SIZE_CIRCLE_MARK,
|
|
2641
|
+
backgroundColor: boardConfig.circleMarkColor
|
|
2642
|
+
}
|
|
2643
|
+
}));
|
|
2644
|
+
}));
|
|
2645
|
+
})));
|
|
2646
|
+
};
|
|
2647
|
+
|
|
2648
|
+
var ARROW_CORRECTION = 20;
|
|
2649
|
+
var Arrow = function Arrow(props) {
|
|
2650
|
+
var start = props.start,
|
|
2651
|
+
end = props.end,
|
|
2652
|
+
color = props.color;
|
|
2653
|
+
var arrowLength = useMemo(function () {
|
|
2654
|
+
return Math.sqrt(Math.pow(end[0] - start[0], 2) + Math.pow(end[1] - start[1], 2));
|
|
2655
|
+
}, [start, end]);
|
|
2656
|
+
if (arrowLength <= ARROW_CORRECTION * 3) {
|
|
2657
|
+
return null;
|
|
2658
|
+
}
|
|
2659
|
+
return React.createElement("div", {
|
|
2660
|
+
className: styles.arrow,
|
|
2661
|
+
style: {
|
|
2662
|
+
height: arrowLength - ARROW_CORRECTION,
|
|
2663
|
+
top: start[1] + "px",
|
|
2664
|
+
left: start[0] + "px",
|
|
2665
|
+
transformOrigin: "10px 0",
|
|
2666
|
+
transform: "rotate(" + calcAngle(start, end) + "deg)",
|
|
2667
|
+
backgroundColor: color
|
|
2668
|
+
}
|
|
2669
|
+
}, React.createElement("div", {
|
|
2670
|
+
className: styles.arrowEnd,
|
|
2671
|
+
style: {
|
|
2672
|
+
borderLeftColor: color
|
|
2673
|
+
}
|
|
2674
|
+
}));
|
|
2675
|
+
};
|
|
2676
|
+
|
|
2677
|
+
var ArrowLayout = function ArrowLayout(props) {
|
|
2678
|
+
var startArrowCoord = props.startArrowCoord,
|
|
2679
|
+
arrowsCoords = props.arrowsCoords,
|
|
2680
|
+
grabbingPos = props.grabbingPos,
|
|
2681
|
+
boardConfig = props.boardConfig;
|
|
2682
|
+
return React.createElement("div", {
|
|
2683
|
+
className: styles.arrowsLayer
|
|
2684
|
+
}, startArrowCoord[0] > -1 && grabbingPos[0] > -1 && React.createElement(Arrow, {
|
|
2685
|
+
start: startArrowCoord,
|
|
2686
|
+
end: grabbingPos,
|
|
2687
|
+
color: boardConfig.arrowColor
|
|
2688
|
+
}), arrowsCoords.map(function (coords, i) {
|
|
2689
|
+
return React.createElement(Arrow, Object.assign({
|
|
2690
|
+
key: i
|
|
2691
|
+
}, coords, {
|
|
2692
|
+
color: boardConfig.arrowColor
|
|
2693
|
+
}));
|
|
2694
|
+
}));
|
|
2695
|
+
};
|
|
2696
|
+
|
|
2697
|
+
var FigurePicker = function FigurePicker(props) {
|
|
2698
|
+
var boardConfig = props.boardConfig,
|
|
2699
|
+
color = props.color,
|
|
2700
|
+
onSelect = props.onSelect,
|
|
2701
|
+
_props$forPawnTransfo = props.forPawnTransform,
|
|
2702
|
+
forPawnTransform = _props$forPawnTransfo === void 0 ? false : _props$forPawnTransfo;
|
|
2703
|
+
var handleChange = useCallback(function (figure) {
|
|
2704
|
+
onSelect(figure);
|
|
2705
|
+
}, [onSelect]);
|
|
2706
|
+
return React.createElement("div", {
|
|
2707
|
+
className: styles.figurePicker
|
|
2708
|
+
}, getFiguresByColor(color, forPawnTransform).map(function (figure) {
|
|
2709
|
+
return React.createElement("div", {
|
|
2710
|
+
key: figure.type,
|
|
2711
|
+
className: styles.figurePickerItem,
|
|
2712
|
+
style: {
|
|
2713
|
+
width: boardConfig.cellSize,
|
|
2714
|
+
height: boardConfig.cellSize
|
|
2715
|
+
},
|
|
2716
|
+
onClick: function onClick() {
|
|
2717
|
+
return handleChange(figure);
|
|
2718
|
+
}
|
|
2719
|
+
}, boardConfig.piecesMap[getFigureCSS(figure)]('80%'));
|
|
2720
|
+
}));
|
|
2721
|
+
};
|
|
2722
|
+
|
|
2723
|
+
var ChessBoard = function ChessBoard(props) {
|
|
2724
|
+
var FEN = props.FEN,
|
|
2725
|
+
onChange = props.onChange,
|
|
2726
|
+
onEndGame = props.onEndGame,
|
|
2727
|
+
change = props.change,
|
|
2728
|
+
reversed = props.reversed,
|
|
2729
|
+
config = props.config;
|
|
2730
|
+
var _useChessBoardInterac = useChessBoardInteractive({
|
|
2731
|
+
onChange: onChange,
|
|
2732
|
+
onEndGame: onEndGame,
|
|
2733
|
+
config: config
|
|
2734
|
+
}),
|
|
2735
|
+
initialState = _useChessBoardInterac.initialState,
|
|
2736
|
+
fromPos = _useChessBoardInterac.fromPos,
|
|
2737
|
+
holdedFigure = _useChessBoardInterac.holdedFigure,
|
|
2738
|
+
grabbingPos = _useChessBoardInterac.grabbingPos,
|
|
2739
|
+
possibleMoves = _useChessBoardInterac.possibleMoves,
|
|
2740
|
+
newMove = _useChessBoardInterac.newMove,
|
|
2741
|
+
markedCells = _useChessBoardInterac.markedCells,
|
|
2742
|
+
arrowsCoords = _useChessBoardInterac.arrowsCoords,
|
|
2743
|
+
startArrowCoord = _useChessBoardInterac.startArrowCoord,
|
|
2744
|
+
boardConfig = _useChessBoardInterac.boardConfig,
|
|
2745
|
+
currentColor = _useChessBoardInterac.currentColor,
|
|
2746
|
+
showFigurePicker = _useChessBoardInterac.showFigurePicker,
|
|
2747
|
+
setActualState = _useChessBoardInterac.setActualState,
|
|
2748
|
+
startRenderArrow = _useChessBoardInterac.startRenderArrow,
|
|
2749
|
+
selectHoverFrom = _useChessBoardInterac.selectHoverFrom,
|
|
2750
|
+
handleGrabbing = _useChessBoardInterac.handleGrabbing,
|
|
2751
|
+
handleGrabEnd = _useChessBoardInterac.handleGrabEnd,
|
|
2752
|
+
handleClick = _useChessBoardInterac.handleClick,
|
|
2753
|
+
setInitialState = _useChessBoardInterac.setInitialState,
|
|
2754
|
+
setCurrentColor = _useChessBoardInterac.setCurrentColor,
|
|
2755
|
+
reverseChessBoard = _useChessBoardInterac.reverseChessBoard,
|
|
2756
|
+
setNewMove = _useChessBoardInterac.setNewMove,
|
|
2757
|
+
markCell = _useChessBoardInterac.markCell,
|
|
2758
|
+
getHasCheckByCellPos = _useChessBoardInterac.getHasCheckByCellPos,
|
|
2759
|
+
endRenderArrow = _useChessBoardInterac.endRenderArrow,
|
|
2760
|
+
handleSelectFigurePicker = _useChessBoardInterac.handleSelectFigurePicker;
|
|
2761
|
+
useEffect(function () {
|
|
2762
|
+
var _FENtoGameState = FENtoGameState(FEN),
|
|
2763
|
+
boardState = _FENtoGameState.boardState,
|
|
2764
|
+
currentColor = _FENtoGameState.currentColor;
|
|
2765
|
+
setInitialState(boardState);
|
|
2766
|
+
setActualState(boardState);
|
|
2767
|
+
setCurrentColor(currentColor);
|
|
2768
|
+
}, [FEN]);
|
|
2769
|
+
useEffect(function () {
|
|
2770
|
+
if (reversed) reverseChessBoard();
|
|
2771
|
+
}, [reversed]);
|
|
2772
|
+
useEffect(function () {
|
|
2773
|
+
setNewMove(change);
|
|
2774
|
+
}, [change]);
|
|
2775
|
+
return React.createElement("div", {
|
|
2776
|
+
className: styles.chessBoard
|
|
2777
|
+
}, React.createElement(ChessBoardCellsLayout, {
|
|
2778
|
+
boardConfig: boardConfig
|
|
2779
|
+
}), React.createElement(ChessBoardFiguresLayout, {
|
|
2780
|
+
initialState: initialState,
|
|
2781
|
+
change: newMove,
|
|
2782
|
+
reversed: reversed,
|
|
2783
|
+
boardConfig: boardConfig
|
|
2784
|
+
}), React.createElement(ChessBoardInteractiveLayout, {
|
|
2785
|
+
selectedPos: fromPos,
|
|
2786
|
+
possibleMoves: possibleMoves,
|
|
2787
|
+
holdedFigure: holdedFigure,
|
|
2788
|
+
grabbingPos: grabbingPos,
|
|
2789
|
+
markedCells: markedCells,
|
|
2790
|
+
boardConfig: boardConfig,
|
|
2791
|
+
onHasCheck: getHasCheckByCellPos
|
|
2792
|
+
}), React.createElement(ArrowLayout, {
|
|
2793
|
+
arrowsCoords: arrowsCoords,
|
|
2794
|
+
startArrowCoord: startArrowCoord,
|
|
2795
|
+
grabbingPos: grabbingPos,
|
|
2796
|
+
boardConfig: boardConfig
|
|
2797
|
+
}), React.createElement(ChessBoardControlLayout, {
|
|
2798
|
+
boardConfig: boardConfig,
|
|
2799
|
+
onClick: handleClick,
|
|
2800
|
+
onGrabStart: selectHoverFrom,
|
|
2801
|
+
onGrabStartRight: startRenderArrow,
|
|
2802
|
+
onGrabEnd: handleGrabEnd,
|
|
2803
|
+
onGrabEndRight: endRenderArrow,
|
|
2804
|
+
onGrabbing: handleGrabbing,
|
|
2805
|
+
onRightClick: markCell
|
|
2806
|
+
}), showFigurePicker && React.createElement("div", {
|
|
2807
|
+
className: styles.chessBoardFigurePicker
|
|
2808
|
+
}, React.createElement(FigurePicker, {
|
|
2809
|
+
boardConfig: boardConfig,
|
|
2810
|
+
color: currentColor,
|
|
2811
|
+
forPawnTransform: true,
|
|
2812
|
+
onSelect: handleSelectFigurePicker
|
|
2813
|
+
})));
|
|
2814
|
+
};
|
|
2815
|
+
|
|
2816
|
+
export { ALL_FIGURES, CHESS_BOARD_CONFIG, ChessBoard, FENtoGameState, FIGURES_LATTERS_NOTATIONS, INITIAL_CELLS, JSChessEngine, LETTERS, LETTER_TO_FIGURE_MAP, getBeatedCellFENfromState, getFENcastlingFromState, getFENpositionsFromState, getPositionByFEN, partFENtoState, prepareCastlingByFEN, stateToFEN };
|
|
2817
|
+
//# sourceMappingURL=index.modern.js.map
|