scrabble-solver
Version:
Scrabble Solver 2 - Free, open-source, cross-platform, multi-language analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League, Crossplay, Literaki, and Kelimelik. Quickly find the top-scoring words using the given board and tiles.
106 lines (105 loc) • 3.21 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Config = void 0;
const constants_1 = require("@scrabble-solver/constants");
const CharacterBonus_1 = require("./CharacterBonus");
const WordBonus_1 = require("./WordBonus");
class Config {
constructor(config) {
this.bonuses = getBonuses(config);
this.config = config;
this.pointsMap = getPointsMap(this.config);
}
get alphabet() {
return getAlphabet(this.config);
}
get bingo() {
return this.config.bingo;
}
get blankScore() {
return this.config.blankScore;
}
get blanksCount() {
return this.config.blanksCount;
}
get boardHeight() {
return this.config.boardHeight;
}
get boardWidth() {
return this.config.boardWidth;
}
get game() {
return this.config.game;
}
get locale() {
return this.config.locale;
}
get twoCharacterTiles() {
return this.config.tiles.filter((tile) => tile.character.length === 2).map((tile) => tile.character);
}
getCellBonus(cell) {
return this.bonuses.find((bonus) => bonus.matchesCellCoordinates(cell));
}
getCellBonusValue(cell) {
return this.getCellBonus(cell)?.value || constants_1.NO_BONUS;
}
getCharacterPoints(character) {
if (character === null) {
return undefined;
}
if (character === constants_1.BLANK) {
return this.blankScore;
}
return this.pointsMap[character];
}
getTwoCharacterTileByPrefix(character) {
if (character.length !== 1) {
return undefined;
}
return this.twoCharacterTiles.find((characters) => characters.startsWith(character.toLocaleLowerCase()));
}
getTilePoints(tile) {
if (tile === null) {
return undefined;
}
return tile.isBlank ? this.blankScore : this.getCharacterPoints(tile.character);
}
hasCharacter(character) {
return character in this.pointsMap;
}
isTwoCharacterTilePrefix(character) {
return typeof this.getTwoCharacterTileByPrefix(character) !== 'undefined';
}
get rackSize() {
return this.config.rackSize;
}
get supportsRemainingTiles() {
return this.tiles.every((tile) => typeof tile.count === 'number');
}
get tiles() {
return this.config.tiles;
}
toJson() {
return this.config;
}
}
exports.Config = Config;
Config.fromJson = (json) => {
return new Config(json);
};
const getBonuses = (config) => {
return config.bonuses.map((bonus) => {
if (bonus.type === constants_1.BONUS_CHARACTER) {
return new CharacterBonus_1.CharacterBonus(bonus);
}
if (bonus.type === constants_1.BONUS_WORD) {
return new WordBonus_1.WordBonus(bonus);
}
throw new Error(`Unsupported Bonus type: "${bonus.type}"`);
});
};
const getAlphabet = (config) => config.tiles.map(({ character }) => character);
const getPointsMap = (config) => config.tiles.reduce((pointsMap, { character, score }) => ({
...pointsMap,
[character]: score,
}), {});