@gamepark/rules-api
Version:
API to implement the rules of a board game
70 lines • 3.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generatePlayersOption = exports.getPlayersAvailableValues = exports.getPlayersMandatoryValues = void 0;
var difference_1 = __importDefault(require("lodash/difference"));
function getPlayersMandatoryValues(spec, players) {
return spec.mandatory ? spec.mandatory(players) : [];
}
exports.getPlayersMandatoryValues = getPlayersMandatoryValues;
function getPlayersAvailableValues(spec, players) {
if (spec.unavailable) {
var unavailableValues_1 = spec.unavailable(players);
return spec.values.filter(function (value) { return !unavailableValues_1.includes(value); });
}
else {
return spec.values;
}
}
exports.getPlayersAvailableValues = getPlayersAvailableValues;
function generatePlayersOption(playersChoices, option) {
// Force to pick mandatory values
var mandatoryValues = getPlayersMandatoryValues(option, playersChoices.length);
for (var _i = 0, mandatoryValues_1 = mandatoryValues; _i < mandatoryValues_1.length; _i++) {
var mandatoryValue = mandatoryValues_1[_i];
if (!playersChoices.includes(mandatoryValue)) {
var freeIndexes = playersChoices.map(function (choice, i) { return choice !== null && mandatoryValues.includes(choice) ? -1 : i; }).filter(function (i) { return i !== -1; });
var index = freeIndexes[Math.floor(Math.random() * freeIndexes.length)];
playersChoices[index] = mandatoryValue;
}
}
// Remove invalid choices
var availableValues = getPlayersAvailableValues(option, playersChoices.length);
var _loop_1 = function (i) {
var choice = playersChoices[i];
if (choice !== null && !availableValues.includes(choice)) {
playersChoices[i] = null;
}
if (choice !== null && !option.share) {
var sameChoiceIndexes = playersChoices.map(function (c, i) { return c === choice ? i : -1; }).filter(function (i) { return i !== -1; });
if (sameChoiceIndexes.length > 0) {
var keeper = sameChoiceIndexes[Math.floor(Math.random() * sameChoiceIndexes.length)];
for (var _a = 0, sameChoiceIndexes_1 = sameChoiceIndexes; _a < sameChoiceIndexes_1.length; _a++) {
var index = sameChoiceIndexes_1[_a];
if (index !== keeper) {
playersChoices[index] = null;
}
}
}
}
};
for (var i = 0; i < playersChoices.length; i++) {
_loop_1(i);
}
if (!option.optional) {
// Provide missing choices (different values if possible)
var remainingValues = (0, difference_1.default)(availableValues, playersChoices);
for (var i = 0; i < playersChoices.length; i++) {
if (playersChoices[i] === null) {
if (remainingValues.length === 0)
remainingValues.push.apply(remainingValues, availableValues);
playersChoices[i] = remainingValues.splice(Math.floor(Math.random() * remainingValues.length), 1)[0];
}
}
}
return playersChoices;
}
exports.generatePlayersOption = generatePlayersOption;
//# sourceMappingURL=PlayerEnumOption.js.map