tsshogi
Version:
TypeScript library for Shogi (Japanese chess)
506 lines • 40.5 kB
JavaScript
// JSON Kifu Format (.jkf .json)
// See https://github.com/na2hiro/Kifu-for-JS/blob/master/packages/json-kifu-format/README.md
import { Color, reverseColor } from "./color.mjs";
import { getSpecialMoveByName, getCSASpecialMoveName } from "./csa.mjs";
import { kakinokiToMetadataKey, metadataKeyToKakinoki } from "./kakinoki.mjs";
import { Move } from "./move.mjs";
import { Piece, PieceType, isPromotable } from "./piece.mjs";
import { InitialPositionSFEN, Position, isPromotableRank } from "./position.mjs";
import { Record } from "./record.mjs";
import { Square } from "./square.mjs";
import { getDirectionModifier } from "./text.mjs";
export var JKFColor;
(function (JKFColor) {
JKFColor[JKFColor["BLACK"] = 0] = "BLACK";
JKFColor[JKFColor["WHITE"] = 1] = "WHITE";
})(JKFColor || (JKFColor = {}));
export var JKFSpecial;
(function (JKFSpecial) {
JKFSpecial["TORYO"] = "TORYO";
JKFSpecial["CHUDAN"] = "CHUDAN";
JKFSpecial["SENNICHITE"] = "SENNICHITE";
JKFSpecial["TIME_UP"] = "TIME_UP";
JKFSpecial["ILLEGAL_MOVE"] = "ILLEGAL_MOVE";
JKFSpecial["BLACK_ILLEGAL_ACTION"] = "+ILLEGAL_ACTION";
JKFSpecial["WHITE_ILLEGAL_ACTION"] = "-ILLEGAL_ACTION";
JKFSpecial["JISHOGI"] = "JISHOGI";
JKFSpecial["KACHI"] = "KACHI";
JKFSpecial["HIKIWAKE"] = "HIKIWAKE";
JKFSpecial["MAX_MOVES"] = "MAX_MOVES";
JKFSpecial["MATTA"] = "MATTA";
JKFSpecial["TSUMI"] = "TSUMI";
JKFSpecial["FUZUMI"] = "FUZUMI";
JKFSpecial["ERROR"] = "ERROR";
})(JKFSpecial || (JKFSpecial = {}));
export var JKFKind;
(function (JKFKind) {
JKFKind["FU"] = "FU";
JKFKind["KY"] = "KY";
JKFKind["KE"] = "KE";
JKFKind["GI"] = "GI";
JKFKind["KI"] = "KI";
JKFKind["KA"] = "KA";
JKFKind["HI"] = "HI";
JKFKind["OU"] = "OU";
JKFKind["TO"] = "TO";
JKFKind["NY"] = "NY";
JKFKind["NK"] = "NK";
JKFKind["NG"] = "NG";
JKFKind["UM"] = "UM";
JKFKind["RY"] = "RY";
})(JKFKind || (JKFKind = {}));
function msToJKFTimeMS(ms) {
return {
m: Math.floor(ms / (60 * 1000)),
s: Math.floor(ms / 1000) % 60,
};
}
function msToJKFTimeHMS(ms) {
return {
h: Math.floor(ms / (60 * 60 * 1000)),
m: Math.floor(ms / (60 * 1000)) % 60,
s: Math.floor(ms / 1000) % 60,
};
}
function jkfTimeToMs(time) {
return ((time.h || 0) * 60 * 60 + time.m * 60 + time.s) * 1000;
}
function colorToJKF(color) {
switch (color) {
case Color.BLACK:
return JKFColor.BLACK;
default:
return JKFColor.WHITE;
}
}
function jkfToColor(color) {
switch (color) {
default:
return Color.BLACK;
case JKFColor.WHITE:
return Color.WHITE;
}
}
function pieceTypeToJKF(type) {
switch (type) {
case PieceType.PAWN:
return JKFKind.FU;
case PieceType.LANCE:
return JKFKind.KY;
case PieceType.KNIGHT:
return JKFKind.KE;
case PieceType.SILVER:
return JKFKind.GI;
case PieceType.GOLD:
return JKFKind.KI;
case PieceType.BISHOP:
return JKFKind.KA;
case PieceType.ROOK:
return JKFKind.HI;
case PieceType.KING:
return JKFKind.OU;
case PieceType.PROM_PAWN:
return JKFKind.TO;
case PieceType.PROM_LANCE:
return JKFKind.NY;
case PieceType.PROM_KNIGHT:
return JKFKind.NK;
case PieceType.PROM_SILVER:
return JKFKind.NG;
case PieceType.HORSE:
return JKFKind.UM;
case PieceType.DRAGON:
return JKFKind.RY;
}
}
function jkfToPieceType(kind) {
switch (kind) {
case JKFKind.FU:
return PieceType.PAWN;
case JKFKind.KY:
return PieceType.LANCE;
case JKFKind.KE:
return PieceType.KNIGHT;
case JKFKind.GI:
return PieceType.SILVER;
case JKFKind.KI:
return PieceType.GOLD;
case JKFKind.KA:
return PieceType.BISHOP;
case JKFKind.HI:
return PieceType.ROOK;
case JKFKind.OU:
return PieceType.KING;
case JKFKind.TO:
return PieceType.PROM_PAWN;
case JKFKind.NY:
return PieceType.PROM_LANCE;
case JKFKind.NK:
return PieceType.PROM_KNIGHT;
case JKFKind.NG:
return PieceType.PROM_SILVER;
case JKFKind.UM:
return PieceType.HORSE;
case JKFKind.RY:
return PieceType.DRAGON;
}
}
const directionModifierToJKF = {
左: "L",
直: "C",
右: "R",
上: "U",
寄: "M",
引: "D",
打: "H",
};
/**
* JSON棋譜フォーマットの文字列を読み取ります。
* @param data
*/
export function importJKFString(data) {
try {
return importJKF(JSON.parse(data));
}
catch (e) {
return new Error("failed to parse JSON: " + e);
}
}
/**
* JSON棋譜フォーマットのオブジェクトを読み取ります。
* @param jkf
*/
export function importJKF(jkf) {
try {
const position = new Position();
if (jkf.initial) {
switch (jkf.initial.preset) {
case "HIRATE":
position.resetBySFEN(InitialPositionSFEN.STANDARD);
break;
case "KY":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_LANCE);
break;
case "KY_R":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_RIGHT_LANCE);
break;
case "KA":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_BISHOP);
break;
case "HI":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_ROOK);
break;
case "HIKY":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_ROOK_LANCE);
break;
case "2":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_2PIECES);
break;
case "4":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_4PIECES);
break;
case "6":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_6PIECES);
break;
case "8":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_8PIECES);
break;
case "10":
position.resetBySFEN(InitialPositionSFEN.HANDICAP_10PIECES);
break;
case "OTHER":
position.resetBySFEN(InitialPositionSFEN.EMPTY);
if (jkf.initial.data) {
position.setColor(jkfToColor(jkf.initial.data.color));
if (Array.isArray(jkf.initial.data.board)) {
for (let x = 1; x <= 9; x++) {
for (let y = 1; y <= 9; y++) {
const piece = jkf.initial.data.board[x - 1][y - 1];
if (piece?.kind) {
const square = new Square(x, y);
const color = jkfToColor(piece.color);
const pieceType = jkfToPieceType(piece.kind);
position.board.set(square, new Piece(color, pieceType));
}
}
}
}
for (const kind of Object.values(JKFKind)) {
const b = jkf.initial.data.hands[0][kind] || 0;
position.blackHand.set(jkfToPieceType(kind), b);
const w = jkf.initial.data.hands[1][kind] || 0;
position.whiteHand.set(jkfToPieceType(kind), w);
}
}
break;
default:
return new Error("initial position preset not supported: " + jkf.initial.preset);
}
}
const record = new Record(position);
Object.entries(jkf.header).forEach(([key, value]) => {
const metadataKey = kakinokiToMetadataKey(key);
if (metadataKey) {
record.metadata.setStandardMetadata(metadataKey, value);
}
else {
record.metadata.setCustomMetadata(key, value);
}
});
const stack = [{ ply: 0, moves: jkf.moves }];
while (stack.length > 0) {
const entry = stack.pop();
record.goto(entry.ply);
for (const m of entry.moves) {
const ply = record.current.ply;
if (m.move) {
let from;
if (m.move.from) {
from = new Square(m.move.from.x, m.move.from.y);
}
else if (m.move.relative && m.move.relative !== "H") {
return new Error("unnormalized-JKF not supported.");
}
else {
from = jkfToPieceType(m.move.piece);
}
let to;
if (m.move.to) {
to = new Square(m.move.to.x, m.move.to.y);
}
else if (m.move.same && record.current.prev?.move instanceof Move) {
to = record.current.prev.move.to;
}
else {
return new Error("invalid move: " + JSON.stringify(m.move));
}
let move = record.position.createMove(from, to);
if (!move) {
return new Error("invalid move: " + JSON.stringify(m.move));
}
if (m.move.promote) {
move = move.withPromote();
}
record.append(move, { ignoreValidation: true });
}
if (m.special) {
const move = getSpecialMoveByName(m.special, record.current.nextColor);
if (move) {
record.append(move);
}
}
if (m.time) {
record.current.setElapsedMs(jkfTimeToMs(m.time.now));
}
if (m.comments) {
record.current.comment = m.comments.join("\n");
}
if (m.forks) {
for (let i = m.forks.length - 1; i >= 0; i--) {
stack.push({ ply: ply, moves: m.forks[i] });
}
}
}
}
record.goto(0);
record.resetAllBranchSelection();
return record;
}
catch (e) {
return new Error("failed to JKF: " + e);
}
}
function buildJKFMoves(node, basePos) {
const position = basePos.clone();
const moves = [];
for (; node; node = node.next) {
const entry = {
time: {
now: msToJKFTimeMS(node.elapsedMs),
total: msToJKFTimeHMS(node.totalElapsedMs),
},
};
if (node.move instanceof Move) {
const move = node.move;
entry.move = {
color: colorToJKF(move.color),
piece: pieceTypeToJKF(move.pieceType),
to: {
x: move.to.file,
y: move.to.rank,
},
};
if (move.from instanceof Square) {
entry.move.from = {
x: move.from.file,
y: move.from.rank,
};
if (node.prev?.move instanceof Move && node.prev.move.to === move.to) {
entry.move.same = true;
}
if (move.promote) {
entry.move.promote = true;
}
else if (isPromotable(move.pieceType) &&
(isPromotableRank(move.color, move.from.rank) ||
isPromotableRank(move.color, move.to.rank))) {
entry.move.promote = false;
}
if (move.capturedPieceType) {
entry.move.capture = pieceTypeToJKF(move.capturedPieceType);
}
}
const relative = getDirectionModifier(move, position)
.split("")
.map((s) => {
return directionModifierToJKF[s] || "";
})
.join("");
if (relative) {
entry.move.relative = relative;
}
}
else {
const command = getCSASpecialMoveName(node.move, reverseColor(node.nextColor));
if (!command) {
break;
}
entry.special = command;
}
if (node.comment) {
entry.comments = node.comment.trimEnd().split("\n");
}
if (node.isFirstBranch) {
const forks = [];
for (let branch = node.branch; branch; branch = branch.branch) {
forks.push(buildJKFMoves(branch, position));
}
if (forks.length !== 0) {
entry.forks = forks;
}
}
moves.push(entry);
if (node.move instanceof Move) {
position.doMove(node.move, { ignoreValidation: true });
}
}
return moves;
}
/**
* JSON棋譜フォーマットの文字列を出力します。
* @param record
*/
export function exportJKFString(record) {
return JSON.stringify(exportJKF(record));
}
/**
* JSON棋譜フォーマットのオブジェクトを出力します。
* @param record
*/
export function exportJKF(record) {
const header = {};
for (const key of record.metadata.standardMetadataKeys) {
const value = record.metadata.getStandardMetadata(key);
if (value) {
header[metadataKeyToKakinoki(key)] = value;
}
}
for (const key of record.metadata.customMetadataKeys) {
const value = record.metadata.getCustomMetadata(key);
if (value) {
header[key] = value;
}
}
let initial;
const blackHand = record.initialPosition.blackHand;
const whiteHand = record.initialPosition.whiteHand;
switch (record.initialPosition.sfen) {
case InitialPositionSFEN.STANDARD:
initial = { preset: "HIRATE" };
break;
case InitialPositionSFEN.HANDICAP_LANCE:
initial = { preset: "KY" };
break;
case InitialPositionSFEN.HANDICAP_RIGHT_LANCE:
initial = { preset: "KY_R" };
break;
case InitialPositionSFEN.HANDICAP_BISHOP:
initial = { preset: "KA" };
break;
case InitialPositionSFEN.HANDICAP_ROOK:
initial = { preset: "HI" };
break;
case InitialPositionSFEN.HANDICAP_ROOK_LANCE:
initial = { preset: "HIKY" };
break;
case InitialPositionSFEN.HANDICAP_2PIECES:
initial = { preset: "2" };
break;
case InitialPositionSFEN.HANDICAP_4PIECES:
initial = { preset: "4" };
break;
case InitialPositionSFEN.HANDICAP_6PIECES:
initial = { preset: "6" };
break;
case InitialPositionSFEN.HANDICAP_8PIECES:
initial = { preset: "8" };
break;
case InitialPositionSFEN.HANDICAP_10PIECES:
initial = { preset: "10" };
break;
default:
initial = {
preset: "OTHER",
data: {
color: colorToJKF(record.initialPosition.color),
board: (function () {
const board = [[], [], [], [], [], [], [], [], []];
for (let x = 1; x <= 9; x++) {
for (let y = 1; y <= 9; y++) {
const square = new Square(x, y);
const piece = record.initialPosition.board.at(square);
board[x - 1][y - 1] = piece
? {
color: colorToJKF(piece.color),
kind: pieceTypeToJKF(piece.type),
}
: {};
}
}
return board;
})(),
hands: [
{
FU: blackHand.count(PieceType.PAWN),
KY: blackHand.count(PieceType.LANCE),
KE: blackHand.count(PieceType.KNIGHT),
GI: blackHand.count(PieceType.SILVER),
KI: blackHand.count(PieceType.GOLD),
KA: blackHand.count(PieceType.BISHOP),
HI: blackHand.count(PieceType.ROOK),
},
{
FU: whiteHand.count(PieceType.PAWN),
KY: whiteHand.count(PieceType.LANCE),
KE: whiteHand.count(PieceType.KNIGHT),
GI: whiteHand.count(PieceType.SILVER),
KI: whiteHand.count(PieceType.GOLD),
KA: whiteHand.count(PieceType.BISHOP),
HI: whiteHand.count(PieceType.ROOK),
},
],
},
};
break;
}
const moves = [
record.first.comment ? { comments: record.first.comment.trimEnd().split("\n") } : {},
...(record.first.next ? buildJKFMoves(record.first.next, record.initialPosition) : []),
];
return {
header,
initial,
moves,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamtmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2prZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FBZ0M7QUFDaEMsNkZBQTZGO0FBRTdGLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekQsT0FBTyxFQUFxQixtQkFBbUIsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEcsT0FBTyxFQUFrQyxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFpRDlDLE1BQU0sQ0FBTixJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDbEIseUNBQVMsQ0FBQTtJQUNULHlDQUFTLENBQUE7QUFDWCxDQUFDLEVBSFcsUUFBUSxLQUFSLFFBQVEsUUFHbkI7QUFVRCxNQUFNLENBQU4sSUFBWSxVQWdCWDtBQWhCRCxXQUFZLFVBQVU7SUFDcEIsNkJBQWUsQ0FBQTtJQUNmLCtCQUFpQixDQUFBO0lBQ2pCLHVDQUF5QixDQUFBO0lBQ3pCLGlDQUFtQixDQUFBO0lBQ25CLDJDQUE2QixDQUFBO0lBQzdCLHNEQUF3QyxDQUFBO0lBQ3hDLHNEQUF3QyxDQUFBO0lBQ3hDLGlDQUFtQixDQUFBO0lBQ25CLDZCQUFlLENBQUE7SUFDZixtQ0FB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