genshin-artifact-simulator
Version:
Simulates artifact farming in Genshin Impact.
126 lines • 6.66 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
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 types_1 = require("./types");
var loadData_1 = require("./loadData");
var artifactMatchesCriteria_1 = __importDefault(require("./artifactMatchesCriteria"));
var farmArtifacts_1 = __importDefault(require("./farmArtifacts"));
var findMatchingArtifacts_1 = __importDefault(require("./findMatchingArtifacts"));
var validateBuild = function (_a) {
var build = _a.build;
if (!lodash_1.default.isEmpty(build.slotsCriteria)) {
var slotKeyCounts = lodash_1.default.countBy(build.slotsCriteria, function (slotCriteria) { return slotCriteria.slotKey; });
var slotKey = lodash_1.default.findKey(slotKeyCounts, function (count) { return count > 1; });
if (!lodash_1.default.isNil(slotKey)) {
throw "For build \"".concat(build.id, "\" found ").concat(slotKeyCounts[slotKey], " slot criteria for slot key \"").concat(slotKey, "\".");
}
}
};
var validateBuilds = function (_a) {
var builds = _a.builds;
var buildIdCounts = lodash_1.default.countBy(builds, function (build) { return build.id; });
var buildId = lodash_1.default.findKey(buildIdCounts, function (count) { return count > 1; });
if (!lodash_1.default.isNil(buildId)) {
throw "Multiple specified builds had the same id: ".concat(buildId);
}
lodash_1.default.forEach(builds, function (build) { return validateBuild({ build: build }); });
};
var fixMissingSlotCriteria = function (_a) {
var build = _a.build, slotKey = _a.slotKey;
if (lodash_1.default.isNil(lodash_1.default.find(build.slotsCriteria, function (slotCriteria) { return slotCriteria.slotKey === slotKey; }))) {
build.slotsCriteria.push({ slotKey: slotKey });
}
};
var initializeBuild = function (_a) {
var build = _a.build;
delete build.artifacts;
delete build.missingSlotsCriteria;
build.resinSpent = 0;
lodash_1.default.forEach(build.setsCriteria, function (setCriteria) {
setCriteria.set = lodash_1.default.find(loadData_1.artifactSets, function (set) { return set.key === setCriteria.setKey; });
});
fixMissingSlotCriteria({ build: build, slotKey: types_1.ArtifactSlotKey.flower });
fixMissingSlotCriteria({ build: build, slotKey: types_1.ArtifactSlotKey.plume });
fixMissingSlotCriteria({ build: build, slotKey: types_1.ArtifactSlotKey.sands });
fixMissingSlotCriteria({ build: build, slotKey: types_1.ArtifactSlotKey.goblet });
fixMissingSlotCriteria({ build: build, slotKey: types_1.ArtifactSlotKey.circlet });
};
var initializeArtifact = function (_a) {
var artifact = _a.artifact;
delete artifact.build;
};
var initialize = function (_a) {
var builds = _a.builds, artifacts = _a.artifacts;
lodash_1.default.forEach(builds, function (build) { return initializeBuild({ build: build }); });
lodash_1.default.forEach(artifacts, function (artifact) { return initializeArtifact({ artifact: artifact }); });
};
var farm = function (_a) {
var build = _a.build, set = _a.set, cumulativeNewArtifacts = _a.cumulativeNewArtifacts;
var _b = (0, farmArtifacts_1.default)({ set: set }), artifacts = _b.artifacts, resinCost = _b.resinCost;
build.resinSpent += resinCost;
cumulativeNewArtifacts.push.apply(cumulativeNewArtifacts, artifacts);
return artifacts;
};
var simulateOnce = function (_a) {
var builds = _a.builds, artifacts = _a.artifacts;
initialize({ builds: builds, artifacts: artifacts });
lodash_1.default.forEach(builds, function (build) {
(0, findMatchingArtifacts_1.default)({ build: build, artifacts: artifacts });
var _loop_1 = function () {
var setCriteria = lodash_1.default.find(build.setsCriteria, function (setCriteria) {
return lodash_1.default.filter(build.artifacts, function (artifact) { return artifact.setKey === setCriteria.setKey; }).length < setCriteria.setBonus;
});
var newArtifacts = [];
var cumulativeNewArtifacts = [];
while (lodash_1.default.isEmpty(lodash_1.default.intersectionWith(newArtifacts, build.missingSlotsCriteria, function (artifact, slotCriteria) {
return (0, artifactMatchesCriteria_1.default)({
artifact: artifact,
artifactSlotCriteria: slotCriteria,
setKey: lodash_1.default.get(setCriteria, "setKey"),
});
}))) {
newArtifacts = farm({
build: build,
set: lodash_1.default.get(setCriteria, "set"),
cumulativeNewArtifacts: cumulativeNewArtifacts,
});
}
artifacts.push.apply(artifacts, cumulativeNewArtifacts);
(0, findMatchingArtifacts_1.default)({ build: build, artifacts: artifacts });
};
while (lodash_1.default.size(build.artifacts) < build.slotsCriteria.length) {
_loop_1();
}
});
return {
totalResinSpent: lodash_1.default.sumBy(builds, function (build) { return build.resinSpent; }),
builds: lodash_1.default.map(builds, function (build) { return lodash_1.default.pick(build, ["key", "resinSpent"]); }),
};
};
__exportStar(require("./types"), exports);
__exportStar(require("./loadData"), exports);
var simulate = function (_a) {
var _b = _a === void 0 ? { builds: [], goodData: { artifacts: [] }, runs: 1 } : _a, _c = _b.builds, builds = _c === void 0 ? [] : _c, _d = _b.goodData, goodData = _d === void 0 ? { artifacts: [] } : _d, _e = _b.runs, runs = _e === void 0 ? 1 : _e;
validateBuilds({ builds: builds });
return lodash_1.default.times(runs, function () {
return simulateOnce({
builds: lodash_1.default.cloneDeep(builds),
artifacts: lodash_1.default.cloneDeep(goodData.artifacts),
});
});
};
exports.default = simulate;
//# sourceMappingURL=index.js.map