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)