genshin-artifact-simulator
Version:
Simulates artifact farming in Genshin Impact.
159 lines • 7.9 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var lodash_1 = __importDefault(require("lodash"));
var artifactMatchesCriteria_1 = __importDefault(require("./artifactMatchesCriteria"));
var rateRemainingArtifactDifficulty = function (_a) {
var remainingArtifactSlotsCriteria = _a.remainingArtifactSlotsCriteria;
// TODO: Probably want to make this more advanced.
return lodash_1.default.size(remainingArtifactSlotsCriteria);
};
var getNumArtifactsRequiredForSetCriteria = function (_a) {
var artifactSetsCriteria = _a.artifactSetsCriteria;
return lodash_1.default.sum(lodash_1.default.map(artifactSetsCriteria, function (setCriteria) { return setCriteria.setBonus; }));
};
var getNumArtifactsFoundNotForSetCriteria = function (_a) {
var artifactSetsCriteria = _a.artifactSetsCriteria, artifactSetCounts = _a.artifactSetCounts;
return lodash_1.default.sum(lodash_1.default.map(artifactSetCounts, function (setCount) {
return lodash_1.default.find(artifactSetsCriteria, function (setCriteria) { return setCriteria.setKey === setCount.key; })
? 0
: setCount.count;
}));
};
var updateArtifactSetCount = function (_a) {
var artifact = _a.artifact, artifactSetCounts = _a.artifactSetCounts;
var setCount = lodash_1.default.find(artifactSetCounts, function (setCount) { return setCount.key === artifact.setKey; });
if (!setCount) {
setCount = { key: artifact.setKey, count: 0 };
artifactSetCounts.push(setCount);
}
setCount.count += 1;
};
var findRemainingArtifacts = function (_a) {
var artifacts = _a.artifacts, artifactSlotsCriteria = _a.artifactSlotsCriteria, artifactSetsCriteria = _a.artifactSetsCriteria, _b = _a.artifactSetCounts, artifactSetCounts = _b === void 0 ? [] : _b, numTotalArtifactSlotsCriteria = _a.numTotalArtifactSlotsCriteria, _c = _a.includeNoSet, includeNoSet = _c === void 0 ? false : _c;
if (lodash_1.default.size(artifactSlotsCriteria) === 0) {
return { artifacts: [], missingArtifactSlotsCriteria: [] };
}
var currentArtifactSlotCriteria = lodash_1.default.head(artifactSlotsCriteria);
var remainingArtifactSlotsCriteria = lodash_1.default.tail(artifactSlotsCriteria);
var results = lodash_1.default.filter(lodash_1.default.map(artifactSetsCriteria, function (setCriteria) {
if (artifactSetCounts[setCriteria.setKey] === setCriteria.setBonus) {
return;
}
var artifact = lodash_1.default.find(artifacts, function (artifact) {
return (0, artifactMatchesCriteria_1.default)({
artifact: artifact,
artifactSlotCriteria: currentArtifactSlotCriteria,
setKey: setCriteria.setKey,
});
});
if (artifact) {
updateArtifactSetCount({ artifact: artifact, artifactSetCounts: artifactSetCounts });
}
var remainingArtifacts = findRemainingArtifacts({
artifacts: artifacts,
artifactSlotsCriteria: remainingArtifactSlotsCriteria,
artifactSetsCriteria: artifactSetsCriteria,
artifactSetCounts: lodash_1.default.cloneDeep(artifactSetCounts),
numTotalArtifactSlotsCriteria: numTotalArtifactSlotsCriteria,
includeNoSet: includeNoSet,
});
if (artifact) {
return {
artifacts: __spreadArray([artifact], remainingArtifacts.artifacts, true),
missingArtifactSlotsCriteria: remainingArtifacts.missingArtifactSlotsCriteria,
};
}
return {
artifacts: remainingArtifacts.artifacts,
missingArtifactSlotsCriteria: __spreadArray([
currentArtifactSlotCriteria
], remainingArtifacts.missingArtifactSlotsCriteria, true),
};
}), function (result) { return !lodash_1.default.isNil(result); });
if (numTotalArtifactSlotsCriteria -
getNumArtifactsRequiredForSetCriteria({ artifactSetsCriteria: artifactSetsCriteria }) >
getNumArtifactsFoundNotForSetCriteria({
artifactSetsCriteria: artifactSetsCriteria,
artifactSetCounts: artifactSetCounts,
})) {
var artifact = void 0;
if (includeNoSet) {
artifact = lodash_1.default.find(artifacts, function (artifact) {
return (0, artifactMatchesCriteria_1.default)({
artifact: artifact,
artifactSlotCriteria: currentArtifactSlotCriteria,
});
});
}
if (artifact) {
updateArtifactSetCount({ artifact: artifact, artifactSetCounts: artifactSetCounts });
}
var remainingArtifacts = findRemainingArtifacts({
artifacts: artifacts,
artifactSlotsCriteria: remainingArtifactSlotsCriteria,
artifactSetsCriteria: artifactSetsCriteria,
artifactSetCounts: lodash_1.default.cloneDeep(artifactSetCounts),
numTotalArtifactSlotsCriteria: numTotalArtifactSlotsCriteria,
includeNoSet: includeNoSet,
});
if (artifact) {
results.push({
artifacts: __spreadArray([artifact], remainingArtifacts.artifacts, true),
missingArtifactSlotsCriteria: remainingArtifacts.missingArtifactSlotsCriteria,
});
}
else {
results.push({
artifacts: remainingArtifacts.artifacts,
missingArtifactSlotsCriteria: __spreadArray([
currentArtifactSlotCriteria
], remainingArtifacts.missingArtifactSlotsCriteria, true),
});
}
}
var result = lodash_1.default.minBy(results, function (result) {
return rateRemainingArtifactDifficulty({
remainingArtifactSlotsCriteria: result.missingArtifactSlotsCriteria,
});
});
return result;
};
var findMatchingArtifacts = function (_a) {
var build = _a.build, artifacts = _a.artifacts;
var matchingArtifactsResult = findRemainingArtifacts({
artifacts: lodash_1.default.filter(artifacts, function (artifact) { return !artifact.build || artifact.build.id === build.id; }),
artifactSlotsCriteria: build.slotsCriteria,
artifactSetsCriteria: build.setsCriteria,
numTotalArtifactSlotsCriteria: build.slotsCriteria.length,
});
if (matchingArtifactsResult.artifacts.length ===
getNumArtifactsRequiredForSetCriteria({
artifactSetsCriteria: build.setsCriteria,
})) {
matchingArtifactsResult = findRemainingArtifacts({
artifacts: lodash_1.default.filter(artifacts, function (artifact) { return !artifact.build || artifact.build.id === build.id; }),
artifactSlotsCriteria: build.slotsCriteria,
artifactSetsCriteria: build.setsCriteria,
numTotalArtifactSlotsCriteria: build.slotsCriteria.length,
includeNoSet: true,
});
}
lodash_1.default.forEach(matchingArtifactsResult.artifacts, function (artifact) { return (artifact.build = build); });
build.artifacts = matchingArtifactsResult.artifacts;
build.missingSlotsCriteria =
matchingArtifactsResult.missingArtifactSlotsCriteria;
};
exports.default = findMatchingArtifacts;
//# sourceMappingURL=findMatchingArtifacts.js.map