| 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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183 |
1
11
1
2
1
1
1
1
1
1
1
1
1
1
32
32
206
199
2223
1
1
1
32
32
256
32
1
256
256
1133
1133
371
371
762
762
1
762
762
762
391
99
76
84
64
48
1
32
23
9
1
32
1
32
23
9
1
32
25
7
1
206
1
206
206
1648
13184
13184
6729
6729
841
6729
6455
6455
608
6455
206
1
206
201
5
1
206
1
206
205
1
1
206
206
1
206
8
198
1
32
| "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('./standard'),
Pawn = $__1.Pawn,
Rook = $__1.Rook,
Knight = $__1.Knight,
Bishop = $__1.Bishop,
King = $__1.King,
Queen = $__1.Queen;
var Castling = require('./castling').Castling;
var $__3 = require('./eptarget'),
EnPassantTarget = $__3.EnPassantTarget,
NullEnPassantTarget = $__3.NullEnPassantTarget;
var Position = require('./position').Position;
var Board = require('./board').Board;
var Point = require('./point').Point;
var HalfmoveClock = require('./halfmoveclock').HalfmoveClock;
var squareCoords = require('./util').squareCoords;
var FEN = {
parse: function(fenStr) {
var $__9 = $traceurRuntime.assertObject(fenStr.split(' ')),
ranks = $__9[0],
activeColor = $__9[1],
castling = $__9[2],
enPassantTarget = $__9[3],
halfmoveClock = $__9[4],
fullmoveCounter = $__9[5];
return new Position({
board: parseRanks(ranks),
activeColor: parseActiveColor(activeColor),
castling: parseCastling(castling),
enPassantTarget: parseEPTarget(enPassantTarget),
halfmoveClock: parseClock(halfmoveClock),
fullmoveCounter: parseCounter(fullmoveCounter)
});
},
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 EnPassantTarget.null();
default:
return EnPassantTarget.fromPoint(squareCoords(enPassantTarget));
}
}
function parseCounter(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), stringifyCounter(position.fullmoveCounter)].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) {
if (enPassantTarget == null || enPassantTarget instanceof NullEnPassantTarget) {
return '-';
}
return String(enPassantTarget);
}
function stringifyClock(clock) {
Eif (String(clock) === '0') {
return clock.source;
}
return String(clock);
}
function stringifyCounter(counter) {
if (counter == null) {
return null;
}
return String(counter);
}
function parseClock(halfmoveClock) {
return new HalfmoveClock(halfmoveClock != null ? Number(halfmoveClock) : 0, halfmoveClock);
}
|