diff --git a/docs/layer-features.md b/docs/layer-features.md
index 646d1d5..0752c75 100644
--- a/docs/layer-features.md
+++ b/docs/layer-features.md
@@ -141,7 +141,7 @@ Key:
and layers are sorted in alphabetical order.
- branches: **optional**, an array of layer ids. On a tree, a line will appear from this layer to all of the layers
- in the list. Alternatively, an entry in the array can be a pair consisting of the layer id and a color
+ in the list. Alternatively, an entry in the array can be a 2-element array consisting of the layer id and a color
value. The color value can either be a string with a hex color code, or a number from 1-3 (theme-affected colors)
- nodeStyle: **optional**, a CSS object, where the keys are CSS attributes, which styles this layer's node on the tree
diff --git a/js/layers.js b/js/layers.js
index b760785..c7d43b4 100644
--- a/js/layers.js
+++ b/js/layers.js
@@ -11,8 +11,8 @@ addLayer("c", {
buyables: {}, // You don't actually have to initialize this one
beep: false,
}},
- color:() => "#4BDC13",
- requires:() => new Decimal(10), // Can be a function that takes requirement increases into account
+ color: "#4BDC13",
+ requires: new Decimal(10), // Can be a function that takes requirement increases into account
resource: "lollipops", // Name of prestige currency
baseResource: "candies", // Name of resource prestige is based on
baseAmount() {return player.points}, // Get the current amount of baseResource
@@ -42,14 +42,14 @@ addLayer("c", {
return "which are boosting waffles by "+format(eff.waffleBoost)+" and increasing the Ice Cream cap by "+format(eff.icecreamCap)
},
milestones: {
- 0: {requirementDescription:() => "3 Lollipops",
+ 0: {requirementDescription: "3 Lollipops",
done() {return player[this.layer].best.gte(3)}, // Used to determine when to give the milestone
- effectDescription:() => "Unlock the next milestone",
+ effectDescription: "Unlock the next milestone",
},
- 1: {requirementDescription:() => "4 Lollipops",
+ 1: {requirementDescription: "4 Lollipops",
unlocked() {return hasMilestone(this.layer, 0)},
done() {return player[this.layer].best.gte(4)},
- effectDescription:() => "You can toggle beep and boop (which do nothing)",
+ effectDescription: "You can toggle beep and boop (which do nothing)",
toggles: [
["c", "beep"], // Each toggle is defined by a layer and the data toggled for that layer
["f", "boop"]],
@@ -64,11 +64,11 @@ addLayer("c", {
rows: 2,
cols: 12,
11: {
- name:() => "Fun",
+ name: "Fun",
completionLimit: 3,
challengeDescription() {return "Makes the game 0% harder
"+challengeCompletions(this.layer, this.id) + "/" + this.completionLimit + " completions"},
unlocked() { return player[this.layer].best.gt(0) },
- goal:() => new Decimal("20"),
+ goal: new Decimal("20"),
currencyDisplayName: "lollipops", // Use if using a nonstandard currency
currencyInternalName: "points", // Use if using a nonstandard currency
currencyLayer: this.layer, // Leave empty if not in a layer
@@ -86,14 +86,14 @@ addLayer("c", {
rows: 2,
cols: 3,
11: {
- title:() => "Generator of Genericness",
- description:() => "Gain 1 Point every second.",
- cost:() => new Decimal(1),
+ title: "Generator of Genericness",
+ description: "Gain 1 Point every second.",
+ cost: new Decimal(1),
unlocked() { return player[this.layer].unlocked }, // The upgrade is only visible when this is true
},
12: {
- description:() => "Candy generation is faster based on your unspent Lollipops.",
- cost:() => new Decimal(1),
+ description: "Candy generation is faster based on your unspent Lollipops.",
+ cost: new Decimal(1),
unlocked() { return (hasUpgrade(this.layer, 11))},
effect() { // Calculate bonuses from the upgrade. Can return a single value or an object with multiple values
let ret = player[this.layer].points.add(1).pow(player[this.layer].upgrades.includes(24)?1.1:(player[this.layer].upgrades.includes(14)?0.75:0.5))
@@ -103,8 +103,8 @@ addLayer("c", {
effectDisplay() { return format(this.effect())+"x" }, // Add formatting to the effect
},
13: {
- description:() => "Unlock a secret subtab and make this layer act if you unlocked it first.",
- cost:() => new Decimal(69),
+ description: "Unlock a secret subtab and make this layer act if you unlocked it first.",
+ cost: new Decimal(69),
currencyDisplayName: "candies", // Use if using a nonstandard currency
currencyInternalName: "points", // Use if using a nonstandard currency
currencyLayer: "", // Leave empty if not in a layer "e.g. points"
@@ -124,9 +124,9 @@ addLayer("c", {
},
},
22: {
- title:() => "This upgrade doesn't exist",
- description:() => "Or does it?.",
- cost:() => new Decimal(3),
+ title: "This upgrade doesn't exist",
+ description: "Or does it?.",
+ cost: new Decimal(3),
unlocked() { return player[this.layer].unlocked }, // The upgrade is only visible when this is true
},
},
@@ -138,9 +138,9 @@ addLayer("c", {
resetBuyables(this.layer)
doReset(this.layer, true) // Force a reset
},
- respecText:() => "Respec Thingies", // Text on Respec button, optional
+ respecText: "Respec Thingies", // Text on Respec button, optional
11: {
- title:() => "Exhancers", // Optional, displayed at the top in a larger font
+ title: "Exhancers", // Optional, displayed at the top in a larger font
cost(x=player[this.layer].buyables[this.id]) { // cost for buying xth buyable, can be an object if there are multiple currencies
if (x.gte(25)) x = x.pow(2).div(25)
let cost = Decimal.pow(2, x.pow(1.5))
@@ -224,7 +224,7 @@ addLayer("c", {
display() {
return format(player.points) + " / 1e10 points"
},
- unlocked:() => true,
+ unlocked: true,
},
tallBoi: {
@@ -242,7 +242,7 @@ addLayer("c", {
display() {
return formatWhole((player.points.div(1)).min(100)) + "%"
},
- unlocked:() => true,
+ unlocked: true,
},
flatBoi: {
@@ -257,7 +257,7 @@ addLayer("c", {
progress() {
return player.c.points.div(50)
},
- unlocked:() => true,
+ unlocked: true,
},
},
@@ -348,7 +348,7 @@ addLayer("f", {
boop: false,
clickables: {[11]: "Start"} // Optional default Clickable state
}},
- color:() => "#FE0102",
+ color: "#FE0102",
requires() {return new Decimal(10)},
resource: "farm points",
baseResource: "candies",
@@ -357,7 +357,7 @@ addLayer("f", {
exponent: 0.5,
base: 3,
roundUpCost: true,
- canBuyMax:() => true,
+ canBuyMax() {return hasAchievement('a', 13)},
gainMult() {
return new Decimal(1)
},
@@ -401,7 +401,7 @@ addLayer("f", {
},
masterButtonText() {return (getClickableState(this.layer, 11) == "Borkened...") ? "Fix the clickable!" : "Does nothing"}, // Text on Respec button, optional
11: {
- title:() => "Clicky clicky!", // Optional, displayed at the top in a larger font
+ title: "Clicky clicky!", // Optional, displayed at the top in a larger font
display() { // Everything else displayed in the buyable button after the title
let data = getClickableState(this.layer, this.id)
return "Current state:
" + data
@@ -453,121 +453,6 @@ addLayer("f", {
},
)
-
-// This layer is mostly minimal but it uses a custom prestige type and a clickable
-addLayer("f", {
- startData() { return {
- unlocked: false,
- points: new Decimal(0),
- boop: false,
- clickables: {[11]: "Start"} // Optional default Clickable state
- }},
- color:() => "#FE0102",
- requires() {return new Decimal(10)},
- resource: "farm points",
- baseResource: "candies",
- baseAmount() {return player.points},
- type: "custom", // A "Custom" type which is effectively static
- exponent: 0.5,
- base: 3,
- roundUpCost: true,
- canBuyMax:() => true,
- gainMult() {
- return new Decimal(1)
- },
- gainExp() {
- return new Decimal(1)
- },
- row: 1,
- layerShown() {return true},
- branches: ["c"], // When this layer appears, a branch will appear from this layer to any layers here. Each entry can be a pair consisting of a layer id and a color.
-
- tooltipLocked() { // Optional, tooltip displays when the layer is locked
- return ("This weird farmer dinosaur will only see you if you have at least " + this.requires() + " candies. You only have " + formatWhole(player.points))
- },
-
- midsection: [
- "blank", ['display-image', 'https://images.beano.com/store/24ab3094eb95e5373bca1ccd6f330d4406db8d1f517fc4170b32e146f80d?auto=compress%2Cformat&dpr=1&w=390'],
- ["display-text", "Bork bork!"]
- ],
-
- // The following are only currently used for "custom" Prestige type:
- prestigeButtonText() { //Is secretly HTML
- if (!this.canBuyMax()) return "Hi! I'm a weird dinosaur and I'll give you a Farm Point in exchange for all of your candies and lollipops! (At least " + formatWhole(tmp[this.layer].nextAt) + " candies)"
- if (this.canBuyMax()) return "Hi! I'm a weird dinosaur and I'll give you " + formatWhole(tmp[this.layer].resetGain) + " Farm Points in exchange for all of your candies and lollipops! (You'll get another one at " + formatWhole(tmp[layer].nextAtDisp) + " candies)"
- },
- getResetGain() {
- return getResetGain(this.layer, useType = "static")
- },
- getNextAt(canMax=false) { //
- return getNextAt(this.layer, canMax, useType = "static")
- },
- canReset() {
- return tmp[this.layer].baseAmount.gte(tmp[this.layer].nextAt)
- },
- // This is also non minimal, a Clickable!
- clickables: {
- rows: 1,
- cols: 1,
- masterButtonPress() { // Optional, reset things and give back your currency. Having this function makes a respec button appear
- if (getClickableState(this.layer, 11) == "Borkened...")
- player[this.layer].clickables[11] = "Start"
- },
- masterButtonText() {return (getClickableState(this.layer, 11) == "Borkened...") ? "Fix the clickable!" : "Does nothing"}, // Text on Respec button, optional
- 11: {
- title:() => "Clicky clicky!", // Optional, displayed at the top in a larger font
- display() { // Everything else displayed in the buyable button after the title
- let data = getClickableState(this.layer, this.id)
- return "Current state:
" + data
- },
- unlocked() { return player[this.layer].unlocked },
- canClick() {
- return getClickableState(this.layer, this.id) !== "Borkened..."},
- onClick() {
- switch(getClickableState(this.layer, this.id)){
- case "Start":
- player[this.layer].clickables[this.id] = "A new state!"
- break;
- case "A new state!":
- player[this.layer].clickables[this.id] = "Keep going!"
- break;
- case "Keep going!":
- player[this.layer].clickables[this.id] = "Maybe that's a bit too far..."
- break;
- case "Maybe that's a bit too far...":
- player[this.layer].clickables[this.id] = "Borkened..."
- break;
- default:
- player[this.layer].clickables[this.id] = "Start"
- break;
-
- }
- },
- style() {
- switch(getClickableState(this.layer, this.id)){
- case "Start":
- return {'background-color': 'green'}
- break;
- case "A new state!":
- return {'background-color': 'yellow'}
- break;
- case "Keep going!":
- return {'background-color': 'orange'}
- break;
- case "Maybe that's a bit too far...":
- return {'background-color': 'red'}
- break;
- default:
- return {}
- break;
- }},
- },
- },
-
-},
-)
-
-
// This layer is mostly minimal but it uses a custom prestige type and a clickable
addLayer("a", {
startData() { return {