addLayer("i", {
name: "integrals", // 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: 0, // 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),
incDelta: 1,
number: [1]
}},
color: "#a62222",
requires: Decimal.pow(2, 127.9), // Can be a function that takes requirement increases into account
resource: "integrals", // Name of prestige currency
baseResource: "points", // Name of resource prestige is based on
baseAmount() {return player.points}, // Get the current amount of baseResource
type: "normal", // normal: cost to gain currency depends on amount gained. static: cost depends on how much you already have
exponent: 0.1, // Prestige currency exponent
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)
},
row: 3, // Row the layer is in on the tree (0 is the first row)
displayRow: 1,
hotkeys: [
{key: "i", description: "I: reset for integrals", onPress(){if (canReset(this.layer)) doReset(this.layer)}},
],
milestones: {
0: {
requirementDescription: "1 total Integral.",
effectDescription: "Gain double Files and halve total File effect on File cost.",
done() { return player[this.layer].total.gte(1) }
},
1: {
requirementDescription: "2 total Integrals.",
effectDescription: "Start every reset with 1000 PP, 250 SPP, and 5 Files",
done() { return player[this.layer].total.gte(2) }
},
2: {
requirementDescription: "3 total Integrals.",
effectDescription: "Unlock the Number.",
done() { return player[this.layer].total.gte(3) }
},
},
buyables: {
11: {
title: "Longer number",
effect() { return getBuyableAmount(this.layer, this.id).add(1).toNumber() },
cost() { return getBuyableAmount(this.layer, this.id).add(1).mul(2) },
display() {
return "Increase the length of your number.
Amount: " + format(getBuyableAmount(this.layer, this.id))
+ ".
Effect: " + format(this.effect(getBuyableAmount(this.layer, this.id))) + " digits.
Cost: "
+ format(this.cost(getBuyableAmount(this.layer, this.id))) + " Integrals."
},
canAfford() { return Decimal.gte(player[this.layer].points, this.cost()) },
buy() {
player[this.layer].points = player[this.layer].points.sub(this.cost())
addBuyables(this.layer, this.id, 1)
player[this.layer].number.push(0)
}
},
12: {
title: "Faster incrementing",
effect() { return getBuyableAmount(this.layer, this.id).add(1).pow(1.3).toNumber() },
cost() { return getBuyableAmount(this.layer, this.id).add(1).mul(3) },
display() {
return "Increase the speed of incrementing.
Amount: " + format(getBuyableAmount(this.layer, this.id))
+ ".
Effect: " + format(this.effect(getBuyableAmount(this.layer, this.id))) + "/s.
Cost: "
+ format(this.cost(getBuyableAmount(this.layer, this.id))) + " Integrals."
},
canAfford() { return Decimal.gte(player[this.layer].points, this.cost()) },
buy() {
player[this.layer].points = player[this.layer].points.sub(this.cost())
addBuyables(this.layer, this.id, 1)
}
},
13: {
title: "Higher base",
effect() { return getBuyableAmount(this.layer, this.id).add(2).toNumber() },
cost() { return getBuyableAmount(this.layer, this.id).add(1).mul(10) },
display() {
return "Increase the base of your number.
Amount: " + format(getBuyableAmount(this.layer, this.id))
+ "/" + format(this.purchaseLimit) + ".
Effect: "
+ format(this.effect(getBuyableAmount(this.layer, this.id))) + ".
Cost: "
+ format(this.cost(getBuyableAmount(this.layer, this.id))) + " Integrals."
},
canAfford() { return Decimal.gte(player[this.layer].points, this.cost()) },
buy() {
player[this.layer].points = player[this.layer].points.sub(this.cost())
addBuyables(this.layer, this.id, 1)
},
purchaseLimit: 34
},
},
numberEffect() {
return Math.sqrt(player[this.layer].number.reduceRight((x, y) => x * buyableEffect('i', 13) + y) + 1)
},
update(diff) {
if (isNaN(diff)) return
player[this.layer].incDelta += diff
player[this.layer].number[0] += Math.floor(player[this.layer].incDelta * buyableEffect('i', 12))
player[this.layer].incDelta %= 1/buyableEffect('i', 12)
for (let i = 0; i < player[this.layer].number.length - 1; i ++) {
player[this.layer].number[i+1] += Math.floor(player[this.layer].number[i] / buyableEffect('i', 13))
player[this.layer].number[i] %= buyableEffect('i', 13)
}
if (player[this.layer].number[player[this.layer].number.length - 1] >= buyableEffect('i', 13)) {
player[this.layer].number = new Array(buyableEffect('i', 11)).fill(buyableEffect('i', 13) - 1)
}
},
clickables: {
21: {
display() { return "Reset number buyables" },
onClick() {
if (confirm("Are you sure you want to respec? This will reset your number.")) {
if ([11, 12, 13].map(n => getBuyableAmount(this.layer, n)).reduce((a, b) => a.add(b)).eq(0)) {
player.ach.has75 = true
}
player[this.layer].points = player[this.layer].total
player[this.layer].buyables[11] = new Decimal(0)
player[this.layer].buyables[12] = new Decimal(0)
player[this.layer].buyables[13] = new Decimal(0)
}
},
canClick() { return true },
style: {
width: "60px",
minHeight: "60px"
}
}
},
tabFormat: {
main: {
content: [
"main-display",
"prestige-button",
"resource-display",
"blank",
"blank",
"milestones",
["raw-html", "More content coming your way!"]
]
},
number: {
content: [
"main-display",
"prestige-button",
"resource-display",
"blank",
"blank",
["raw-html", function() {
return `Your number is