UNPKG

genshin-artifact-simulator

Version:
126 lines 6.66 kB
"use strict"; 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