UNPKG

tsshogi

Version:

TypeScript library for Shogi (Japanese chess)

513 lines 41.2 kB
"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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