tsgammon-core
Version:
A Backgammon library for Typescript, formerly developed as a part of tsgammon-ui
106 lines (105 loc) • 5.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.toSGState = exports.toCBState = exports.GameStatus = void 0;
const BoardStateNode_1 = require("../../BoardStateNode");
const BoardState_1 = require("../../BoardState");
const CubeState_1 = require("../../CubeState");
const EOGStatus_1 = require("../../EOGStatus");
const GameConf_1 = require("../../GameConf");
const SGResult_1 = require("../../records/SGResult");
const CubeGameState_1 = require("../CubeGameState");
const SingleGameState_1 = require("../SingleGameState");
const AbsoluteBoardState_1 = require("../../AbsoluteBoardState");
var GameStatus;
(function (GameStatus) {
GameStatus[GameStatus["OPENING"] = 0] = "OPENING";
GameStatus[GameStatus["INPLAY_RED"] = 1] = "INPLAY_RED";
GameStatus[GameStatus["INPLAY_WHITE"] = 2] = "INPLAY_WHITE";
GameStatus[GameStatus["CUBEACTION_RED"] = 3] = "CUBEACTION_RED";
GameStatus[GameStatus["CUBEACTION_WHITE"] = 4] = "CUBEACTION_WHITE";
GameStatus[GameStatus["CUBERESP_RED"] = 5] = "CUBERESP_RED";
GameStatus[GameStatus["CUBERESP_WHITE"] = 6] = "CUBERESP_WHITE";
GameStatus[GameStatus["TOROLL_RED"] = 7] = "TOROLL_RED";
GameStatus[GameStatus["TOROLL_WHITE"] = 8] = "TOROLL_WHITE";
GameStatus[GameStatus["EOG_REDWON"] = 9] = "EOG_REDWON";
GameStatus[GameStatus["EOG_WHITEWON"] = 10] = "EOG_WHITEWON";
})(GameStatus = exports.GameStatus || (exports.GameStatus = {}));
function toCBState(gameState = {}) {
const { gameStatus, cubeState = (0, CubeState_1.cube)(1) } = gameState;
if (gameStatus === undefined) {
return (0, CubeGameState_1.cbOpening)(cubeState);
}
switch (gameStatus) {
case GameStatus.OPENING:
return (0, CubeGameState_1.cbOpening)(cubeState);
case GameStatus.INPLAY_RED:
return (0, CubeGameState_1.cbInPlayRed)(cubeState);
case GameStatus.INPLAY_WHITE:
return (0, CubeGameState_1.cbInPlayWhite)(cubeState);
case GameStatus.CUBEACTION_RED:
return (0, CubeGameState_1.cbActionRed)(cubeState);
case GameStatus.CUBEACTION_WHITE:
return (0, CubeGameState_1.cbActionWhite)(cubeState);
case GameStatus.CUBERESP_RED:
return (0, CubeGameState_1.cbResponseRed)(cubeState);
case GameStatus.CUBERESP_WHITE:
return (0, CubeGameState_1.cbResponseWhite)(cubeState);
case GameStatus.TOROLL_RED:
return (0, CubeGameState_1.cbToRollRed)(cubeState, 'Skip');
case GameStatus.TOROLL_WHITE:
return (0, CubeGameState_1.cbToRollWhite)(cubeState, 'Skip');
case GameStatus.EOG_REDWON:
return (0, CubeGameState_1.resultToCBEoG)(cubeState, SGResult_1.SGResult.REDWON, (0, EOGStatus_1.eog)());
case GameStatus.EOG_WHITEWON:
return (0, CubeGameState_1.resultToCBEoG)(cubeState, SGResult_1.SGResult.WHITEWON, (0, EOGStatus_1.eog)());
}
}
exports.toCBState = toCBState;
function toSGState(gameState = {}, gameConf = GameConf_1.standardConf) {
var _a, _b;
const { movesForDoublet = 4 } = gameConf;
if (gameState.gameStatus === undefined) {
return (0, SingleGameState_1.openingState)(boardState((_a = gameState.absPos) !== null && _a !== void 0 ? _a : GameConf_1.standardConf.initialPos), undefined, movesForDoublet);
}
switch (gameState.gameStatus) {
case GameStatus.OPENING:
return (0, SingleGameState_1.openingState)(boardState((_b = gameState.absPos) !== null && _b !== void 0 ? _b : GameConf_1.standardConf.initialPos), undefined, movesForDoublet);
case GameStatus.CUBEACTION_RED:
case GameStatus.TOROLL_RED:
case GameStatus.CUBERESP_WHITE: {
const board = boardState(gameState.absPos);
const lastStateNode = (0, BoardStateNode_1.nodeWithEmptyDice)(board);
return (0, SingleGameState_1.toRollStateRed)(lastStateNode.board.revert(), gameState.lastPly, movesForDoublet);
}
case GameStatus.CUBEACTION_WHITE:
case GameStatus.TOROLL_WHITE:
case GameStatus.CUBERESP_RED: {
const lastBoardState = boardState(gameState.absPos).revert();
const lastStateNode = (0, BoardStateNode_1.nodeWithEmptyDice)(lastBoardState);
return (0, SingleGameState_1.toRollStateWhite)(lastStateNode.board.revert(), gameState.lastPly, movesForDoublet);
}
case GameStatus.INPLAY_RED:
return (0, SingleGameState_1.inPlayStateRed)(boardState(gameState.absPos).revert(), gameState, movesForDoublet);
case GameStatus.INPLAY_WHITE:
return (0, SingleGameState_1.inPlayStateWhite)(boardState(gameState.absPos), gameState, movesForDoublet);
case GameStatus.EOG_REDWON: {
const lastBoardState = boardState(gameState.absPos).revert();
return (0, SingleGameState_1.eogStateRed)(1, (0, EOGStatus_1.eog)(), (0, AbsoluteBoardState_1.redViewAbsoluteBoard)(lastBoardState), lastBoardState);
}
case GameStatus.EOG_WHITEWON: {
const lastBoardState = boardState(gameState.absPos).revert();
return (0, SingleGameState_1.eogStateWhite)(1, (0, EOGStatus_1.eog)(), (0, AbsoluteBoardState_1.whiteViewAbsoluteBoard)(lastBoardState), lastBoardState);
}
}
function boardState(pos) {
const pieces = pos.reduce((prev, cur) => {
return cur > 0
? { me: prev.me + cur, opp: prev.opp }
: cur < 0
? { me: prev.me, opp: prev.opp - cur }
: prev;
}, { me: 0, opp: 0 });
return (0, BoardState_1.boardState)(pos, [15 - pieces.me, 15 - pieces.opp], gameConf.innerPos, gameConf.isEoGFunc);
}
}
exports.toSGState = toSGState;