UNPKG

marga

Version:
174 lines (173 loc) 6.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const InnerError_1 = require("../../../error/InnerError"); const TieBadge_1 = require("../../badge/TieBadge"); const Streak_1 = require("../../streak/Streak"); const GreenBeadEntity_1 = require("../bead/GreenBeadEntity"); const RedBeadEntity_1 = require("../bead/RedBeadEntity"); const BancoBigEntity_1 = require("./BancoBigEntity"); const PuntoBigEntity_1 = require("./PuntoBigEntity"); /** * The Big Road is a streak road that records the results of the game. */ class BigRoad { /** * Form a new BigRoad from a beadRoad object (which is a collection of bead entities). * @param {BeadRoad} beadRoad * @return {BigRoad} The new BigRoad */ static from(beadRoad) { const bigroad = new BigRoad(beadRoad.getShoeIndex()); // 找到第一個非和局的 bead let firstNoneGreenBead = beadRoad.getFirstEntity(); while (firstNoneGreenBead instanceof GreenBeadEntity_1.default) { firstNoneGreenBead = firstNoneGreenBead.getNextEntity(); } // 根據上一步,創建第一個 bigEntity let bigEntity; if (firstNoneGreenBead instanceof RedBeadEntity_1.default) { bigEntity = new BancoBigEntity_1.default(firstNoneGreenBead.getGameId()); } else { const converted = firstNoneGreenBead; bigEntity = new PuntoBigEntity_1.default(converted.getGameId()); } bigroad.addEntity(bigEntity); // 填充 preTieBadge let lastBead = firstNoneGreenBead?.getPreviousEntity(); while (lastBead) { bigEntity.addTag(new TieBadge_1.default(true)); lastBead = lastBead.getPreviousEntity(); } // 向後繼續解析 let currentBead = firstNoneGreenBead?.getNextEntity(); while (currentBead) { if (currentBead instanceof GreenBeadEntity_1.default) { bigEntity.addTag(new TieBadge_1.default()); } else { if (currentBead instanceof RedBeadEntity_1.default) { bigEntity = new BancoBigEntity_1.default(currentBead.getGameId()); } else { bigEntity = new PuntoBigEntity_1.default(currentBead.getGameId()); } bigroad.addEntity(bigEntity); } currentBead = currentBead.getNextEntity(); } return bigroad; } _length = 0; _entityIndex = -1; _firstStreak; _lastStreak; _shoeIndex; _setLastStreak(streak) { this._lastStreak = streak; } _setFirstStreak(streak) { this._firstStreak = streak; } constructor(index) { this._shoeIndex = index; } print() { const result = []; let streak = this.getFirstStreak(); while (streak) { const streakArr = []; const first = streak.getFirstEntity(); if (first?.isBanco) { for (let i = 0, len = streak.getLength(); i < len; i++) { streakArr.push('B '); } } else { for (let i = 0, len = streak.getLength(); i < len; i++) { streakArr.push('P '); } } result.push(streakArr); streak = streak.getNextStreak(); } return result; } getSize() { return this._length; } /** * Add entity to the Big Road. * @param {BigEntity} entity * @return {boolean} If the entity is added successfully, return true, otherwise return false. */ addEntity(entity) { this._entityIndex++; entity.setIndex(this._entityIndex); // no streak if (!this.getFirstStreak()) { const steak = new Streak_1.default(); this._setFirstStreak(steak); this._setLastStreak(steak); } const lastStreak = this.getLastStreak(); // streak is not suitable(different color) const result = lastStreak.addEntity(entity); if (!result) { const newStreak = new Streak_1.default(); newStreak.setPreviousStreak(lastStreak); this._setLastStreak(newStreak); this.getLastStreak()?.addEntity(entity); } entity.setIndex(this._length); this._length++; return true; } getFirstStreak() { return this._firstStreak; } getLastStreak() { return this._lastStreak; } getFirstEntity() { throw new InnerError_1.default('[BigRoad][getFirstEntity]: not implemented'); } getLastEntity() { throw new InnerError_1.default('[BigRoad][getLastEntity]: not implemented'); } getShoeIndex() { return this._shoeIndex; } /** * Get a generator that can iterate the Pingpong pattern in the Big Road. * @return {Generator<BigEntity[], void, boolean>} A generator that can iterate the Pingpong pattern in the Big Road. */ getPingpongIterator() { const first = this.getFirstStreak(); const gen = function* () { const entities_arr = []; let streak = first; while (streak) { if (streak.getLength() === 1) { // 當前streak是單跳 entities_arr.push(streak.getFirstEntity()); } else { if (streak.getPreviousStreak()?.getLength() === 1) { const result = [...entities_arr]; entities_arr.length = 0; yield result; } } streak = streak.getNextStreak(); } if (entities_arr.length) { const result = [...entities_arr]; entities_arr.length = 0; yield result; } }; return gen(); } } exports.default = BigRoad;