tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
70 lines (69 loc) • 3.48 kB
JavaScript
;
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 }));
}