UNPKG

tsgammon-core

Version:

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

90 lines (89 loc) 4.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.eogRecord = exports.trimPlyRecords = exports.discardCurrentGame = exports.recordFinishedGame = exports.addPlyRecord = exports.matchRecordInPlay = void 0; const MatchState_1 = require("../MatchState"); const GameConf_1 = require("../GameConf"); const GameRecord_1 = require("./GameRecord"); function matchRecordInPlay(conf = GameConf_1.standardConf, matchState) { const curGameRecord = (0, GameRecord_1.gameRecordInPlay)(matchState); return { isEoG: false, conf, matchState, gameRecords: [], curGameRecord, }; } exports.matchRecordInPlay = matchRecordInPlay; /** * 現在の記録について、一手番分の記録を追加して返す * * @param matchRecord 現在の記録 * @param plyRecord 追加される手番の記録 * @param state 手番に紐づけて記録される、局面の状態を示す任意のオブジェクト * @returns 更新後の記録 */ function addPlyRecord(matchRecord, plyRecord, state) { return Object.assign(Object.assign({}, matchRecord), { curGameRecord: Object.assign(Object.assign({}, matchRecord.curGameRecord), { plyRecords: matchRecord.curGameRecord.plyRecords.concat({ plyRecord, state, }) }) }); } exports.addPlyRecord = addPlyRecord; /** * 現在の記録について、現ゲームの記録をリセットして返す * * 現ゲームが終局していれば、すでに終局したゲームの記録に追加する。そうでなければ破棄する。 * * ※ 現ゲームが終局しても、画面表示上は終局状態として現ゲームの記録が必要なので、 * 終局の記録{@link eogRecord}と現ゲームの記録のリセットとで処理を分けている。 * * @param matchRecord 現在の記録 * @returns 更新後の記録 */ function recordFinishedGame(matchRecord) { const { matchState } = matchRecord; if (matchState.isEoM) { return matchRecord; } else { const matchStateNext = (0, MatchState_1.matchStateNewGame)(matchState); return Object.assign(Object.assign({}, matchRecord), { isEoG: false, matchState: matchStateNext, gameRecords: matchRecord.gameRecords.concat(matchRecord.curGameRecord), curGameRecord: (0, GameRecord_1.gameRecordInPlay)(matchStateNext) }); } } exports.recordFinishedGame = recordFinishedGame; function discardCurrentGame(matchRecord) { return Object.assign(Object.assign({}, matchRecord), { curGameRecord: (0, GameRecord_1.gameRecordInPlay)(matchRecord.matchState) }); } exports.discardCurrentGame = discardCurrentGame; /** * 現在の記録について、任意の手番に復帰し、それ以降の手番の記録を破棄して返す * @param matchRecord 現在の記録 * @param index 復帰先となる手番 * @returns 更新後の記録 */ function trimPlyRecords(matchRecord, index) { const idx = 0 <= index && index < matchRecord.curGameRecord.plyRecords.length ? index : matchRecord.curGameRecord.plyRecords.length - 1; const matchState = matchRecord.isEoG ? (0, MatchState_1.matchStateLastGame)(matchRecord.matchState) : matchRecord.matchState; return Object.assign(Object.assign({}, matchRecord), { isEoG: false, matchState, curGameRecord: Object.assign(Object.assign({}, matchRecord.curGameRecord), { plyRecords: matchRecord.curGameRecord.plyRecords.slice(0, idx), isEoG: false }) }); } exports.trimPlyRecords = trimPlyRecords; /** * 現在の記録について、現ゲームの記録に終局の記録を追加して返す * * @param matchRecord 現在の記録 * @param eogMatchState 終局時のMatchState * @param eogRecord 終局の記録 * @returns 更新後の記録 */ function eogRecord(matchRecord, eogRecord) { const matchState = (0, MatchState_1.matchStateEoG)(matchRecord.matchState, eogRecord.stake, eogRecord.eogStatus); const curGameRecord = (0, GameRecord_1.gameRecordEoG)(matchRecord.curGameRecord, eogRecord, matchState.isEoM); return Object.assign(Object.assign({}, matchRecord), { isEoG: true, curGameRecord, matchState }); } exports.eogRecord = eogRecord;