tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
130 lines (129 loc) • 4.28 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.decodeFIBS = void 0;
const BoardState_1 = require("../BoardState");
const BoardStateNode_1 = require("../BoardStateNode");
const FIBSBoard_1 = require("./FIBSBoard");
/**
* FIBS形式の文字列を解析する。
* @param fibs FIBS形式の文字列
* @returns 解析結果、不備がある場合は isValid:false が返る
*/
function decodeFIBS(fibs) {
const arr = fibs.split(':');
if (arr.length !== 53) {
return { isValid: false };
}
const result = { isValid: true };
function isInvalid() {
result.isValid = false;
return undefined;
}
const player = arr[1];
const opponent = arr[2];
const matchLen = parseInt(arr[3]);
const playerScore = parseInt(arr[4]);
const opponentScore = parseInt(arr[5]);
const pos = arr.slice(6, 32).map((n) => parseInt(n));
const turn = arr[32] === '-1'
? FIBSBoard_1.TURN.X
: arr[32] === '0'
? FIBSBoard_1.TURN.OVER
: arr[32] === '1'
? FIBSBoard_1.TURN.O
: isInvalid();
const d1 = parseInt(arr[33]);
const d2 = parseInt(arr[34]);
const d3 = parseInt(arr[35]);
const d4 = parseInt(arr[36]);
const { dicePip1, dicePip2 } = d1 === 0 && d2 === 0
? { dicePip1: d3, dicePip2: d4 }
: { dicePip1: d1, dicePip2: d2 };
const { dice1, dice2 } = {
dice1: asDicePip(dicePip1),
dice2: asDicePip(dicePip2),
};
function asDicePip(pip) {
if (pip === 0) {
return 0;
}
if (1 <= pip && pip <= 6) {
return pip;
}
return isInvalid();
}
const cubeValue = parseInt(arr[37]);
const playerMayDouble = arr[38] === '1';
const opponentMayDouble = arr[39] === '1';
const colour = arr[41] === '-1' ? FIBSBoard_1.COLOUR.X : arr[41] === '1' ? FIBSBoard_1.COLOUR.O : isInvalid();
const direction = arr[42] === '-1'
? FIBSBoard_1.DIRECTION.DESC
: arr[42] === '1'
? FIBSBoard_1.DIRECTION.ASC
: isInvalid();
const playerOnHome = parseInt(arr[45]);
const opponentOnHome = parseInt(arr[46]);
const redoubles = parseInt(arr[52]);
if (!result.isValid) {
return { isValid: false };
}
const fibsBoard = (0, FIBSBoard_1.initBoard)({
player,
opponent,
matchLen,
playerScore,
opponentScore,
pos,
turn,
dice1,
dice2,
cubeValue: cubeValue,
playerMayDouble,
opponentMayDouble,
colour,
direction,
playerOnHome,
opponentOnHome,
redoubles,
});
const node = toNode(fibsBoard);
const cube = toCube(fibsBoard);
const matchScore = toMatchScore(fibsBoard);
return { isValid: true, player, opponent, node, cube, matchScore };
}
exports.decodeFIBS = decodeFIBS;
function toNode(fibs) {
const posArr = fibs.direction === FIBSBoard_1.DIRECTION.ASC
? fibs.pos
: fibs.direction === FIBSBoard_1.DIRECTION.DESC
? fibs.pos.map((_, idx, array) => array[array.length - 1 - idx])
: [];
const pos = fibs.colour === FIBSBoard_1.COLOUR.O
? posArr
: fibs.colour === FIBSBoard_1.COLOUR.X
? posArr.map((p) => (p === 0 ? 0 : -p))
: [];
const fibsBoard = (0, BoardState_1.boardState)(pos, [fibs.playerOnHome, fibs.opponentOnHome]);
const board = (fibs.turn === FIBSBoard_1.TURN.O && fibs.colour === FIBSBoard_1.COLOUR.X) ||
(fibs.turn === FIBSBoard_1.TURN.X && fibs.colour === FIBSBoard_1.COLOUR.O)
? fibsBoard.revert()
: fibsBoard;
const { dice1, dice2 } = fibs;
return dice1 === 0 || dice2 === 0
? (0, BoardStateNode_1.nodeWithEmptyDice)(board)
: (0, BoardStateNode_1.boardStateNode)(board, { dice1, dice2 });
}
function toCube(fibs) {
return {
cubeValue: fibs.cubeValue,
playerMayDouble: fibs.playerMayDouble,
opponentMayDouble: fibs.opponentMayDouble,
};
}
function toMatchScore(fibs) {
return {
matchLen: fibs.matchLen,
playerScore: fibs.playerScore,
opponentScore: fibs.opponentScore,
};
}