UNPKG

xiangqiground

Version:
77 lines (71 loc) 1.66 kB
import { pos2key, invRanks } from './util.js'; import * as cg from './types.js'; export const initial: cg.FEN = 'rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR'; const roles: { [letter: string]: cg.Role } = { 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: cg.FEN): cg.Pieces { if (fen === 'start') fen = initial; const pieces: cg.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: cg.Pieces): cg.FEN { return invRanks .map(y => cg.files .map(x => { const piece = pieces.get((x + y) as cg.Key); 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()); }