From ed6bc66478f7ac0f29cee2532882f6b7922abf5e Mon Sep 17 00:00:00 2001
From: Icecreamdude <72051053+Icecreamdudes@users.noreply.github.com>
Date: Sat, 31 Aug 2024 11:47:51 -0400
Subject: [PATCH] df
---
css/style.css | 14 +
js/Cantepocalypse/altRanks.js | 25 +-
js/Cantepocalypse/anonymity.js | 187 +++++++++++-
js/Cantepocalypse/cantepocalypse.js | 72 ++++-
js/Cantepocalypse/perks.js | 39 ++-
js/Cantepocalypse/repliGrass.js | 427 +++++++++++++++++++++++++++
js/Cantepocalypse/repliTrees.js | 436 ++++++++++++++++++++++++++++
js/cante.js | 17 +-
js/cutscene.js | 2 +-
js/mod.js | 4 +-
10 files changed, 1205 insertions(+), 18 deletions(-)
create mode 100644 js/Cantepocalypse/repliGrass.js
create mode 100644 js/Cantepocalypse/repliTrees.js
diff --git a/css/style.css b/css/style.css
index 9ed30bd..6b27868 100644
--- a/css/style.css
+++ b/css/style.css
@@ -882,6 +882,20 @@ button > * {
overflow: hidden; /* Ensure grass squares stay within spawn area */
}
+#repli-spawn-area {
+ width: 80%; /* Adjust as needed */
+ height: 50%; /* Adjust as needed */
+ background-color: #67cc3b;
+ opacity: 90%;
+ position: absolute;
+ bottom: 10%;
+ left: 50%;
+ transform: translateX(-50%);
+ border: 2px solid black;
+ box-sizing: border-box; /* Include border in dimensions */
+ overflow: hidden; /* Ensure grass squares stay within spawn area */
+}
+
.particle {
position: absolute;
width: 50px; /* Adjust size as needed */
diff --git a/js/Cantepocalypse/altRanks.js b/js/Cantepocalypse/altRanks.js
index de3f15a..21128be 100644
--- a/js/Cantepocalypse/altRanks.js
+++ b/js/Cantepocalypse/altRanks.js
@@ -34,13 +34,21 @@
player.ar.rankPointsToGet = player.ar.rankPointsToGet.mul(buyableEffect("pr", 13))
player.ar.rankPointsToGet = player.ar.rankPointsToGet.mul(player.ar.tetrPointsEffect)
+ if (hasUpgrade("an", 13)) player.ar.rankPoints = player.ar.rankPoints.add(player.ar.rankPointsToGet.mul(Decimal.mul(delta, 0.05)))
+ if (hasUpgrade("an", 15)) player.ar.rankPoints = player.ar.rankPoints.add(player.ar.rankPointsToGet.mul(Decimal.mul(delta, 0.25)))
+ if (hasUpgrade("an", 18)) player.ar.rankPoints = player.ar.rankPoints.add(player.ar.rankPointsToGet.mul(delta))
+
player.ar.tierPointsToGet = player.ar.rankPoints.mul(0.1).pow(0.4)
player.ar.tierPointsEffect = player.ar.tierPoints.pow(0.65).add(1)
player.ar.tierPointsToGet = player.ar.tierPointsToGet.mul(buyableEffect("pr", 14))
player.ar.tierPointsToGet = player.ar.tierPointsToGet.mul(player.ar.tetrPointsEffect)
+ if (hasUpgrade("an", 15)) player.ar.tierPoints = player.ar.tierPoints.add(player.ar.tierPointsToGet.mul(Decimal.mul(delta, 0.05)))
+ if (hasUpgrade("an", 18)) player.ar.tierPoints = player.ar.tierPoints.add(player.ar.tierPointsToGet.mul(Decimal.mul(delta, 0.25)))
+
player.ar.tetrPointsToGet = player.ar.tierPoints.mul(0.1).pow(0.4)
player.ar.tetrPointsEffect = player.ar.tetrPoints.pow(0.5).add(1)
+ if (hasUpgrade("an", 18)) player.ar.tetrPoints = player.ar.tetrPoints.add(player.ar.tetrPointsToGet.mul(Decimal.mul(delta, 0.05)))
},
clickables: {
1: {
@@ -87,6 +95,21 @@
},
},
bars: {
+ replicantiBar: {
+ unlocked() { return true },
+ direction: RIGHT,
+ width: 400,
+ height: 25,
+ progress() {
+ return player.cp.replicantiPointsTimer.div(player.cp.replicantiPointsTimerReq)
+ },
+ fillStyle: {
+ "background-color": "#193ceb",
+ },
+ display() {
+ return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq);
+ },
+ },
},
upgrades: {
@@ -131,8 +154,8 @@
tabFormat: [
["raw-html", function () { return "You have
" + format(player.cp.replicantiPoints) + "
replicanti points." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
- ["raw-html", function () { return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq) }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
["raw-html", function () { return "Replicanti points Mult: " + format(player.cp.replicantiPointsMult, 4) + "x" }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
+ ["row", [["bar", "replicantiBar"]]],
["row", [["clickable", 1]]],
["microtabs", "stuff", { 'border-width': '0px' }],
],
diff --git a/js/Cantepocalypse/anonymity.js b/js/Cantepocalypse/anonymity.js
index e632c3f..52c22cf 100644
--- a/js/Cantepocalypse/anonymity.js
+++ b/js/Cantepocalypse/anonymity.js
@@ -7,7 +7,7 @@
unlocked: true,
anonymity: new Decimal(0),
- anonymityToGet: new Decimal(1),
+ anonymityToGet: new Decimal(0),
}
},
automate() {
@@ -19,6 +19,10 @@
color: "#0c04c1",
update(delta) {
let onepersec = new Decimal(1)
+
+ player.an.anonymityToGet = player.cp.replicantiPoints.div(250000).pow(0.25)
+ if (hasUpgrade("an", 17)) player.an.anonymityToGet = player.an.anonymityToGet.mul(upgradeEffect("an", 17))
+ player.an.anonymityToGet = player.an.anonymityToGet.mul(player.rt.repliTreesEffect)
},
clickables: {
1: {
@@ -30,14 +34,180 @@
},
style: { width: '100px', "min-height": '50px' },
},
+ 11: {
+ title() { return "Reset previous content except perks for anonymity. (based on replicanti points)" },
+ canClick() { return player.an.anonymityToGet.gte(1) },
+ unlocked() { return true },
+ onClick() {
+ player.an.anonymity = player.an.anonymity.add(player.an.anonymityToGet)
+
+ player.ar.rankPoints = new Decimal(0)
+ player.ar.tierPoints = new Decimal(0)
+ player.ar.tetrPoints = new Decimal(0)
+ player.cp.replicantiPoints = new Decimal(1)
+ },
+ style: { width: '400px', "min-height": '100px'},
+ },
},
bars: {
+ replicantiBar: {
+ unlocked() { return true },
+ direction: RIGHT,
+ width: 400,
+ height: 25,
+ progress() {
+ return player.cp.replicantiPointsTimer.div(player.cp.replicantiPointsTimerReq)
+ },
+ fillStyle: {
+ "background-color": "#193ceb",
+ },
+ display() {
+ return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq);
+ },
+ },
},
upgrades: {
-
+ 11:
+ {
+ title: "Anonymity Upgrade I",
+ unlocked() { return true },
+ description: "Multiplies replicanti mult by x1.5.",
+ cost: new Decimal(2),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ },
+ 12:
+ {
+ title: "Anonymity Upgrade II",
+ unlocked() { return true },
+ description: "Multiplies replicanti mult based on anonymity.",
+ cost: new Decimal(5),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ effect() {
+ return player.an.anonymity.plus(1).log10().pow(1.25).add(1)
+ },
+ effectDisplay() { return format(upgradeEffect(this.layer, this.id))+"x" }, // Add formatting to the effect
+ },
+ 13:
+ {
+ title: "Anonymity Upgrade III",
+ unlocked() { return true },
+ description: "Gain 5% of rank points per second.",
+ cost: new Decimal(16),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ },
+ 14:
+ {
+ title: "Anonymity Upgrade IV",
+ unlocked() { return true },
+ description: "Extend the first and second softcap by x1,000.",
+ cost: new Decimal(48),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ },
+ 15:
+ {
+ title: "Anonymity Upgrade V",
+ unlocked() { return true },
+ description: "Gain 25% of rank points per second, and gain 5% of tier points per second.",
+ cost: new Decimal(212),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ style: { width: '150px', height: '100px', }
+ },
+ 16:
+ {
+ title: "Anonymity Upgrade VI",
+ unlocked() { return true },
+ description: "Boost perk points based on anonymity.",
+ cost: new Decimal(666),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ style: { width: '125px', height: '100px', },
+ effect() {
+ return player.an.anonymity.pow(0.15).div(6).add(1)
+ },
+ effectDisplay() { return format(upgradeEffect(this.layer, this.id))+"x" }, // Add formatting to the effect
+ },
+ 17:
+ {
+ title: "Anonymity Upgrade VII",
+ unlocked() { return true },
+ description: "Boost anonymity based on perk points.",
+ cost: new Decimal(2345),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ style: { width: '125px', height: '100px', },
+ effect() {
+ return player.pr.perkPoints.pow(0.2).div(3).add(1)
+ },
+ effectDisplay() { return format(upgradeEffect(this.layer, this.id))+"x" }, // Add formatting to the effect
+ },
+ 18:
+ {
+ title: "Anonymity Upgrade VIII",
+ unlocked() { return true },
+ description: "Gain 100% of rank points per second, and gain 25% of tier points per second, and gain 5% of tetr points per second.",
+ cost: new Decimal(15000),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ style: { width: '150px', height: '100px', },
+ },
+ 19:
+ {
+ title: "Anonymity Upgrade IX",
+ unlocked() { return true },
+ description: "Extend first and second softcap based on anonymity.",
+ cost: new Decimal(250000),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ style: { width: '125px', hesight: '100px', },
+ effect() {
+ return player.an.anonymity.pow(0.75).mul(6).add(1)
+ },
+ effectDisplay() { return format(upgradeEffect(this.layer, this.id))+"x" }, // Add formatting to the effect
+ style: { width: '150px', height: '100px', },
+ },
+ 21:
+ {
+ title: "Anonymity Upgrade X",
+ unlocked() { return true },
+ description: "Reduce repli-leaf time by 1.5s.",
+ cost: new Decimal(4e6),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ style: { width: '125px', hesight: '100px', },
+ },
+ 22:
+ {
+ title: "Anonymity Upgrade XI",
+ unlocked() { return true },
+ description: "Weaken second softcap based on second softcap start.",
+ cost: new Decimal(6e7),
+ currencyLocation() { return player.an },
+ currencyDisplayName: "Anonymity",
+ currencyInternalName: "anonymity",
+ style: { width: '150px', height: '100px', },
+ effect() {
+ return player.cp.replicantiSoftcap2Start.plus(1).log10().pow(0.65).mul(5).add(1)
+ },
+ effectDisplay() { return "/" + format(upgradeEffect(this.layer, this.id)) }, // Add formatting to the effect
+ },
},
buyables: {
-
+
},
milestones: {
@@ -55,8 +225,13 @@
[
["blank", "25px"],
["raw-html", function () { return "You have " + format(player.an.anonymity) + "
anonymity." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
- ["raw-html", function () { return "You will gain " + format(player.an.anonymity) + "
anonymity on reset" }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],,
- ]
+ ["raw-html", function () { return "You will gain " + format(player.an.anonymityToGet) + "
anonymity on reset." }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],,
+ ["blank", "25px"],
+ ["row", [["clickable", 11]]],
+ ["blank", "25px"],
+ ["row", [["upgrade", 11], ["upgrade", 12], ["upgrade", 13], ["upgrade", 14], ["upgrade", 15], ["upgrade", 16]]],
+ ["row", [["upgrade", 17], ["upgrade", 18], ["upgrade", 19], ["upgrade", 21], ["upgrade", 22]]],
+ ]
},
},
@@ -64,8 +239,8 @@
tabFormat: [
["raw-html", function () { return "You have " + format(player.cp.replicantiPoints) + "
replicanti." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
- ["raw-html", function () { return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq) }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
["raw-html", function () { return "Replicanti Mult: " + format(player.cp.replicantiPointsMult, 4) + "x" }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
+ ["row", [["bar", "replicantiBar"]]],
["row", [["clickable", 1]]],
["microtabs", "stuff", { 'border-width': '0px' }],
],
diff --git a/js/Cantepocalypse/cantepocalypse.js b/js/Cantepocalypse/cantepocalypse.js
index 078a9e9..c2027c2 100644
--- a/js/Cantepocalypse/cantepocalypse.js
+++ b/js/Cantepocalypse/cantepocalypse.js
@@ -1,4 +1,4 @@
-var tree = [["ar", "pr", "an"]]
+var tree = [["ar", "pr", "an"], ["rt", "rg"]]
addLayer("cp", {
name: "Alt-Universe 1: Cantepocalypse", // 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
@@ -15,7 +15,10 @@ addLayer("cp", {
replicantiPointCap: new Decimal(1.79e308),
replicantiSoftcapEffect: new Decimal(1),
- replicantiSoftcapStart: new Decimal(1e6),
+ replicantiSoftcapStart: new Decimal(1000),
+
+ replicantiSoftcap2Effect: new Decimal(1),
+ replicantiSoftcap2Start: new Decimal(1e10),
}
},
automate() {
@@ -37,12 +40,18 @@ addLayer("cp", {
multAdd = new Decimal(0.01)
multAdd = multAdd.add(player.ar.rankPointsEffect)
multAdd = multAdd.mul(buyableEffect("pr", 11))
+ if (hasUpgrade("an", 11)) multAdd = multAdd.mul(1.5)
+ if (hasUpgrade("an", 12)) multAdd = multAdd.mul(upgradeEffect("an", 12))
+ multAdd = multAdd.mul(buyableEffect("rt", 15))
+ multAdd = multAdd.mul(player.rg.repliGrassEffect)
player.cp.replicantiPointsTimerReq = new Decimal(3)
player.cp.replicantiPointsTimerReq = player.cp.replicantiPointsTimerReq.div(buyableEffect("pr", 12))
player.cp.replicantiSoftcapStart = new Decimal(1000)
player.cp.replicantiSoftcapStart = player.cp.replicantiSoftcapStart.mul(buyableEffect("pr", 15))
+ if (hasUpgrade("an", 14)) player.cp.replicantiSoftcapStart = player.cp.replicantiSoftcapStart.mul(1000)
+ if (hasUpgrade("an", 19)) player.cp.replicantiSoftcapStart = player.cp.replicantiSoftcapStart.mul(upgradeEffect("an", 19))
player.cp.replicantiSoftcapEffect = player.cp.replicantiPoints.sub(player.cp.replicantiSoftcapStart).pow(0.375)
player.cp.replicantiSoftcapEffect = player.cp.replicantiSoftcapEffect.div(buyableEffect("pr", 16))
@@ -51,6 +60,19 @@ addLayer("cp", {
multAdd = multAdd.div(player.cp.replicantiSoftcapEffect)
}
+ player.cp.replicantiSoftcap2Start = new Decimal(1e9)
+ if (hasUpgrade("an", 14)) player.cp.replicantiSoftcap2Start = player.cp.replicantiSoftcap2Start.mul(1000)
+ player.cp.replicantiSoftcap2Start = player.cp.replicantiSoftcap2Start.mul(buyableEffect("rt", 17))
+ if (hasUpgrade("an", 19)) player.cp.replicantiSoftcap2Start = player.cp.replicantiSoftcap2Start.mul(upgradeEffect("an", 19))
+
+ player.cp.replicantiSoftcap2Effect = player.cp.replicantiPoints.sub(player.cp.replicantiSoftcap2Start).pow(0.25).div(4)
+ player.cp.replicantiSoftcap2Effect = player.cp.replicantiSoftcap2Effect.div(buyableEffect("pr", 16))
+ if (hasUpgrade("an", 22)) player.cp.replicantiSoftcap2Effect = player.cp.replicantiSoftcap2Effect.div(upgradeEffect("an", 22))
+ if (player.cp.replicantiPoints.gte(player.cp.replicantiSoftcap2Start))
+ {
+ multAdd = multAdd.div(player.cp.replicantiSoftcap2Effect)
+ }
+
player.cp.replicantiPointsMult = multAdd.add(1)
if (player.cap.cantepocalypseUnlock) player.cp.replicantiPointsTimer = player.cp.replicantiPointsTimer.add(onepersec.mul(delta))
@@ -89,6 +111,21 @@ addLayer("cp", {
},
},
bars: {
+ replicantiBar: {
+ unlocked() { return true },
+ direction: RIGHT,
+ width: 400,
+ height: 25,
+ progress() {
+ return player.cp.replicantiPointsTimer.div(player.cp.replicantiPointsTimerReq)
+ },
+ fillStyle: {
+ "background-color": "#193ceb",
+ },
+ display() {
+ return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq);
+ },
+ },
},
upgrades: {
11:
@@ -131,6 +168,26 @@ addLayer("cp", {
currencyDisplayName: "Replicanti Points",
currencyInternalName: "replicantiPoints",
},
+ 15:
+ {
+ title: "Feature V",
+ unlocked() { return true },
+ description: "Unlocks Repli-Trees.",
+ cost: new Decimal(1e20),
+ currencyLocation() { return player.cp },
+ currencyDisplayName: "Replicanti Points",
+ currencyInternalName: "replicantiPoints",
+ },
+ 16:
+ {
+ title: "Feature VI",
+ unlocked() { return true },
+ description: "Unlocks Repli-Grass.",
+ cost: new Decimal(1e30),
+ currencyLocation() { return player.cp },
+ currencyDisplayName: "Replicanti Points",
+ currencyInternalName: "replicantiPoints",
+ },
},
buyables: {
},
@@ -158,7 +215,7 @@ addLayer("cp", {
content:
[
["blank", "25px"],
- ["row", [["upgrade", 11], ["upgrade", 12], ["upgrade", 13], ["upgrade", 14]]],
+ ["row", [["upgrade", 11], ["upgrade", 12], ["upgrade", 13], ["upgrade", 14], ["upgrade", 15], ["upgrade", 16]]],
]
},
@@ -170,12 +227,15 @@ addLayer("cp", {
["blank", "25px"],
["raw-html", function () { return "Softcap starts at " + format(player.cp.replicantiSoftcapStart) + "
." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
["raw-html", function () { return "Softcap divides replicanti mult by /" + format(player.cp.replicantiSoftcapEffect) + "
." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
+ ["blank", "25px"],
+ ["raw-html", function () { return player.cp.replicantiPoints.gte(player.cp.replicantiSoftcap2Start) ? "Second softcap starts at " + format(player.cp.replicantiSoftcap2Start) + "
." : ""}, { "color": "#ff4545", "font-size": "20px", "font-family": "monospace" }],
+["raw-html", function () { return player.cp.replicantiPoints.gte(player.cp.replicantiSoftcap2Start) ? "Second softcap divides replicanti mult by /" + format(player.cp.replicantiSoftcap2Effect) + "
." : ""}, { "color": "#ff4545", "font-size": "20px", "font-family": "monospace" }],
]
},
"Portal": {
buttonStyle() { return { 'color': 'black', 'border-color': 'purple', background: 'linear-gradient(45deg, #8a00a9, #0061ff)', } },
- unlocked() { return player.can.unlockedPortal },
+ unlocked() { return player.cp.unlockedPortal },
content:
[
]
@@ -221,9 +281,9 @@ addLayer("cp", {
tabFormat: [
["raw-html", function () { return "You have " + format(player.cp.replicantiPoints) + "
replicanti points." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
- ["raw-html", function () { return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq) }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
["raw-html", function () { return "Replicanti point Mult: " + format(player.cp.replicantiPointsMult, 4) + "x" }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
- ["microtabs", "stuff", { 'border-width': '0px' }],
+ ["row", [["bar", "replicantiBar"]]],
+ ["microtabs", "stuff", { 'border-width': '0px' }],
],
layerShown() { return player.startedGame == true}
})
\ No newline at end of file
diff --git a/js/Cantepocalypse/perks.js b/js/Cantepocalypse/perks.js
index 066b33d..42a3551 100644
--- a/js/Cantepocalypse/perks.js
+++ b/js/Cantepocalypse/perks.js
@@ -23,6 +23,8 @@
player.pr.perkPointsToGet = new Decimal(1)
player.pr.perkPointsToGet = player.pr.perkPointsToGet.mul(buyableEffect("pr", 17))
+ if (hasUpgrade("an", 16)) player.pr.perkPointsToGet = player.pr.perkPointsToGet.mul(upgradeEffect("an", 16))
+ player.pr.perkPointsToGet = player.pr.perkPointsToGet.mul(buyableEffect("rt", 16))
player.pr.perkPointsChance = new Decimal(0.03)
player.pr.perkPointsChance = player.pr.perkPointsChance.add(buyableEffect("pr", 18))
@@ -37,8 +39,41 @@
},
style: { width: '100px', "min-height": '50px' },
},
+ 2: {
+ title() { return "Buy Max On" },
+ canClick() { return player.buyMax == false },
+ unlocked() { return true },
+ onClick() {
+ player.buyMax = true
+ },
+ style: { width: '75px', "min-height": '75px', }
+ },
+ 3: {
+ title() { return "Buy Max Off" },
+ canClick() { return player.buyMax == true },
+ unlocked() { return true },
+ onClick() {
+ player.buyMax = false
+ },
+ style: { width: '75px', "min-height": '75px', }
+ },
},
bars: {
+ replicantiBar: {
+ unlocked() { return true },
+ direction: RIGHT,
+ width: 400,
+ height: 25,
+ progress() {
+ return player.cp.replicantiPointsTimer.div(player.cp.replicantiPointsTimerReq)
+ },
+ fillStyle: {
+ "background-color": "#193ceb",
+ },
+ display() {
+ return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq);
+ },
+ },
},
upgrades: {
@@ -315,6 +350,8 @@
unlocked() { return true },
content:
[
+ ["blank", "25px"],
+ ["row", [["clickable", 2], ["clickable", 3]]],
["blank", "25px"],
["raw-html", function () { return "You have " + format(player.pr.perkPoints) + "
perk points." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
["raw-html", function () { return "You will gain " + format(player.pr.perkPointsToGet) + "
perk points." }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
@@ -330,8 +367,8 @@
tabFormat: [
["raw-html", function () { return "You have " + format(player.cp.replicantiPoints) + "
replicanti." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
- ["raw-html", function () { return "Time: " + formatTime(player.cp.replicantiPointsTimer) + "/" + formatTime(player.cp.replicantiPointsTimerReq) }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
["raw-html", function () { return "Replicanti Mult: " + format(player.cp.replicantiPointsMult, 4) + "x" }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
+ ["row", [["bar", "replicantiBar"]]],
["row", [["clickable", 1]]],
["microtabs", "stuff", { 'border-width': '0px' }],
],
diff --git a/js/Cantepocalypse/repliGrass.js b/js/Cantepocalypse/repliGrass.js
new file mode 100644
index 0000000..7436365
--- /dev/null
+++ b/js/Cantepocalypse/repliGrass.js
@@ -0,0 +1,427 @@
+addLayer("rg", {
+ name: "Repli-Grass", // This is optional, only used in a few places, If absent it just uses the layer id.
+ symbol: "RG", // This appears on the layer's node. Default is the id with the first letter capitalized
+ row: 1,
+ position: 0, // Horizontal position within a row. By default it uses the layer id and sorts in alphabetical order
+ startData() { return {
+ unlocked: true,
+
+ inRepliGrassTab: false,
+ repliGrass: new Decimal(1),
+ savedRepliGrass: new Decimal(0),
+ repliGrassEffect: new Decimal(1),
+ repliGrassEffect2: new Decimal(1),
+ repliGrassCap: new Decimal(50),
+ repliGrassCount: new Decimal(0),
+ repliGrassMult: new Decimal(1.01),
+ repliGrassReq: new Decimal(8),
+ repliGrassTimer: new Decimal(0),
+
+ repliGrassSoftcapEffect: new Decimal(1),
+ repliGrassSoftcapStart: new Decimal(1000),
+ }
+ },
+ automate() {
+ },
+ nodeStyle() {
+ },
+ tooltip: "Repli-Grass",
+ branches: ["rt"],
+ color: "#67cc3b",
+ update(delta) {
+ let onepersec = new Decimal(1)
+
+ if (player.subtabs["rg"]['stuff'] == 'Main' && player.tab == "rg" && player.rg.inRepliGrassTab == false)
+ {
+ layers.rg.loadRepliGrass();
+ }
+ if (!(player.subtabs["rg"]['stuff'] == 'Main') && !(player.tab == "rg") && player.rg.inRepliGrassTab == true)
+ {
+ layers.rg.unloadRepliGrass();
+ }
+ if (player.subtabs["rg"]['stuff'] == 'Main' && player.tab == "rg")
+ {
+ player.rg.inRepliGrassTab = true
+ if (player.rg.repliGrassCount < player.rg.repliGrassCap) player.rg.repliGrassTimer = player.rg.repliGrassTimer.add(onepersec.mul(delta))
+ if (player.rg.repliGrassTimer.gt(player.rg.repliGrassReq) && player.rg.repliGrassCount < player.rg.repliGrassCap)
+ {
+ createRepliGrass(1);
+ player.rg.savedRepliGrass++;
+ player.rg.repliGrassTimer = new Decimal(0)
+ }
+ } else if (!(player.tab == "rg"))
+ {
+ player.rg.inRepliGrassTab = false
+ if (player.rg.repliGrassCount < player.rg.repliGrassCap) player.rg.repliGrassTimer = player.rg.repliGrassTimer.add(onepersec.mul(delta))
+ if (player.rg.repliGrassTimer.gt(player.rg.repliGrassReq) && player.rg.savedRepliGrass < player.rg.repliGrassCap)
+ {
+ player.rg.savedRepliGrass++;
+ player.rg.repliGrassTimer = new Decimal(0)
+ } else if (player.rg.savedRepliGrass > player.rg.repliGrassCap) {
+ player.rg.savedRepliGrass = player.rg.repliGrassCap
+ }
+ } else
+ {
+ player.rg.inRepliGrassTab = false
+ if (player.rg.repliGrassCount < player.rg.repliGrassCap) player.rg.repliGrassTimer = player.rg.repliGrassTimer.add(onepersec.mul(delta))
+ }
+ if (player.rg.repliGrassCount < 0)
+ {
+ player.rg.repliGrassCount = new Decimal(0)
+ }
+
+ player.rg.repliGrassCap = new Decimal(50)
+ player.rg.repliGrassCap = player.rg.repliGrassCap.add(buyableEffect("rg", 13))
+
+ player.rg.repliGrassSoftcapStart = new Decimal(1000)
+ player.rg.repliGrassSoftcapStart = player.rg.repliGrassSoftcapStart.mul(buyableEffect("rg", 14))
+
+ let multAdd = new Decimal(0.01)
+ multAdd = multAdd.add(buyableEffect("rg", 11))
+
+ player.rg.repliGrassMult = multAdd.add(1)
+
+ player.rg.repliGrassSoftcapEffect = player.rg.repliGrass.sub(player.rg.repliGrassSoftcapStart).pow(0.4)
+ if (player.rg.repliGrass.gte(player.rg.repliGrassSoftcapStart))
+ {
+ multAdd = multAdd.div(player.rg.repliGrassSoftcapEffect)
+ }
+
+ if (player.rg.repliGrass.lte(1)) player.rg.repliGrassEffect = new Decimal(1)
+ if (player.rg.repliGrass.gt(1)) player.rg.repliGrassEffect = player.rg.repliGrass.pow(0.15)
+
+ if (player.rg.repliGrass.lte(1)) player.rg.repliGrassEffect2 = new Decimal(1)
+ if (player.rg.repliGrass.gt(1)) player.rg.repliGrassEffect2 = player.rg.repliGrass.pow(0.25)
+
+ player.rg.repliGrassReq = new Decimal(8)
+ player.rg.repliGrassReq = player.rg.repliGrassReq.div(buyableEffect("rg", 12))
+ },
+ unloadRepliGrass()
+ {
+ player.rg.grassTimer = new Decimal(0)
+ player.rg.grassCount = new Decimal(0)
+ },
+ loadRepliGrass()
+ {
+ removeAllRepliGrass();
+ createRepliGrass(player.rg.savedRepliGrass);
+ player.rg.repliGrassCount = player.rg.savedRepliGrass
+ },
+ clickables: {
+ 1: {
+ title() { return "Return" },
+ canClick() { return true },
+ unlocked() { return true },
+ onClick() {
+ player.tab = "cp"
+ },
+ style: { width: '100px', "min-height": '50px' },
+ },
+ 2: {
+ title() { return "Buy Max On" },
+ canClick() { return player.buyMax == false },
+ unlocked() { return true },
+ onClick() {
+ player.buyMax = true
+ },
+ style: { width: '75px', "min-height": '75px', }
+ },
+ 3: {
+ title() { return "Buy Max Off" },
+ canClick() { return player.buyMax == true },
+ unlocked() { return true },
+ onClick() {
+ player.buyMax = false
+ },
+ style: { width: '75px', "min-height": '75px', }
+ },
+ },
+ bars: {
+ },
+ upgrades: {
+ },
+ buyables: {
+ 11: {
+ cost(x) { return new Decimal(1.25).pow(x || getBuyableAmount(this.layer, this.id)).mul(1)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.001) },
+ unlocked() { return true },
+ canAfford() { return player.rg.repliGrass.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Grass Mult."
+ },
+ display() {
+ return "which are adding +" + format(tmp[this.layer].buyables[this.id].effect) + " to the repli-leaf multiplier.\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Grass."
+ },
+ buy() {
+ let base = new Decimal(1)
+ let growth = 1.25
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rg.repliGrass = player.rg.repliGrass.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.rg.repliGrass, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rg.repliGrass = player.rg.repliGrass.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 12: {
+ cost(x) { return new Decimal(5).pow(x || getBuyableAmount(this.layer, this.id)).mul(2)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.05).add(1) },
+ unlocked() { return true },
+ canAfford() { return player.rg.repliGrass.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Grass Grow Rate."
+ },
+ display() {
+ return "which are dividing the repli-grass grow time by /" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Grass."
+ },
+ buy() {
+ let base = new Decimal(2)
+ let growth = 5
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rg.repliGrass = player.rg.repliGrass.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+ let max = Decimal.affordGeometricSeries(player.rg.repliGrass, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rg.repliGrass = player.rg.repliGrass.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 13: {
+ cost(x) { return new Decimal(2).pow(x || getBuyableAmount(this.layer, this.id)).mul(4)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id) },
+ unlocked() { return true },
+ canAfford() { return player.rg.repliGrass.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Grass Capacity."
+ },
+ display() {
+ return "which are adding +" + format(tmp[this.layer].buyables[this.id].effect) + " to the repli-grass capacity.\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Grass."
+ },
+ buy() {
+ let base = new Decimal(4)
+ let growth = 2
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rg.repliGrass = player.rg.repliGrass.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+ let max = Decimal.affordGeometricSeries(player.rg.repliGrass, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rg.repliGrass = player.rg.repliGrass.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 14: {
+ cost(x) { return new Decimal(1.4).pow(x || getBuyableAmount(this.layer, this.id)).mul(8)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).pow(1.4).add(1) },
+ unlocked() { return true },
+ canAfford() { return player.rg.repliGrass.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Grass Softcap."
+ },
+ display() {
+ return "which are extending the repli-grass softcap by x" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Grass."
+ },
+ buy() {
+ let base = new Decimal(8)
+ let growth = 1.4
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rg.repliGrass = player.rg.repliGrass.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+ let max = Decimal.affordGeometricSeries(player.rg.repliGrass, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rg.repliGrass = player.rg.repliGrass.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ },
+ milestones: {
+
+ },
+ challenges: {
+ },
+ infoboxes: {
+ },
+ microtabs: {
+ stuff: {
+ "Main": {
+ buttonStyle() { return { 'color': 'white' } },
+ unlocked() { return true },
+ content:
+ [
+ ["raw-html", function () { return "" + formatWhole(player.rg.repliGrassCount) + "/" + formatWhole(player.rg.repliGrassCap) + " Repli-Grass (Hover over the grass)" }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ["raw-html", function () { return "" + format(player.rg.repliGrassTimer) + "/" + format(player.rg.repliGrassReq) + " Seconds to spawn repli-grass." }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ["raw-html", function () { return "Repli-Grass mult: x" + format(player.rg.repliGrassMult) + "." }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ["raw-html", function () { return "Repli-Grass boosts repli-leaf mult by x" + format(player.rg.repliGrassEffect) + "." }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ["raw-html", function () { return "Repli-Grass boosts replicanti point mult by x" + format(player.rg.repliGrassEffect2) + "." }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ["raw-html", function () { return player.rg.repliGrass.gte(player.rg.repliGrassSoftcapStart) ? "After " + formatWhole(player.rg.repliGrassSoftcapStart) + " repli-grass, repli-grass mult is divided by " + format(player.rg.repliGrassSoftcapEffect) + "." : "" }, { "color": "red", "font-size": "16px", "font-family": "monospace" }],
+ ["blank", "25px"],
+ ["raw-html", function () { return "
" }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ]
+ },
+ "Buyables": {
+ buttonStyle() { return { 'color': 'white' } },
+ unlocked() { return true },
+ content:
+ [
+ ["blank", "25px"],
+ ["row", [["buyable", 11], ["buyable", 12], ["buyable", 13], ["buyable", 14]]],
+ ]
+ },
+ },
+ },
+
+ tabFormat: [
+ ["raw-html", function () { return "You have " + format(player.rg.repliGrass) + "
repli-grass." }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ["row", [["clickable", 1]]],
+ ["microtabs", "stuff", { 'border-width': '0px' }],
+ ],
+ layerShown() { return player.startedGame == true && hasUpgrade("cp", 15) }
+})
+
+function createRepliGrass(quantity) {
+ const spawnArea = document.getElementById('repli-spawn-area');
+ const spawnAreaRect = spawnArea?.getBoundingClientRect();
+
+ if (!spawnAreaRect) return; // Exit if spawnAreaRect is null or undefined
+
+ for (let i = 0; i < quantity; i++) {
+ let randomX, randomY;
+ do {
+ randomX = Math.floor(Math.random() * (spawnAreaRect.width - 22.5)); // Adjusted for circle width
+ randomY = Math.floor(Math.random() * (spawnAreaRect.height - 22.5)); // Adjusted for circle height
+ } while (isCollision(randomX, randomY));
+
+ const repliCircle = document.createElement('div');
+ repliCircle.style.borderRadius = "100%";
+ repliCircle.style.width = '22.5px';
+ repliCircle.style.height = '22.5px';
+ repliCircle.style.backgroundColor = '#18e34e';
+ repliCircle.style.position = 'absolute';
+ repliCircle.style.left = `${randomX}px`;
+ repliCircle.style.top = `${randomY}px`;
+ repliCircle.style.border = '2px solid black'; // Add a black border
+ repliCircle.classList.add('repli-circle');
+
+ spawnArea.appendChild(repliCircle); // Append to spawnArea instead of document.body
+
+ // Add event listener to remove grass circle on hover
+ repliCircle.addEventListener('mouseover', () => {
+ removeRepliGrass(repliCircle);
+ player.rg.repliGrassCount--; // Decrease grass count
+ player.rg.savedRepliGrass--; // Decrease grass count
+ player.rg.repliGrass = player.rg.repliGrass.mul(player.rg.repliGrassMult)
+ });
+
+ player.rg.repliGrassCount++; // Increase grass count
+
+ // Start moving the repliCircle
+ moveRepliCircle(repliCircle, spawnAreaRect);
+ }
+}
+
+function isCollision(x, y) {
+ const existingRepliCircles = document.querySelectorAll('.repli-circle');
+ for (let i = 0; i < existingRepliCircles.length; i++) {
+ const squareRect = existingRepliCircles[i].getBoundingClientRect();
+ if (x >= squareRect.left && x <= squareRect.right && y >= squareRect.top && y <= squareRect.bottom) {
+ return true; // Collision detected
+ }
+ }
+ return false; // No collision detected
+}
+
+function moveRepliCircle(circle, spawnAreaRect) {
+ const moveInterval = 500; // Interval in milliseconds
+ const moveStep = 10; // Number of pixels to move each step
+ const gridSize = 150; // Size of each grid cell
+
+ function getRandomPositionInGrid() {
+ const numCols = Math.floor(spawnAreaRect.width / gridSize);
+ const numRows = Math.floor(spawnAreaRect.height / gridSize);
+ const col = Math.floor(Math.random() * numCols);
+ const row = Math.floor(Math.random() * numRows);
+ const x = col * gridSize + Math.random() * (gridSize - 22.5);
+ const y = row * gridSize + Math.random() * (gridSize - 22.5);
+ return { x, y };
+ }
+
+ let { x: targetX, y: targetY } = getRandomPositionInGrid();
+
+ setInterval(() => {
+ let currentX = parseFloat(circle.style.left);
+ let currentY = parseFloat(circle.style.top);
+
+ let dx = targetX - currentX;
+ let dy = targetY - currentY;
+
+ let distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > moveStep) {
+ dx = (dx / distance) * moveStep;
+ dy = (dy / distance) * moveStep;
+ } else {
+ dx = dx;
+ dy = dy;
+ }
+
+ currentX += dx;
+ currentY += dy;
+
+ // Ensure the circle stays within bounds
+ circle.style.left = `${Math.max(0, Math.min(spawnAreaRect.width - 22.5, currentX))}px`;
+ circle.style.top = `${Math.max(0, Math.min(spawnAreaRect.height - 22.5, currentY))}px`;
+
+ // Set a new target position after reaching the current target
+ if (Math.abs(targetX - currentX) < moveStep && Math.abs(targetY - currentY) < moveStep) {
+ ({ x: targetX, y: targetY } = getRandomPositionInGrid());
+ }
+ }, moveInterval);
+}
+
+
+function removeRepliGrass(circle) {
+ circle.parentNode.removeChild(circle);
+}
+
+function removeAllRepliGrass() {
+ const circles = document.querySelectorAll('.repli-circle');
+ circles.forEach(circle => circle.parentNode.removeChild(circle));
+}
+
+window.addEventListener('load', function() {
+ // This function will be executed after the page is reloaded
+ // You can perform any necessary tasks here
+ layers.rg.loadRepliGrass();
+});
\ No newline at end of file
diff --git a/js/Cantepocalypse/repliTrees.js b/js/Cantepocalypse/repliTrees.js
new file mode 100644
index 0000000..57b4c5b
--- /dev/null
+++ b/js/Cantepocalypse/repliTrees.js
@@ -0,0 +1,436 @@
+addLayer("rt", {
+ name: "Repli-Trees", // This is optional, only used in a few places, If absent it just uses the layer id.
+ symbol: "RT", // This appears on the layer's node. Default is the id with the first letter capitalized
+ row: 1,
+ position: 0, // Horizontal position within a row. By default it uses the layer id and sorts in alphabetical order
+ startData() { return {
+ unlocked: true,
+
+ repliTrees: new Decimal(0),
+ repliTreesEffect: new Decimal(1),
+ repliTreeReq: new Decimal(10),
+ repliTreesToGet: new Decimal(1),
+
+ repliTreeSoftcapEffect: new Decimal(1),
+ repliTreeSoftcapStart: new Decimal(10),
+
+ repliLeaves: new Decimal(1),
+ repliLeavesMult: new Decimal(1),
+ repliLeavesTimer: new Decimal(0),
+ repliLeavesTimerReq: new Decimal(6),
+ }
+ },
+ automate() {
+ },
+ nodeStyle() {
+ },
+ tooltip: "Repli-Trees",
+ branches: ["ar"],
+ color: "#1cffac",
+ update(delta) {
+ let onepersec = new Decimal(1)
+
+ multAdd = new Decimal(0)
+ multAdd = buyableEffect("rt", 11)
+ multAdd = multAdd.mul(player.ar.repliGrassEffect2)
+
+ player.rt.repliLeavesTimerReq = new Decimal(6)
+ if (hasUpgrade("an", 21)) player.rt.repliLeavesTimerReq = player.rt.repliLeavesTimerReq.sub(1.5)
+ player.rt.repliLeavesTimerReq = player.rt.repliLeavesTimerReq.div(buyableEffect("rt", 12))
+
+ player.rt.repliTreesSoftcapStart = new Decimal(10)
+ player.rt.repliTreesSoftcapStart = player.rt.repliTreesSoftcapStart.mul(buyableEffect("rt", 18))
+
+ player.rt.repliTreeSoftcapEffect = player.rt.repliTrees.sub(player.rt.repliTreeSoftcapStart).pow(1.25).div(10).add(1)
+ if (player.rt.repliTrees.gte(player.rt.repliTreeSoftcapStart))
+ {
+ multAdd = multAdd.div(player.rt.repliTreeSoftcapEffect)
+ }
+
+ player.rt.repliLeavesMult = multAdd.add(1)
+
+ player.rt.repliLeavesTimer = player.rt.repliLeavesTimer.add(onepersec.mul(delta))
+
+ player.rt.repliTreesEffect = player.rt.repliTrees.pow(0.7).add(1)
+
+ player.rt.repliTreeReq = player.rt.repliTrees.mul(0.5).add(1).pow(1.2).mul(10)
+ player.rt.repliTreeReq = player.rt.repliTreeReq.div(buyableEffect("rt", 13))
+
+ player.rt.repliTreesToGet = new Decimal(1)
+ player.rt.repliTreesToGet = player.rt.repliTreesToGet.mul(buyableEffect("rt", 14))
+
+ if (player.rt.repliLeavesTimer.gte(player.rt.repliLeavesTimerReq))
+ {
+ layers.rt.repliLeavesMultiply();
+ player.rt.repliLeavesTimer = new Decimal(0)
+ }
+
+ if (player.rt.repliLeaves.gte(player.rt.repliTreeReq)) {
+ player.rt.repliTrees = player.rt.repliTrees.add(player.rt.repliTreesToGet)
+ player.rt.repliLeaves = new Decimal(1)
+ }
+ },
+ repliLeavesMultiply()
+ {
+ player.rt.repliLeaves = player.rt.repliLeaves.mul(player.rt.repliLeavesMult)
+ },
+ clickables: {
+ 1: {
+ title() { return "Return" },
+ canClick() { return true },
+ unlocked() { return true },
+ onClick() {
+ player.tab = "cp"
+ },
+ style: { width: '100px', "min-height": '50px' },
+ },
+ 2: {
+ title() { return "Buy Max On" },
+ canClick() { return player.buyMax == false },
+ unlocked() { return true },
+ onClick() {
+ player.buyMax = true
+ },
+ style: { width: '75px', "min-height": '75px', }
+ },
+ 3: {
+ title() { return "Buy Max Off" },
+ canClick() { return player.buyMax == true },
+ unlocked() { return true },
+ onClick() {
+ player.buyMax = false
+ },
+ style: { width: '75px', "min-height": '75px', }
+ },
+ },
+ bars: {
+ repliTreeBar: {
+ unlocked() { return true },
+ direction: RIGHT,
+ width: 476,
+ height: 50,
+ progress() {
+ return player.rt.repliLeaves.div(player.rt.repliTreeReq)
+ },
+ fillStyle: {
+ "background-color": "#7734eb",
+ },
+ display() {
+ return "" + format(player.rt.repliLeaves) + "/" + format(player.rt.repliTreeReq) + " Repli-Leaves to gain a Repli-Tree.";
+ },
+ },
+ replileafBar: {
+ unlocked() { return true },
+ direction: RIGHT,
+ width: 476,
+ height: 50,
+ progress() {
+ return player.rt.repliLeavesTimer.div(player.rt.repliLeavesTimerReq)
+ },
+ fillStyle: {
+ "background-color": "#7734eb",
+ },
+ display() {
+ return "Time: " + formatTime(player.rt.repliLeavesTimer) + "/" + formatTime(player.rt.repliLeavesTimerReq);
+ },
+ },
+ },
+ upgrades: {
+ },
+ buyables: {
+ 11: {
+ cost(x) { return new Decimal(1.2).pow(x || getBuyableAmount(this.layer, this.id)).mul(10000)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).pow(0.3).mul(0.2) },
+ unlocked() { return true },
+ canAfford() { return player.an.anonymity.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Leaf Mult."
+ },
+ display() {
+ return "which are adding +" + format(tmp[this.layer].buyables[this.id].effect) + " to the repli-leaf multiplier.\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Anonymity."
+ },
+ buy() {
+ let base = new Decimal(10000)
+ let growth = 1.2
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.an.anonymity = player.an.anonymity.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.an.anonymity, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.an.anonymity = player.an.anonymity.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 12: {
+ cost(x) { return new Decimal(3).pow(x || getBuyableAmount(this.layer, this.id)).mul(20000)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.05).add(1)},
+ unlocked() { return true },
+ canAfford() { return player.an.anonymity.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Leaf Cooldown."
+ },
+ display() {
+ return "which are dividing the repli-leaf cooldown by /" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Anonymity."
+ },
+ buy() {
+ let base = new Decimal(20000)
+ let growth = 3
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.an.anonymity = player.an.anonymity.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.an.anonymity, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.an.anonymity = player.an.anonymity.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 13: {
+ cost(x) { return new Decimal(1.4).pow(x || getBuyableAmount(this.layer, this.id)).mul(40000)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.5).pow(1.5).add(1)},
+ unlocked() { return true },
+ canAfford() { return player.an.anonymity.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Tree Req."
+ },
+ display() {
+ return "which are dividing the repli-tree req by /" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Anonymity."
+ },
+ buy() {
+ let base = new Decimal(40000)
+ let growth = 1.4
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.an.anonymity = player.an.anonymity.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.an.anonymity, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.an.anonymity = player.an.anonymity.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 14: {
+ cost(x) { return new Decimal(1.5).pow(x || getBuyableAmount(this.layer, this.id)).mul(70000)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.2).add(1)},
+ unlocked() { return true },
+ canAfford() { return player.an.anonymity.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Repli-Trees."
+ },
+ display() {
+ return "which are boosting repli-tree gain by x" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Anonymity."
+ },
+ buy() {
+ let base = new Decimal(70000)
+ let growth = 1.5
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.an.anonymity = player.an.anonymity.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.an.anonymity, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.an.anonymity = player.an.anonymity.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 15: {
+ cost(x) { return new Decimal(1.25).pow(x || getBuyableAmount(this.layer, this.id)).mul(4)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.15).add(1)},
+ unlocked() { return true },
+ canAfford() { return player.rt.repliTrees.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Replicanti Point Booster."
+ },
+ display() {
+ return "which are boosting replicanti point mult by x" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Trees."
+ },
+ buy() {
+ let base = new Decimal(4)
+ let growth = 1.25
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rt.repliTrees = player.rt.repliTrees.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.rt.repliTrees, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rt.repliTrees = player.rt.repliTrees.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 16: {
+ cost(x) { return new Decimal(1.4).pow(x || getBuyableAmount(this.layer, this.id)).mul(6)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.25).pow(0.6).add(1)},
+ unlocked() { return true },
+ canAfford() { return player.rt.repliTrees.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Perk Point Booster."
+ },
+ display() {
+ return "which are boosting perk points by x" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Trees."
+ },
+ buy() {
+ let base = new Decimal(6)
+ let growth = 1.4
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rt.repliTrees = player.rt.repliTrees.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.rt.repliTrees, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rt.repliTrees = player.rt.repliTrees.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 17: {
+ cost(x) { return new Decimal(1.2).pow(x || getBuyableAmount(this.layer, this.id)).mul(8)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(100).pow(2.5).add(1)},
+ unlocked() { return true },
+ canAfford() { return player.rt.repliTrees.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Replicanti Softcap Extender."
+ },
+ display() {
+ return "which are extending the second replicanti point softcap start by x" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Trees."
+ },
+ buy() {
+ let base = new Decimal(8)
+ let growth = 1.2
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rt.repliTrees = player.rt.repliTrees.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.rt.repliTrees, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rt.repliTrees = player.rt.repliTrees.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ 18: {
+ cost(x) { return new Decimal(1.3).pow(x || getBuyableAmount(this.layer, this.id)).mul(10)},
+ effect(x) { return new getBuyableAmount(this.layer, this.id).mul(0.5).pow(0.75).add(1)},
+ unlocked() { return true },
+ canAfford() { return player.rt.repliTrees.gte(this.cost()) },
+ title() {
+ return format(getBuyableAmount(this.layer, this.id), 0) + "
Tree Softcap Extender."
+ },
+ display() {
+ return "which are extending repli-tree softcap start by x" + format(tmp[this.layer].buyables[this.id].effect) + ".\n\
+ Cost: " + format(tmp[this.layer].buyables[this.id].cost) + " Repli-Trees."
+ },
+ buy() {
+ let base = new Decimal(10)
+ let growth = 1.3
+ if (player.buyMax == false)
+ {
+ let buyonecost = new Decimal(growth).pow(getBuyableAmount(this.layer, this.id)).mul(base)
+ player.rt.repliTrees = player.rt.repliTrees.sub(buyonecost)
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(1))
+ } else
+ {
+
+ let max = Decimal.affordGeometricSeries(player.rt.repliTrees, base, growth, getBuyableAmount(this.layer, this.id))
+ let cost = Decimal.sumGeometricSeries(max, base, growth, getBuyableAmount(this.layer, this.id)).floor()
+ player.rt.repliTrees = player.rt.repliTrees.sub(cost)
+
+ setBuyableAmount(this.layer, this.id, getBuyableAmount(this.layer, this.id).add(max))
+ }
+ },
+ style: { width: '275px', height: '150px', }
+ },
+ },
+ milestones: {
+
+ },
+ challenges: {
+ },
+ infoboxes: {
+ },
+ microtabs: {
+ stuff: {
+ "Main": {
+ buttonStyle() { return { 'color': 'white' } },
+ unlocked() { return true },
+ content:
+ [
+ ["blank", "25px"],
+ ["row", [["clickable", 2], ["clickable", 3]]],
+ ["blank", "25px"],
+ ["raw-html", function () { return "You have " + formatWhole(player.rt.repliTrees) + " repli-trees, which boost anonymity gain by x" + format(player.rt.repliTreesEffect) + "."}],
+ ["raw-html", function () { return "You will gain " + format(player.rt.repliTreesToGet, 1) + " repli-trees." }],
+ ["raw-html", function () { return "Repli-Leaves mult: x" + format(player.rt.repliLeavesMult, 4) + "." }],
+ ["raw-html", function () { return player.rt.repliTrees.gte(player.rt.repliTreesSoftcapStart) ? "After " + formatWhole(player.rt.repliTreeSoftcapStart) + " repli-trees, repli-leaf mult is divided by " + format(player.rt.repliTreeSoftcapEffect) + " (Based on repli-trees)" : "" }, { "color": "red", "font-size": "16px", "font-family": "monospace" }],
+ ["blank", "25px"],
+ ["row", [["bar", "repliTreeBar"]]],
+ ["row", [["bar", "replileafBar"]]],
+ ["blank", "25px"],
+ ["row", [["buyable", 11], ["buyable", 12], ["buyable", 13], ["buyable", 14]]],
+ ["row", [["buyable", 15], ["buyable", 16], ["buyable", 17], ["buyable", 18]]],
+ ]
+ },
+ },
+ },
+
+ tabFormat: [
+ ["raw-html", function () { return "You have " + format(player.an.anonymity) + "
anonymity." }, { "color": "white", "font-size": "24px", "font-family": "monospace" }],
+ ["row", [["clickable", 1]]],
+ ["microtabs", "stuff", { 'border-width': '0px' }],
+ ],
+ layerShown() { return player.startedGame == true && hasUpgrade("cp", 15) }
+})
\ No newline at end of file
diff --git a/js/cante.js b/js/cante.js
index 6ee10d4..ab063a4 100644
--- a/js/cante.js
+++ b/js/cante.js
@@ -199,6 +199,21 @@
return "" + format(player.ca.canteEnergy) + "/" + formatWhole(player.ca.canteEnergyReq) + " Cante energy to gain a cante core.
";
},
},
+ replicantiBar: {
+ unlocked() { return true },
+ direction: RIGHT,
+ width: 476,
+ height: 50,
+ progress() {
+ return player.ca.replicantiTimer.div(player.ca.replicantiTimerReq)
+ },
+ fillStyle: {
+ "background-color": "#193ceb",
+ },
+ display() {
+ return "Time: " + formatTime(player.ca.replicantiTimer) + "/" + formatTime(player.ca.replicantiTimerReq);
+ },
+ },
},
upgrades: {
},
@@ -656,7 +671,7 @@
["raw-html", function () { return "which boosts infinity points by " + format(player.ca.replicantiEffect) + "
x, infinity dimensions by " + format(player.ca.replicantiEffect2) + "
x, and points by " + format(player.ca.replicantiEffect3) + "
x." }, { "color": "white", "font-size": "20px", "font-family": "monospace" }],
["raw-html", function () { return "(Caps out at 1.79e308 replicanti)" }, { "color": "white", "font-size": "16px", "font-family": "monospace" }],
["blank", "25px"],
- ["raw-html", function () { return "Time: " + formatTime(player.ca.replicantiTimer) + "/" + formatTime(player.ca.replicantiTimerReq) }, { "color": "white", "font-size": "22px", "font-family": "monospace" }],
+ ["row", [["bar", "replicantiBar"]]],
["raw-html", function () { return "Replicanti Mult: " + format(player.ca.replicantiMult) + "x" }, { "color": "white", "font-size": "22px", "font-family": "monospace" }],
["raw-html", function () { return "Replicate Chance: " + format(player.ca.replicateChance.mul(100)) + "%" }, { "color": "white", "font-size": "22px", "font-family": "monospace" }],
["blank", "25px"],
diff --git a/js/cutscene.js b/js/cutscene.js
index 41eb305..2a0db49 100644
--- a/js/cutscene.js
+++ b/js/cutscene.js
@@ -72,7 +72,7 @@
player.tab == "h" && player.subtabs["h"]['stuff'] == 'RAGE POWER' ? "#341414" :
player.tab == "ca" ? "#2a3e66" :
player.tab == "cap" ? "#1f1e33" :
- player.tab == "cp" || player.tab == "ar" || player.tab == "pr" || player.tab == "an" ? "#204387" :
+ player.tab == "cp" || player.tab == "ar" || player.tab == "pr" || player.tab == "an" || player.tab == "rt" || player.tab == "rg" ? "#204387" :
player.tab == "ev4" ? "linear-gradient(-90deg, #f38004, #fc3404)" :
player.tab == "rm" ? "linear-gradient(90deg, #311100, #313000, #163100, #003105, #003121, #002C31, #001431, #000031, #300031)" :
"#161616");
diff --git a/js/mod.js b/js/mod.js
index 41466a6..26d6ea4 100644
--- a/js/mod.js
+++ b/js/mod.js
@@ -7,7 +7,7 @@
"grasshop.js", "mods.js", "checkback.js", "portal.js", "dice.js", "petShop.js", "evolution.js", "rocketFuel.js", "infinity.js",
"antimatterDimensions.js", "infinityPoints.js", "galaxy.js", "pests.js", "hex.js", "debuff.js", "tav.js", "tavDomain.js", "breakInfinity.js",
"lore.js", "otfMastery.js", "infinityDimensions.js", "cante.js", "realmMods.js", "cantepocalypsePuzzle.js", "Cantepocalypse/cantepocalypse.js",
- "Cantepocalypse/altRanks.js", "Cantepocalypse/perks.js", "Cantepocalypse/anonymity.js"],
+ "Cantepocalypse/altRanks.js", "Cantepocalypse/perks.js", "Cantepocalypse/anonymity.js", "Cantepocalypse/repliTrees.js", "Cantepocalypse/repliGrass.js"],
discordName: "",
discordLink: "",
@@ -36,7 +36,7 @@ var doNotCallTheseFunctionsEveryTick = ["blowUpEverything", "startCutscene1","st
"petButton4", "hexReset", "hexPointReset", "automationTierReset", "startCutscene9", "startCutscene10", "startCutscene11","crunch", "startCutscene12", "startCutscene13", "antidebuffReset", "startCutscene14",
"negativeInfinityReset", "reverseCrunch", "startCutscene15", "startCutscene16", "startCutscene17", "startCutscene18", "breakInfinities", "domainReset", "gainAutomationShard",
"sacrificeCommonPet", "sacrificeAllCommonPet", "sacrificeUncommonPet", "sacrificeAllUncommonPet", "sacrificeRarePet", "sacrificeAllRarePet", "steelieReset", "crystalReset", "replicantiMultiply",
-"gainCanteCore", "ragePowerReset", "blankModReset", "replicantiPointMultiply" ]
+"gainCanteCore", "ragePowerReset", "blankModReset", "replicantiPointMultiply", "repliLeavesMultiply", "loadRepliGrass", "unloadRepliGrass", ]
function getStartPoints(){
return new Decimal(modInfo.initialStartPoints)