addLayer("f", { name: "files", // This is optional, only used in a few places, If absent it just uses the layer id. symbol: "🗎", // This appears on the layer's node. Default is the id with the first letter capitalized position: 2, // Horizontal position within a row. By default it uses the layer id and sorts in alphabetical order startData() { return { unlocked: false, points: new Decimal(0), total: new Decimal(0) }}, color: "#7f1bae", requires() { let req = new Decimal(250) if (hasUpgrade(this.layer, 32)) { req = req.mul(0.5) } if (hasMilestone(this.layer, 9)) { req = req.mul(0.5) } return req }, // Can be a function that takes requirement increases into account resource: "files", // Name of prestige currency baseResource: "super progress points", // Name of resource prestige is based on baseAmount() {return player.sp.points}, // Get the current amount of baseResource type: "custom", // normal: cost to gain currency depends on amount gained. static: cost depends on how much you already have exponent() { let exp = 1.3 if (hasUpgrade(this.layer, 52)) exp **= 0.9 return exp }, // Prestige currency exponent base() { let base = 1.3 if (hasUpgrade(this.layer, 41)) base **= 0.95 return base }, getResetGain(canMax = tmp[this.layer].canBuyMax) { let tlyr = tmp[this.layer] let plyr = player[this.layer] let amount = tlyr.baseAmount.div(tlyr.requires).log(tlyr.base) if (amount.gte(0)) amount = amount.root(tlyr.exponent).add(1) .sub(plyr.points.mul(2).add(plyr.total).div(3)).sqrt().floor().max(0) if (isNaN(amount)) return new Decimal(0) if (!canMax && amount.gte(1)) return new Decimal(1) return amount.max(0) }, getNextAt(canMax = tmp[this.layer].canBuyMax) { let tlyr = tmp[this.layer] let plyr = player[this.layer] if (!canMax) return plyr.points.mul(2).add(plyr.total).div(3).pow(tlyr.exponent) .pow_base(tlyr.base).mul(tlyr.requires) return tlyr.getResetGain.plus(1).pow(2).add(plyr.points.mul(2).add(plyr.total).div(3)) .minus(1).pow(tlyr.exponent).pow_base(tlyr.base).mul(tlyr.requires) }, canReset() { return tmp[this.layer].getResetGain.gte(1) }, prestigeButtonText() { return "Reset for " + format(tmp[this.layer].getResetGain.max(1)) + " " + tmp[this.layer].resource + "

Req: " + format(tmp[this.layer].baseAmount) + "/" + format(tmp[this.layer].getNextAt) + " " + tmp[this.layer].baseResource }, prestigeNotify() { return tmp[this.layer].canReset }, gainMult() { // Calculate the multiplier for main currency from bonuses return new Decimal(1) }, gainExp() { // Calculate the exponent on main currency from bonuses return new Decimal(1) }, canBuyMax() { return hasMilestone(this.layer, 8) }, row: 2, // Row the layer is in on the tree (0 is the first row) displayRow: 0, hotkeys: [ {key: "f", description: "F: Reset for files", onPress(){if (canReset(this.layer)) doReset(this.layer)}}, ], milestones: { 0: { requirementDescription: "1 total File.", effectDescription: "Triple PP and SPP gen.", done() { return player.f.total.gte(1) } }, 1: { requirementDescription: "2 total Files.", effectDescription() { return "Total levels and super levels boost point gen.
Effect: x" + format(getTotalLevel().add(getTotalSuperLevel()).add(7).log(2)) + "." }, done() { return player.f.total.gte(2) } }, 2: { requirementDescription: "3 total Files.", effectDescription: "Halve PP req.", done() { return player.f.total.gte(3) } }, 3: { requirementDescription: "4 total Files.", effectDescription: "SPP no longer resets PP.", done() { return player.f.total.gte(4) } }, 4: { requirementDescription: "5 total Files.", effectDescription: "Unlock the Directory.", done() { return player.f.total.gte(5) } }, 5: { requirementDescription: "6 total Files.", effectDescription: "You can now get fractional levels.", done() { return player.f.total.gte(6) } }, 6: { requirementDescription: "8 total Files.", effectDescription() { return "Total Files boost point gen.
Effect: x" + format(player[this.layer].total.div(2).add(1)) + "." }, done() { return player.f.total.gte(8) } }, 7: { requirementDescription: "10 total Files.", effectDescription: "Autobuy all PP buyables.", done() { return player.f.total.gte(10) } }, 8: { requirementDescription: "15 total Files.", effectDescription: "You can buy max files.", done() { return player.f.total.gte(15) } }, 9: { requirementDescription: "20 total Files.", effectDescription: "Halve base file cost.", done() { return player.f.total.gte(20) } }, 10: { requirementDescription: "25 total Files.", effectDescription: "Autobuy both SPP buyables.", done() { return player.f.total.gte(25) } }, 11: { requirementDescription: "50 total Files.", effectDescription() { return "Total super levels boost second softcap.
Effect: ^" + format(getTotalSuperLevel().pow(1/10).add(1).log(10).add(1)) + "." }, done() { return player.f.total.gte(50) } }, }, upgrades: { 11: { description: "Total rank boosts point gen.", effect() { return getTotalRank().add(2) }, effectDisplay() { return "^" + format(this.effect()) + "." }, cost: 1, canAfford() { return hasMilestone(this.layer, 4) }, }, 21: { description: "Start with 2 free Rebased levels.", cost: 3, canAfford() { return hasUpgrade(this.layer, 11) }, branches: [11] }, 22: { description: "Start with 2 free Shorter bars levels.", cost: 3, canAfford() { return hasUpgrade(this.layer, 11) }, branches: [11] }, 23: { description: "Gain 10% of your PP gain every second.", cost: 4, canAfford() { return hasUpgrade(this.layer, 11) }, branches: [11] }, 31: { description: "Make Gamma effect use total level as well.", cost: 5, canAfford() { return hasUpgrade(this.layer, 21) }, branches: [21] }, 32: { description: "Halve base File cost.", cost: 6, canAfford() { return hasUpgrade(this.layer, 21) && hasUpgrade(this.layer, 22) }, branches: [21, 22] }, 33: { description: "Multiply base PP cost by 0.75.", cost: 5, canAfford() { return hasUpgrade(this.layer, 22) }, branches: [22] }, 41: { description: "Raise Beta, Delta, Zeta effects ^1.1.", cost: 8, canAfford() { return hasUpgrade(this.layer, 31) }, branches: [31] }, 42: { description: "Raise File cost base ^0.95.", cost: 8, canAfford() { return hasUpgrade(this.layer, 32) }, branches: [32] }, 43: { description: "Total Files divide PP cost.", cost: 9, canAfford() { return hasUpgrade(this.layer, 32) && hasUpgrade(this.layer, 33) }, effect() { return player[this.layer].total.add(3).log(2).add(1) }, effectDisplay() { return "/" + format(this.effect()) + "." }, branches: [32, 33] }, 44: { description: "Gain another 15% of your PP gain every second.", cost: 8, canAfford() { return hasUpgrade(this.layer, 23) && hasUpgrade(this.layer, 33) }, branches: [[23, 2], 33] }, 51: { description: "Multiply all rank effects by 2.", cost: 15, canAfford() { return hasUpgrade(this.layer, 41) && hasUpgrade(this.layer, 43) }, branches: [41, [43, 2]] }, 52: { description: "Raise File cost exponent ^0.8.", cost: 13, canAfford() { return hasUpgrade(this.layer, 42) }, branches: [42] }, 53: { description: "Total files boost point gen.", cost: 14, canAfford() { return hasUpgrade(this.layer, 43) }, effect() { return player[this.layer].points.log(10).add(1) }, effectDisplay() { return "^" + format(this.effect()) + "." }, branches: [43] }, 54: { description: "Halve base SPP cost.", cost: 13, canAfford() { return hasUpgrade(this.layer, 43) }, branches: [43] }, 61: { description: "Decrease the second softcap's log base.", cost: 20, canAfford() { return hasUpgrade(this.layer, 51) && hasUpgrade(this.layer, 52) }, branches: [51, 52] }, 62: { description: "Gain 20% of your SPP gain per second.", cost: 20, canAfford() { return hasUpgrade(this.layer, 53) && hasUpgrade(this.layer, 44) }, branches: [53, [44, 2]] } }, buyables: { 11: { title: "The finale of the intro", effect() { return Decimal.pow(1.5, getBuyableAmount(this.layer, this.id)) }, cost() { return Decimal.mul(getBuyableAmount(this.layer, this.id), 10) }, display() { return "Increase point gen.

Amount: " + format(getBuyableAmount(this.layer, this.id)) + ".
Effect: x" + format(this.effect(getBuyableAmount(this.layer, this.id))) + ".
Cost: " + format(this.cost(getBuyableAmount(this.layer, this.id))) + " Files." }, canAfford() { return Decimal.gte(player[this.layer].points, this.cost()) && hasUpgrade(this.layer, 61) && hasUpgrade(this.layer, 62) }, buy() { addBuyables(this.layer, this.id, 1) player[this.layer].points = player[this.layer].points.sub(this.cost()) } } }, clickables: { 21: { display() { return "Reset directory" }, onClick() { if (confirm("Are you sure you want to respec? This will cause a File reset.")) { if (player[this.layer].upgrades == 0) player.ach.has55 = true player[this.layer].points = player[this.layer].total player[this.layer].upgrades = [] player[this.layer].buyables[11] = new Decimal(0) doReset('f', true) } }, canClick() { return true }, style: { width: "60px", minHeight: "60px" } } }, layerShown(){ return player.sp.points.gte(200) || player[this.layer].unlocked }, branches: ['p'], tabFormat: { filestones: { content: [ "main-display", "prestige-button", "resource-display", "blank", "blank", ["row", [ ["milestones", [0, 2, 4, 6, 8, 10]], ["milestones", [1, 3, 5, 7, 9, 11]] ]] ] }, directory: { content: [ "main-display", ["row", ["prestige-button", ["clickable", 11]]], "resource-display", "blank", "blank", ["clickable", 21], "blank", ["upgrade-tree", [ [11], [21, 22, 23], [31, 32, 33], [41, 42, 43, 44], [51, 52, 53, 54], [61, 62] ]], "buyables" ], unlocked() { return hasMilestone('f', 4) } }, } })