xiangqiground
Version:
75 lines • 1.88 kB
JavaScript
import { pos2key, invRanks } from './util.js';
import * as cg from './types.js';
export const initial = 'rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR';
const roles = {
p: 'pawn',
r: 'chariot',
n: 'horse',
h: 'horse',
b: 'elephant',
e: 'elephant',
a: 'advisor',
k: 'king',
c: 'cannon',
};
const letters = {
pawn: 'p',
chariot: 'r',
horse: 'n',
elephant: 'b',
advisor: 'a',
king: 'k',
cannon: 'c',
};
export function read(fen) {
if (fen === 'start')
fen = initial;
const pieces = new Map();
let row = 9, col = 0;
for (const c of fen) {
switch (c) {
case ' ':
return pieces;
case '/':
--row;
if (row < 0)
return pieces;
col = 0;
break;
default: {
const nb = c.charCodeAt(0);
if (nb < 58)
col += nb - 48;
else {
const role = c.toLowerCase();
console.log(col, row);
pieces.set(pos2key([col, row]), {
role: roles[role],
color: c === role ? 'black' : 'white',
});
++col;
}
}
}
}
return pieces;
}
export function write(pieces) {
return invRanks
.map(y => cg.files
.map(x => {
const piece = pieces.get((x + y));
if (piece) {
let p = letters[piece.role];
if (piece.color === 'white')
p = p.toUpperCase();
return p;
}
else
return '1';
})
.join(''))
.join('/')
.replace(/1{2,}/g, s => s.length.toString());
}
//# sourceMappingURL=fen.js.map