const instrumentData = { retort: { unlocked: () => true, label: "Retort", logo: "🝭" }, alembic: { unlocked: () => getJobLevel("distill").gte(2), label: "Alembic", logo: "🝪" }, crucible: { unlocked: () => getJobLevel("distill").gte(4), label: "Crucible", logo: "🝧" }, bainMarie: { unlocked: () => hasMilestone("rituals", 2), label: "Bain-Marie", logo: "🝫" }, vapours: { unlocked: () => false, label: "Bath of Vapours", logo: "🝬" } }; Vue.component("instrument", { props: ["layer", "data"], template: `
{{ instrumentData[data].label }} x{{ format(completions.div(100).add(1)) }}
`, computed: { completions() { return softcap(player.distill[`${this.data}Completions`], new Decimal(1000), 1 / 3); }, canAfford() { return layers.distill.buyables[this.data].canAfford(); }, progress() { return player.distill.anims ? Decimal.times(player.distill[`${this.data}Progress`], buyableEffect("distill", this.data)).times(100).toFixed(2) : 0; } } }); function getInstrumentBuyable(id, instrumentName, title, baseSpeed, baseCost, costExponent) { return { title: `${title}
`, style: { width: "175px", height: "175px" }, display() { return `Make ${instrumentName} finish ${format(baseSpeed, 3)} more times/sec.
(Capped at ${format(baseSpeed.times(100))})${getBuyableAmount("distill", id).lt(100) ? `

Currently: ${format(this.effect())}

Cost: ${format(this.cost())} essentia` : ""}`; }, cost(x) { const amount = x || getBuyableAmount("distill", id); return new Decimal(baseCost).times(new Decimal(costExponent).pow(amount)); }, buyMax() { const amount = getBuyableAmount("distill", id); const amountAffordable = player.distill.points.times(costExponent.sub(1)).div(new Decimal(baseCost).times(Decimal.pow(costExponent, amount))).add(1).log(costExponent).floor().clamp(0, Decimal.sub(100, amount)); const cost = baseCost.times(costExponent.pow(amount).times(costExponent.pow(amountAffordable).sub(1))).div(costExponent.sub(1)); player.distill.points = player.distill.points.sub(cost); setBuyableAmount("distill", id, amount.add(amountAffordable)); }, effect() { let speed = new Decimal(baseSpeed); speed = speed.times(getBuyableAmount("distill", id)); return speed; }, canAfford() { return player.distill.points.gte(this.cost()); }, purchaseLimit() { return new Decimal(100); }, buy() { player.distill.points = player.distill.points.sub(this.cost()); setBuyableAmount("distill", id, getBuyableAmount("distill", id).add(1)); }, unlocked: () => instrumentData[id].unlocked() }; } function updateInstrument(instrument, requiredLevel, diff) { if (getJobLevel("distill").lt(requiredLevel) || buyableEffect("distill", instrument).eq(0)) { return; } player.distill[`${instrument}Progress`] = player.distill[`${instrument}Progress`].add(diff); const completionDuration = Decimal.div(1, buyableEffect("distill", instrument)); const completions = player.distill[`${instrument}Progress`].div(completionDuration).floor(); if (completions.gt(0)) { player.distill[`${instrument}Progress`] = player.distill[`${instrument}Progress`].sub(completionDuration.times(completions)); player.distill[`${instrument}Completions`] = player.distill[`${instrument}Completions`].add(completions); addPoints("distill", completions.times(getEssentiaMult())); } } function getEssentiaMult() { let gain = new Decimal(1); gain = gain.times(new Decimal(1.1).pow(getJobLevel("distill"))); gain = gain.times(softcap(player.distill.retortCompletions, new Decimal(1000), 1 / 3).div(100).add(1)); gain = gain.times(softcap(player.distill.alembicCompletions, new Decimal(1000), 1 / 3).div(100).add(1)); gain = gain.times(softcap(player.distill.crucibleCompletions, new Decimal(1000), 1 / 3).div(100).add(1)); gain = gain.times(softcap(player.distill.bainMarieCompletions, new Decimal(1000), 1 / 3).div(100).add(1)); gain = gain.times(softcap(player.distill.vapoursCompletions, new Decimal(1000), 1 / 3).div(100).add(1)); gain = gain.times(layers.generators.clickables.distill.effect()); gain = gain.times(ritualEffect("gain")); if (player.generators.distillActive && (player.tab === "generators" || player.generators.timeLoopActive)) { gain = gain.sqrt(); } return gain; } addLayer("distill", { name: "distill", resource: "essentia", image: "images/PIXNIO-252785-4924x3283.jpg", color: distillColor, jobName: "Distill flowers", showJobDelay: 0.5, layerShown: () => hasMilestone("study", 2), startData() { return { unlocked: true, points: new Decimal(0), total: new Decimal(0), xp: new Decimal(0), lastLevel: new Decimal(0), anims: true, timeLoopActive: false, retortProgress: new Decimal(0), retortCompletions: new Decimal(0), alembicProgress: new Decimal(0), alembicCompletions: new Decimal(0), crucibleProgress: new Decimal(0), crucibleCompletions: new Decimal(0), bainMarieProgress: new Decimal(0), bainMarieCompletions: new Decimal(0), vapoursProgress: new Decimal(0), vapoursCompletions: new Decimal(0) }; }, shouldNotify() { return Object.keys(tmp[this.layer].buyables).some(buyable => canBuyBuyable(this.layer, id)); }, tabFormat: () => [ "main-display", ["display-text", `You are getting ${format(getEssentiaMult())} essentia every time an instrument finishes.`], "blank", ["display-text", (() => { if (!hasMilestone("distill", 0)) { return "Discover new ways to harness the power of the flower essence at level 2"; } if (!hasMilestone("distill", 1)) { return "Discover new ways to harness the power of the flower essence at level 4"; } if (!hasMilestone("distill", 3)) { return "Discover new ways to harness the power of the flower essence at level 6"; } if (!hasMilestone("distill", 4)) { return "Discover new ways to harness the power of the flower essence at level 8"; } return ""; })()], ["sticky", ["80px", ["row", [ ["display-text", "Animations"], "blank", ["toggle", ["distill", "anims"]] ]]]], "blank", ["instrument", "retort"], "blank", ["instrument", "alembic"], "blank", ["instrument", "crucible"], "blank", ["instrument", "bainMarie"], "blank", ["instrument", "vapours"], "blank", ["milestones-filtered", [2, 5, 6]] ], update(diff) { if (player.tab === this.layer || player[this.layer].timeLoopActive) { if (player.generators.distillActive && (player.tab === "generators" || player.generators.timeLoopActive)) { diff = new Decimal(diff).div(10); } updateInstrument("retort", 0, diff); updateInstrument("alembic", 2, diff); updateInstrument("crucible", 4, diff); updateInstrument("bainMarie", 6, diff); updateInstrument("vapours", 8, diff); } }, onAddPoints(gain) { let xpGain = gain; if (hasUpgrade("generators", 13)) { xpGain = xpGain.times(layers.generators.clickables[this.layer].effect()); } xpGain = xpGain.times(ritualEffect("globalXp")); player[this.layer].xp = player[this.layer].xp.add(xpGain); checkJobXP(this.layer); }, milestones: { 0: { requirementDescription: "Level 2", done: () => player.distill.xp.gte(10) }, 1: { requirementDescription: "Level 4", done: () => player.distill.xp.gte(1e3) }, 2: { title: "\"The only true wisdom consists in knowing that you know nothing.\"", requirementDescription: "Level 5", "effectDescription": "Unlock a new time slot", done: () => player.distill.xp.gte(1e4), onComplete: () => { player.timeSlots = player.timeSlots.add(1); } }, 3: { requirementDescription: "Level 6", done: () => player.distill.xp.gte(1e5) }, 4: { requirementDescription: "Level 8", done: () => player.distill.xp.gte(1e7) }, 5: { title: "That's us, dude!", requirementDescription: "Level 10", "effectDescription": "Unlock run generators job", done: () => player.distill.xp.gte(1e9), unlocked: () => hasMilestone("distill", 2) }, 6: { title: "Oh, yeah!", requirementDescription: "Level 25", "effectDescription": "Unlock ???", done: () => player.distill.xp.gte(1e24) && player.chapter > 2, unlocked: () => hasMilestone("distill", 5) && player.chapter > 2 } }, buyables: { retort: getInstrumentBuyable("retort", "retort", "Be excellent to each other.", new Decimal(0.06), new Decimal(1), new Decimal(1.05)), alembic: getInstrumentBuyable("alembic", "alembic", "EXCELLENT!", new Decimal(0.03), new Decimal(100), new Decimal(1.1)), crucible: getInstrumentBuyable("crucible", "crucible", "Party on dudes!", new Decimal(0.02), new Decimal(1000), new Decimal(1.15)), bainMarie: getInstrumentBuyable("bainMarie", "bain-marie", "Greetings, my excellent friends.", new Decimal(0.015), new Decimal(100000), new Decimal(1.25)), vapours: getInstrumentBuyable("vapours", "bath of vapours", "Most outstanding, Rufus! Let's jam!", new Decimal(0.012), new Decimal(10000000), new Decimal(1.5)) }, bars: { job: getJobProgressBar("distill", distillColor) } });