UNPKG

tsgammon-core

Version:

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

106 lines (105 loc) 5.79 kB
"use strict"; 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;