UNPKG

tsshogi

Version:

TypeScript library for Shogi (Japanese chess)

506 lines 40.5 kB
// 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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