| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166 |
1
8
1
2
1
1
1
1
1
1
1
33
33
790
783
807
1
1
1
33
33
264
33
1
264
264
1173
1173
379
379
794
794
1
794
794
794
407
103
80
88
66
50
1
33
23
9
1
33
1
33
23
10
1
66
52
14
1
790
1
790
790
6320
50560
50560
25417
25417
3177
25417
25143
25143
2360
25143
790
1
790
785
5
1
790
1
790
1
1580
16
1564
| "use strict";
Object.defineProperties(exports, {
FEN: {get: function() {
return FEN;
}},
standard: {get: function() {
return standard;
}},
standardPosition: {get: function() {
return standardPosition;
}},
__esModule: {value: true}
});
var $__0 = require('../brands'),
WHITE = $__0.WHITE,
BLACK = $__0.BLACK;
var $__1 = require('../piece/standard'),
Pawn = $__1.Pawn,
Rook = $__1.Rook,
Knight = $__1.Knight,
Bishop = $__1.Bishop,
King = $__1.King,
Queen = $__1.Queen;
var Castling = require('../piece/king/castling').Castling;
var Position = require('../position').Position;
var Board = require('../board').Board;
var Point = require('../point').Point;
var FEN = {
parse: function(fenStr) {
var $__6 = $traceurRuntime.assertObject(fenStr.split(' ')),
ranks = $__6[0],
activeColor = $__6[1],
castling = $__6[2],
enPassantTarget = $__6[3],
halfmoveClock = $__6[4],
fullmoveClock = $__6[5];
return new Position({
board: parseRanks(ranks),
activeColor: parseActiveColor(activeColor),
castling: parseCastling(castling),
enPassantTarget: parseEPTarget(enPassantTarget),
halfmoveClock: parseClock(halfmoveClock),
fullmoveClock: parseClock(fullmoveClock)
});
},
stringify: function(position) {
return stringifyPosition(position);
},
get standard() {
return standard;
},
get standardPosition() {
return standardPosition;
}
};
var standard = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';
var standardPosition = FEN.parse(standard);
function parseRanks(ranks) {
var board = new Board();
ranks.split('/').forEach((function(rank, i) {
parseRank(rank, board, i);
}));
return board;
}
function parseRank(rank, board, i) {
var cells = rank.split('');
for (var j = 0,
c = 0; j < board.files; c++) {
var cell = rank[$traceurRuntime.toProperty(c)];
if (!isNaN(Number(cell))) {
j += Number(cell);
continue;
}
board.placePiece(createPiece(cell), new Point(j, i));
j += 1;
}
}
function createPiece(piece) {
var lowered = piece.toLowerCase();
var options = {color: lowered === piece ? BLACK : WHITE};
switch (lowered) {
case 'p':
return new Pawn(options);
case 'r':
return new Rook(options);
case 'n':
return new Knight(options);
case 'b':
return new Bishop(options);
case 'k':
return new King(options);
case 'q':
return new Queen(options);
}
}
function parseActiveColor(activeColor) {
switch (activeColor) {
case 'w':
return WHITE;
case 'b':
return BLACK;
}
}
function parseCastling(castling) {
return new Castling({fenEncoding: castling});
}
function parseEPTarget(enPassantTarget) {
switch (enPassantTarget) {
case '-':
return null;
default:
return enPassantTarget;
}
}
function parseClock(clock) {
if (clock == null) {
return null;
}
return Number(clock);
}
function stringifyPosition(position) {
return [stringifyRanks(position), stringifyActiveColor(position.activeColor), stringifyCastling(position.castling), stringifyEPTarget(position.enPassantTarget), stringifyClock(position.halfmoveClock), stringifyClock(position.fullmoveClock)].filter(Boolean).join(' ');
}
function stringifyRanks(position) {
var ranks = '';
for (var i = 0; i < 8; i++) {
for (var j = 0,
count = 0; j < 8; j++) {
var piece = position.pieceByCoords(new Point(j, i));
if (piece == null) {
count += 1;
if (j === 7) {
ranks += ("" + (count ? count : '') + (i !== 7 ? '/' : ''));
}
continue;
}
ranks += ("" + (count ? count : '') + piece.fenEncoding);
if (j === 7 && i !== 7) {
ranks += '/';
}
count = 0;
}
}
return ranks;
}
function stringifyActiveColor(activeColor) {
switch (activeColor) {
case WHITE:
return 'w';
case BLACK:
return 'b';
}
}
function stringifyCastling(castling) {
return String(castling);
}
function stringifyEPTarget(enPassantTarget) {
return String(enPassantTarget);
}
function stringifyClock(clock) {
if (clock == null) {
return null;
}
return String(clock);
}
|