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