marga
Version:
gaming soreboard
174 lines (173 loc) • 6.07 kB
JavaScript
;
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;