tsshogi
Version:
TypeScript library for Shogi (Japanese chess)
513 lines • 41.2 kB
JavaScript
"use strict";
// JSON Kifu Format (.jkf .json)
// See https://github.com/na2hiro/Kifu-for-JS/blob/master/packages/json-kifu-format/README.md
Object.defineProperty(exports, "__esModule", { value: true });
exports.JKFKind = exports.JKFSpecial = exports.JKFColor = void 0;
exports.importJKFString = importJKFString;
exports.importJKF = importJKF;
exports.exportJKFString = exportJKFString;
exports.exportJKF = exportJKF;
const color_1 = require("./color.cjs");
const csa_1 = require("./csa.cjs");
const kakinoki_1 = require("./kakinoki.cjs");
const move_1 = require("./move.cjs");
const piece_1 = require("./piece.cjs");
const position_1 = require("./position.cjs");
const record_1 = require("./record.cjs");
const square_1 = require("./square.cjs");
const text_1 = require("./text.cjs");
var JKFColor;
(function (JKFColor) {
JKFColor[JKFColor["BLACK"] = 0] = "BLACK";
JKFColor[JKFColor["WHITE"] = 1] = "WHITE";
})(JKFColor || (exports.JKFColor = JKFColor = {}));
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 || (exports.JKFSpecial = JKFSpecial = {}));
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 || (exports.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_1.Color.BLACK:
return JKFColor.BLACK;
default:
return JKFColor.WHITE;
}
}
function jkfToColor(color) {
switch (color) {
default:
return color_1.Color.BLACK;
case JKFColor.WHITE:
return color_1.Color.WHITE;
}
}
function pieceTypeToJKF(type) {
switch (type) {
case piece_1.PieceType.PAWN:
return JKFKind.FU;
case piece_1.PieceType.LANCE:
return JKFKind.KY;
case piece_1.PieceType.KNIGHT:
return JKFKind.KE;
case piece_1.PieceType.SILVER:
return JKFKind.GI;
case piece_1.PieceType.GOLD:
return JKFKind.KI;
case piece_1.PieceType.BISHOP:
return JKFKind.KA;
case piece_1.PieceType.ROOK:
return JKFKind.HI;
case piece_1.PieceType.KING:
return JKFKind.OU;
case piece_1.PieceType.PROM_PAWN:
return JKFKind.TO;
case piece_1.PieceType.PROM_LANCE:
return JKFKind.NY;
case piece_1.PieceType.PROM_KNIGHT:
return JKFKind.NK;
case piece_1.PieceType.PROM_SILVER:
return JKFKind.NG;
case piece_1.PieceType.HORSE:
return JKFKind.UM;
case piece_1.PieceType.DRAGON:
return JKFKind.RY;
}
}
function jkfToPieceType(kind) {
switch (kind) {
case JKFKind.FU:
return piece_1.PieceType.PAWN;
case JKFKind.KY:
return piece_1.PieceType.LANCE;
case JKFKind.KE:
return piece_1.PieceType.KNIGHT;
case JKFKind.GI:
return piece_1.PieceType.SILVER;
case JKFKind.KI:
return piece_1.PieceType.GOLD;
case JKFKind.KA:
return piece_1.PieceType.BISHOP;
case JKFKind.HI:
return piece_1.PieceType.ROOK;
case JKFKind.OU:
return piece_1.PieceType.KING;
case JKFKind.TO:
return piece_1.PieceType.PROM_PAWN;
case JKFKind.NY:
return piece_1.PieceType.PROM_LANCE;
case JKFKind.NK:
return piece_1.PieceType.PROM_KNIGHT;
case JKFKind.NG:
return piece_1.PieceType.PROM_SILVER;
case JKFKind.UM:
return piece_1.PieceType.HORSE;
case JKFKind.RY:
return piece_1.PieceType.DRAGON;
}
}
const directionModifierToJKF = {
左: "L",
直: "C",
右: "R",
上: "U",
寄: "M",
引: "D",
打: "H",
};
/**
* JSON棋譜フォーマットの文字列を読み取ります。
* @param data
*/
function importJKFString(data) {
try {
return importJKF(JSON.parse(data));
}
catch (e) {
return new Error("failed to parse JSON: " + e);
}
}
/**
* JSON棋譜フォーマットのオブジェクトを読み取ります。
* @param jkf
*/
function importJKF(jkf) {
try {
const position = new position_1.Position();
if (jkf.initial) {
switch (jkf.initial.preset) {
case "HIRATE":
position.resetBySFEN(position_1.InitialPositionSFEN.STANDARD);
break;
case "KY":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_LANCE);
break;
case "KY_R":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_RIGHT_LANCE);
break;
case "KA":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_BISHOP);
break;
case "HI":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_ROOK);
break;
case "HIKY":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_ROOK_LANCE);
break;
case "2":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_2PIECES);
break;
case "4":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_4PIECES);
break;
case "6":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_6PIECES);
break;
case "8":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_8PIECES);
break;
case "10":
position.resetBySFEN(position_1.InitialPositionSFEN.HANDICAP_10PIECES);
break;
case "OTHER":
position.resetBySFEN(position_1.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_1.Square(x, y);
const color = jkfToColor(piece.color);
const pieceType = jkfToPieceType(piece.kind);
position.board.set(square, new piece_1.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_1.Record(position);
Object.entries(jkf.header).forEach(([key, value]) => {
const metadataKey = (0, kakinoki_1.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_1.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_1.Square(m.move.to.x, m.move.to.y);
}
else if (m.move.same && record.current.prev?.move instanceof move_1.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 = (0, csa_1.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_1.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_1.Square) {
entry.move.from = {
x: move.from.file,
y: move.from.rank,
};
if (node.prev?.move instanceof move_1.Move && node.prev.move.to === move.to) {
entry.move.same = true;
}
if (move.promote) {
entry.move.promote = true;
}
else if ((0, piece_1.isPromotable)(move.pieceType) &&
((0, position_1.isPromotableRank)(move.color, move.from.rank) ||
(0, position_1.isPromotableRank)(move.color, move.to.rank))) {
entry.move.promote = false;
}
if (move.capturedPieceType) {
entry.move.capture = pieceTypeToJKF(move.capturedPieceType);
}
}
const relative = (0, text_1.getDirectionModifier)(move, position)
.split("")
.map((s) => {
return directionModifierToJKF[s] || "";
})
.join("");
if (relative) {
entry.move.relative = relative;
}
}
else {
const command = (0, csa_1.getCSASpecialMoveName)(node.move, (0, color_1.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_1.Move) {
position.doMove(node.move, { ignoreValidation: true });
}
}
return moves;
}
/**
* JSON棋譜フォーマットの文字列を出力します。
* @param record
*/
function exportJKFString(record) {
return JSON.stringify(exportJKF(record));
}
/**
* JSON棋譜フォーマットのオブジェクトを出力します。
* @param record
*/
function exportJKF(record) {
const header = {};
for (const key of record.metadata.standardMetadataKeys) {
const value = record.metadata.getStandardMetadata(key);
if (value) {
header[(0, kakinoki_1.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 position_1.InitialPositionSFEN.STANDARD:
initial = { preset: "HIRATE" };
break;
case position_1.InitialPositionSFEN.HANDICAP_LANCE:
initial = { preset: "KY" };
break;
case position_1.InitialPositionSFEN.HANDICAP_RIGHT_LANCE:
initial = { preset: "KY_R" };
break;
case position_1.InitialPositionSFEN.HANDICAP_BISHOP:
initial = { preset: "KA" };
break;
case position_1.InitialPositionSFEN.HANDICAP_ROOK:
initial = { preset: "HI" };
break;
case position_1.InitialPositionSFEN.HANDICAP_ROOK_LANCE:
initial = { preset: "HIKY" };
break;
case position_1.InitialPositionSFEN.HANDICAP_2PIECES:
initial = { preset: "2" };
break;
case position_1.InitialPositionSFEN.HANDICAP_4PIECES:
initial = { preset: "4" };
break;
case position_1.InitialPositionSFEN.HANDICAP_6PIECES:
initial = { preset: "6" };
break;
case position_1.InitialPositionSFEN.HANDICAP_8PIECES:
initial = { preset: "8" };
break;
case position_1.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_1.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(piece_1.PieceType.PAWN),
KY: blackHand.count(piece_1.PieceType.LANCE),
KE: blackHand.count(piece_1.PieceType.KNIGHT),
GI: blackHand.count(piece_1.PieceType.SILVER),
KI: blackHand.count(piece_1.PieceType.GOLD),
KA: blackHand.count(piece_1.PieceType.BISHOP),
HI: blackHand.count(piece_1.PieceType.ROOK),
},
{
FU: whiteHand.count(piece_1.PieceType.PAWN),
KY: whiteHand.count(piece_1.PieceType.LANCE),
KE: whiteHand.count(piece_1.PieceType.KNIGHT),
GI: whiteHand.count(piece_1.PieceType.SILVER),
KI: whiteHand.count(piece_1.PieceType.GOLD),
KA: whiteHand.count(piece_1.PieceType.BISHOP),
HI: whiteHand.count(piece_1.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamtmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2prZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsZ0NBQWdDO0FBQ2hDLDZGQUE2Rjs7O0FBOFA3RiwwQ0FNQztBQU1ELDhCQXlJQztBQXNGRCwwQ0FFQztBQU1ELDhCQTRHQztBQTNsQkQsbUNBQThDO0FBQzlDLCtCQUFvRTtBQUNwRSx5Q0FBMEU7QUFDMUUsaUNBQThCO0FBQzlCLG1DQUF5RDtBQUN6RCx5Q0FBZ0c7QUFDaEcscUNBQWtFO0FBQ2xFLHFDQUFrQztBQUNsQyxpQ0FBOEM7QUE2QzlDLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNsQix5Q0FBUyxDQUFBO0lBQ1QseUNBQVMsQ0FBQTtBQUNYLENBQUMsRUFIVyxRQUFRLHdCQUFSLFFBQVEsUUFHbkI7QUFVRCxJQUFZLFVBZ0JYO0FBaEJELFdBQVksVUFBVTtJQUNwQiw2QkFBZSxDQUFBO0lBQ2YsK0JBQWlCLENBQUE7SUFDakIsdUNBQXlCLENBQUE7SUFDekIsaUNBQW1CLENBQUE7SUFDbkIsMkNBQTZCLENBQUE7SUFDN0Isc0RBQXdDLENBQUE7SUFDeEMsc0RBQXdDLENBQUE7SUFDeEMsaUNBQW1CLENBQUE7SUFDbkIsNkJBQWUsQ0FBQTtJQUNmLG1DQUFxQixDQUFBO0lBQ3JCLHFDQUF1QixDQUFBO0lBQ3ZCLDZCQUFlLENBQUE7SUFDZiw2QkFBZSxDQUFBO0lBQ2YsK0JBQWlCLENBQUE7SUFDakIsNkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBaEJXLFVBQVUsMEJBQVYsVUFBVSxRQWdCckI7QUFvQ0QsSUFBWSxPQWVYO0FBZkQsV0FBWSxPQUFPO0lBQ2pCLG9CQUFTLENBQUE7SUFDVCxvQkFBUyxDQUFBO0lBQ1Qsb0JBQVMsQ0FBQTtJQUNULG9CQUFTLENBQUE7SUFDVCxvQkFBUyxDQUFBO0lBQ1Qsb0JBQVMsQ0FBQTtJQUNULG9CQUFTLENBQUE7SUFDVCxvQkFBUyxDQUFBO0lBQ1Qsb0JBQVMs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