UNPKG

tsgammon-core

Version:

A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui

70 lines (69 loc) 3.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.toFIBSBoard = void 0; const BoardState_1 = require("../BoardState"); const BoardStateNode_1 = require("../BoardStateNode"); const FIBSBoard_1 = require("./FIBSBoard"); /** * BoardState/BoardStateNode/number[]で表された状況を、FIBS Clientの仕様で * 文字列(FIBS形式)に変換する * * http://www.fibs.com/fibs_interface.html#board_state * * ※ omitUnusedDiceを指定すると、使えないダイスは文字列に含めなくなる。 * 1つだけ駒を動かした状態を表現するのに使用しているが、通常は必要なく、 * 上記の仕様に合致しているかも不明瞭。 * * @param arg 変換対象 * @param opt.colour 自分の駒をOにするかX(既定値)にするか * @param opt.direction 自分の動かす向きを1->24と24->1(既定値)のどちらでエンコードするか * @param opt.turn 手番はOかXか(省略時は自分=colourと同じ) * @param opt.omitUnusedDice 使えないダイスロールを含めない * @returns FIBS形式の文字列 */ function toFIBSBoard(arg, opt = {}) { const boardOrNode = Array.isArray(arg.board) ? (0, BoardState_1.boardState)(arg.board) : arg.board; const flagged = Object.assign({ hasValue: false }, boardOrNode); const node = flagged.hasValue ? flagged : (0, BoardStateNode_1.nodeWithEmptyDice)(flagged); const cube = Object.assign({ cubeValue: 1, playerMayDouble: true, opponentMayDouble: true }, arg.cube); const matchScore = Object.assign({ matchLen: 9999, playerScore: 0, opponentScore: 0 }, arg.matchScore); return (0, FIBSBoard_1.encodeFIBSBoardString)(boardStateToFIBSBoard(node, cube, matchScore, opt)); } exports.toFIBSBoard = toFIBSBoard; function boardStateToFIBSBoard(node, cube, matchScore, opt) { const { player = 'You', opponent = 'opponent', colour = FIBSBoard_1.COLOUR.X, direction = FIBSBoard_1.DIRECTION.DESC, omitUnusedDice = false, } = opt; const board = node.board; const dices = omitUnusedDice ? node.dices.filter((dice) => !dice.used) : node.dices; const diceRoll = dices.length >= 2 ? { dice1: dices[0].pip, dice2: dices[1].pip } : dices.length === 1 ? { dice1: dices[0].pip, dice2: 0 } : { dice1: 0, dice2: 0 }; const canMove = node.hasValue ? node.dices.filter((dice) => !dice.used).length - node.lastMoves.length : 0; const posArr = colour === FIBSBoard_1.COLOUR.O ? board.points : board.points.map((p) => -p); // 手番はデフォルトでは自分(COLOURで決まる)で、指定があればそれを優先 const { turn = colour === FIBSBoard_1.COLOUR.O ? FIBSBoard_1.TURN.O : FIBSBoard_1.TURN.X } = opt; const pos = direction === FIBSBoard_1.DIRECTION.ASC ? posArr : posArr.map((_, i, arr) => posArr[arr.length - 1 - i]); const playerOnHome = board.myBornOff; const opponentOnHome = board.opponentBornOff; const { home, bar } = direction === FIBSBoard_1.DIRECTION.ASC ? { home: 25, bar: 0 } : { home: 0, bar: 25 }; return (0, FIBSBoard_1.initBoard)(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ player, opponent, turn, pos }, diceRoll), { playerOnHome, opponentOnHome }), cube), matchScore), { colour, direction, home, bar, canMove })); }