From e3c4422d3344bbb8af6b4064a64bdf97561218ff Mon Sep 17 00:00:00 2001 From: qq1010903229 <1010903229@qq.com> Date: Tue, 12 Dec 2023 02:34:45 +0800 Subject: [PATCH 1/4] collapse --- js/data/buttons.js | 94 +++++++++++++++++++++++++++++++++++++++---- js/data/milestones.js | 14 ++++++- js/data/sigils.js | 2 +- js/save.js | 2 + js/tabs/buttons.js | 8 ++-- js/tabs/milestones.js | 4 +- js/tabs/sigils.js | 3 +- 7 files changed, 111 insertions(+), 16 deletions(-) diff --git a/js/data/buttons.js b/js/data/buttons.js index 34e18d2..dcfc2b3 100644 --- a/js/data/buttons.js +++ b/js/data/buttons.js @@ -24,7 +24,7 @@ let tierColors = [ "#aaa", "#c4c", "#f94", - "#777", + "#777", "#a7c", ] @@ -209,7 +209,9 @@ function getButtonGain(row, tier) { return D.pow(base, D.pow(1.05, tier).sub(1).mul(20)).mul(mult); } function getRowMulti(row, index) { - index ??= game.ladder.findIndex(x => D.eq(x.tier, row)); + index ??= game.ladder.findIndex(x => D.eq(x.tier, row)); + if(index < 0)return D.add(getRowAmount(D.add(row, 1)), 1) + if(index == 0)return D.add(getRowAmount(D.add(row, 1)), 1).mul(temp.milestoneMultis[index] ?? 1).mul(temp.sigilEffects[index] ?? 1).mul(getCollapseMult()); return D.add(getRowAmount(D.add(row, 1)), 1).mul(temp.milestoneMultis[index] ?? 1).mul(temp.sigilEffects[index] ?? 1); } function getButtonCost(row, tier) { @@ -238,6 +240,20 @@ function clickButton(row, tier, auto = false) { game.tokens = D.add(row, 1).pow(temp.tokenUpgEffects.tokens.normalTierFactor).mul(getTokenMulti()).add(game.tokens); if (!auto) game.stats.presses++; } + } else if (index == 1 && D(row).gte(2)) { + let cost = getMultiReqForCollapse(row, getButtonCost(row, tier)); + let prevData = game.ladder[index - 1]; + if (D.gte(prevData.amount, cost)) { + game.money = 0; + for (let a = 0; a < index; a++) game.ladder[a].amount = game.ladder[a].level = D(0); + data.amount = getButtonGain(row, tier).mul(getRowMulti(row)).add(data.amount); + data.level = D(0); + data.presses = D.add(data.presses, 1); + if (!auto && game.unlocks.tok1 && Math.random() * 100 <= temp.tokenUpgEffects.tokens.normalChance) + game.tokens = D.add(row, 1).pow(temp.tokenUpgEffects.tokens.normalTierFactor).mul(getTokenMulti()).add(game.tokens); + if (!auto) game.stats.presses++; + if (game.unlocks.btn5) makeRow(row); + } } else { let prevData = game.ladder[index - 1]; if (D.gte(prevData.amount, cost)) { @@ -264,7 +280,27 @@ function makeRow(row) { presses: D(0), }; game.ladder.push(highest); - } + } + if(D.lte(highest.tier, row) && game.ladder.length == 10 && game.unlocks.col1){ + game.collapsed = game.collapsed.add(1); + for(let i = 2;i < 10; i++){ + game.ladder[i-1]=game.ladder[i]; + } + highest = { + tier: D.add(highest.tier, 1), + amount: D(0), + level: D(0), + presses: D(0), + }; + game.ladder[9]=highest; + updateRuneStats(); + updateMilestoneStats(); + updateAllChargerUpgEffects(); + updateAutomationStats(); + updateTokenStats(); + updateSigilEffects(); + allDirty = true; + } } function updateVisibleUnlocks() { @@ -291,8 +327,8 @@ function checkEndgame() { desc.innerHTML = ` You've purchased all the available unlocks currently in the game!
However, it is not the end of the journey...
- Collapse is not implemented yet, make sure to stay tuned for future game updates!
-
+ Collapse is just implemented by loader3229, make sure to stay tuned for future game updates!
+ To collapse the first reset layer, you need to reset Hyperity once after unlocking collapse.
Time played: ${format.time(game.stats.timePlayed)}
` showOverlay("popup", "Congratulations!", desc, ["Ok"]); @@ -320,7 +356,8 @@ function doResetAuto(times) { whileloop: while (D.gt(times, 0)) { for (let a = (game.automators.reset?.depth ?? 1); a >= 1; a--) { let row = game.ladder[a]; - let pos = getHighestButton(row.tier, game.ladder[a - 1].amount); + let pos = getHighestButton(row.tier, game.ladder[a - 1].amount); + if(a == 1 && D(row.tier) >= 2)pos = getHighestButton1(row.tier, game.ladder[a - 1].amount); if (D.lt(pos, 0)) continue; let gain = getButtonGain(row.tier, pos).mul(getRowMulti(row.tier)); if (D.div(gain, row.amount).gt(game.automators.reset?.factor ?? 0)) { @@ -332,4 +369,47 @@ function doResetAuto(times) { } break; } -} +} + +function getHighestButtonForCollapse(row, amount){ + let base = D.eq(row, 0) ? 5 : D.eq(row, 1) ? 1e5 : D.pow(2, row).mul(250); + return D.div(D(amount).max(0), base).add(1).logBase(D.add(row, 1).mul(10)).div(10).add(1).logBase(1.1); +} + +function getMultiReqForCollapse(row, amount){ + amount = amount.div(getRowMulti(row)).div(temp.sigilEffects[0]); + let tier = getButtonTierForCollapse(row, amount); + if(D(row).gte(2))return getMultiReqForCollapse(D(row).sub(1), getButtonCostForCollapse(row, tier)); + return getButtonCostForCollapse(row, tier); +} + +function getButtonTierForCollapse(row, amount) { + let base = D.eq(row, 0) ? 8 : 4; + let mult = D.eq(row, 0) ? 1 : D.add(row, 1); + return amount.div(mult).logBase(base).div(20).max(-1).add(1).logBase(1.05); +} + +function getButtonCostForCollapse(row, tier) { + let base = D.eq(row, 0) ? 5 : D.eq(row, 1) ? 1e5 : D.pow(2, row).mul(250); + return D.add(row, 1).mul(10).pow(D.pow(1.1, tier).sub(1).mul(10)).mul(base); +} + +function getCollapseMult() { + let m = game.ladder[0].amount, mult = D(1); + if(game.collapsed.gte(1)){ + for(let i = 1;i <= game.collapsed.toNumber();i++){ + m = getButtonGain(i, getHighestButtonForCollapse(i, m)).mul(getRowMulti(i)).mul(temp.sigilEffects[0]); + mult = mult.mul(m); + } + } + return mult; +} + +function getHighestButton1(row, amount){ + let a = -1; + while(true){ + if(getMultiReqForCollapse(row, getButtonCostForCollapse(row, a)).gte(amount))break; + a++; + } + return D(a-1); +} \ No newline at end of file diff --git a/js/data/milestones.js b/js/data/milestones.js index 7220116..ab4d0f9 100644 --- a/js/data/milestones.js +++ b/js/data/milestones.js @@ -23,10 +23,19 @@ let milestones = { goalAmount: (x) => D.add(x, 1).mul(D.add(x, 15)), goalText: ["Complete", "milestones for"], goalPrecision: 0, - rewardAmount: (x, row) => D.mul(0.5, x).add(2), + rewardAmount: (x, row) => D.mul(D.pow(2,(D(game.milestones.collapse||0)).sub(1)), x).add(2), rewardText: ["×{0}", "all above milestones' effect"], rewardPrecision: 1, }, + collapse: { + goalTarget: (row) => game.collapsed, + goalAmount: (x) => D.add(x, 1), + goalText: ["Collapse", "layers for"], + goalPrecision: 0, + rewardAmount: (x, row) => D.pow(2, x), + rewardText: ["×{0}", "above milestones' effect(Resets previous milestone)"], + rewardPrecision: 0, + }, }, rows: { presses: { @@ -55,7 +64,8 @@ function clickGlobalMilestone(id) { let level = game.milestones[id] ?? 0; if (D.gte(data.goalTarget(), data.goalAmount(level))) { game.milestones[id] = D.add(level, 1); - updateMilestoneStats(); + if(id=="collapse")delete game.milestones.meta; + updateMilestoneStats(); } } diff --git a/js/data/sigils.js b/js/data/sigils.js index 861b1bd..ed6b42f 100644 --- a/js/data/sigils.js +++ b/js/data/sigils.js @@ -10,7 +10,7 @@ function forgeSigil(cooldown = 200, amount = 1) { if (D.gte(game.scraps, cost) && time - sigilTime >= cooldown) { let bulk = D.div(game.scraps, cost).floor().min(amount); game.scraps = D.sub(game.scraps, D.mul(cost, bulk)); - let rarity = Math.min(Math.floor(Math.log(1 / (1 - Math.random()))), 10); + let rarity = Math.min(Math.floor(Math.log(1 / (1 - Math.random()))), 9); while (game.sigils.length <= rarity) game.sigils.push(D(0)); game.sigils[rarity] = D.add(game.sigils[rarity], bulk); game.stats.sigilForged++; diff --git a/js/save.js b/js/save.js index 33af4ca..b7d1fca 100644 --- a/js/save.js +++ b/js/save.js @@ -27,6 +27,8 @@ function getStartGame() { sigils: [], + collapsed: D(0), + options: { tickRate: 10, diff --git a/js/tabs/buttons.js b/js/tabs/buttons.js index e4e0469..f0b7776 100644 --- a/js/tabs/buttons.js +++ b/js/tabs/buttons.js @@ -68,8 +68,8 @@ tabs.buttons = { for (let a = 0; a < game.ladder.length; a++) { let data = game.ladder[a]; let row = this.data.rows[a]; - let name = D.lt(data.tier, tierNames.length) ? tierNames[D(data.tier).toNumber()] : "p"; - row.style.setProperty("--background", D.lt(data.tier, tierColors.length) ? tierColors[D(data.tier).toNumber()] : "#f45"); + let name = D.lt(data.tier, tierNames.length) ? tierNames[D(data.tier).toNumber()] : "Reset "+D(data.tier).toNumber(); + row.style.setProperty("--background", tierColors[D(data.tier).toNumber()%tierColors.length]); row.amount.textContent = format(data.amount); row.name.textContent = name; @@ -96,7 +96,8 @@ tabs.buttons = { button.cost = cost; } - if (game.unlocks.btn5) data.level = getHighestButton(a, a == 0 ? game.money : game.ladder[a - 1].amount).max(data.level); + if (game.unlocks.btn5 && !(a == 1 && D(data.tier) >= 2)) data.level = getHighestButton(data.tier, a == 0 ? game.money : game.ladder[a - 1].amount).max(data.level); + if (game.unlocks.btn5 && a == 1 && D(data.tier) >= 2) data.level = getHighestButton1(data.tier, a == 0 ? game.money : game.ladder[a - 1].amount).max(data.level); let offset = D.sub(data.level, 6).max(0); let multi = getRowMulti(data.tier); let needsUpdate = allDirty || D.neq(multi, row.multi) || D.neq(row.items[0]?.tier ?? -1, offset); @@ -107,6 +108,7 @@ tabs.buttons = { let button = row.items[b]; button.tier = D.add(offset, b); let cost = getButtonCost(data.tier, button.tier); + if (a == 1 && D(data.tier) >= 2)cost = getMultiReqForCollapse(data.tier, getButtonCost(data.tier, button.tier)); if (needsUpdate) { button.gain.textContent = "+" + format(getButtonGain(data.tier, button.tier).mul(row.multi)) + " " + name; button.cost.textContent = (a == 0 ? "−" : "≥") + format(cost) + " " + prevName; diff --git a/js/tabs/milestones.js b/js/tabs/milestones.js index ec8c000..e777e32 100644 --- a/js/tabs/milestones.js +++ b/js/tabs/milestones.js @@ -93,8 +93,8 @@ tabs.milestones = { for (let a = 0; a < game.ladder.length; a++) { let data = game.ladder[a]; let row = this.data.rows[a]; - let name = D.lt(data.tier, tierNames.length) ? tierNames[D(data.tier).toNumber()] : "p"; - row.style.setProperty("--background", D.lt(data.tier, tierColors.length) ? tierColors[D(data.tier).toNumber()] : "#f45"); + let name = D.lt(data.tier, tierNames.length) ? tierNames[D(data.tier).toNumber()] : "Reset "+D(data.tier).toNumber(); + row.style.setProperty("--background", tierColors[D(data.tier).toNumber()%tierColors.length]); row.amount.textContent = format(data.amount); row.name.textContent = name; diff --git a/js/tabs/sigils.js b/js/tabs/sigils.js index 4388a3f..c4010d0 100644 --- a/js/tabs/sigils.js +++ b/js/tabs/sigils.js @@ -95,8 +95,9 @@ tabs.sigils = { for (let b = 0; b < game.sigils.length; b++) { let ctn = this.data.details.items[b]; let tier = game.ladder[b].tier; - let name = D.lt(tier, tierNames.length) ? tierNames[D(tier).toNumber()] : "p"; + let name = D.lt(tier, tierNames.length) ? tierNames[D(tier).toNumber()] : "Reset "+D(tier).toNumber(); ctn.textContent = "×" + format(temp.sigilEffects[b], 2) + " all " + name + " gains"; + if(b == 0 && game.unlocks.col1)ctn.textContent = "×" + format(temp.sigilEffects[b], 2) + " all " + name + "/Collapsed Layer gains"; } }, onEnd() { From 77f8f03c14edef8de022789bab9141d042829663 Mon Sep 17 00:00:00 2001 From: qq1010903229 <1010903229@qq.com> Date: Tue, 12 Dec 2023 09:42:59 +0800 Subject: [PATCH 2/4] commit --- js/data/buttons.js | 20 +++++++++++++++----- js/tabs/buttons.js | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/js/data/buttons.js b/js/data/buttons.js index dcfc2b3..0aba78f 100644 --- a/js/data/buttons.js +++ b/js/data/buttons.js @@ -195,6 +195,13 @@ let unlocks = { condition: () => D.gte(temp.skillLevel,200), conDisplay: () => "Skill level ≥" + format(200) + "", execute: () => { updateTabVisibility(); }, + }, + "col2": { + requires: ["col1"], + desc: () => "Improve Collapse", + condition: () => D.gte(game.money, D('1e600')), + conDisplay: () => "−" + format('1e600') + " Money", + execute: () => { game.money = D.sub(game.money, '1e600'); }, }, } let visibleUnlocks = []; @@ -241,7 +248,7 @@ function clickButton(row, tier, auto = false) { if (!auto) game.stats.presses++; } } else if (index == 1 && D(row).gte(2)) { - let cost = getMultiReqForCollapse(row, getButtonCost(row, tier)); + cost = getMultiReqForCollapse(row, getButtonCost(row, tier), cost); let prevData = game.ladder[index - 1]; if (D.gte(prevData.amount, cost)) { game.money = 0; @@ -282,6 +289,7 @@ function makeRow(row) { game.ladder.push(highest); } if(D.lte(highest.tier, row) && game.ladder.length == 10 && game.unlocks.col1){ + if(game.collapsed.gte(5) && !game.unlocks.col2)return; game.collapsed = game.collapsed.add(1); for(let i = 2;i < 10; i++){ game.ladder[i-1]=game.ladder[i]; @@ -376,11 +384,12 @@ function getHighestButtonForCollapse(row, amount){ return D.div(D(amount).max(0), base).add(1).logBase(D.add(row, 1).mul(10)).div(10).add(1).logBase(1.1); } -function getMultiReqForCollapse(row, amount){ +function getMultiReqForCollapse(row, amount, orig){ + if(game.unlocks.col2)return orig; amount = amount.div(getRowMulti(row)).div(temp.sigilEffects[0]); let tier = getButtonTierForCollapse(row, amount); - if(D(row).gte(2))return getMultiReqForCollapse(D(row).sub(1), getButtonCostForCollapse(row, tier)); - return getButtonCostForCollapse(row, tier); + if(D(row).gte(2))return getMultiReqForCollapse(D(row).sub(1), getButtonCostForCollapse(row, tier), orig); + return getButtonCostForCollapse(row, tier).max(orig); } function getButtonTierForCollapse(row, amount) { @@ -406,9 +415,10 @@ function getCollapseMult() { } function getHighestButton1(row, amount){ + if(game.unlocks.col2)return getHighestButton(row, amount); let a = -1; while(true){ - if(getMultiReqForCollapse(row, getButtonCostForCollapse(row, a)).gte(amount))break; + if(getMultiReqForCollapse(row, getButtonCost(row, a), getButtonCost(row, a)).gte(amount))break; a++; } return D(a-1); diff --git a/js/tabs/buttons.js b/js/tabs/buttons.js index f0b7776..a01ea46 100644 --- a/js/tabs/buttons.js +++ b/js/tabs/buttons.js @@ -108,7 +108,7 @@ tabs.buttons = { let button = row.items[b]; button.tier = D.add(offset, b); let cost = getButtonCost(data.tier, button.tier); - if (a == 1 && D(data.tier) >= 2)cost = getMultiReqForCollapse(data.tier, getButtonCost(data.tier, button.tier)); + if (a == 1 && D(data.tier) >= 2)cost = getMultiReqForCollapse(data.tier, getButtonCost(data.tier, button.tier), getButtonCost(data.tier, button.tier)); if (needsUpdate) { button.gain.textContent = "+" + format(getButtonGain(data.tier, button.tier).mul(row.multi)) + " " + name; button.cost.textContent = (a == 0 ? "−" : "≥") + format(cost) + " " + prevName; From 49a8e3a16bb9bb731f24867c1132470caa3d45da Mon Sep 17 00:00:00 2001 From: qq1010903229 <1010903229@qq.com> Date: Tue, 12 Dec 2023 14:41:27 +0800 Subject: [PATCH 3/4] commit --- js/data/buttons.js | 38 +++----------------------------------- js/tabs/buttons.js | 6 ++---- 2 files changed, 5 insertions(+), 39 deletions(-) diff --git a/js/data/buttons.js b/js/data/buttons.js index 0aba78f..1bb1354 100644 --- a/js/data/buttons.js +++ b/js/data/buttons.js @@ -195,13 +195,6 @@ let unlocks = { condition: () => D.gte(temp.skillLevel,200), conDisplay: () => "Skill level ≥" + format(200) + "", execute: () => { updateTabVisibility(); }, - }, - "col2": { - requires: ["col1"], - desc: () => "Improve Collapse", - condition: () => D.gte(game.money, D('1e600')), - conDisplay: () => "−" + format('1e600') + " Money", - execute: () => { game.money = D.sub(game.money, '1e600'); }, }, } let visibleUnlocks = []; @@ -247,20 +240,6 @@ function clickButton(row, tier, auto = false) { game.tokens = D.add(row, 1).pow(temp.tokenUpgEffects.tokens.normalTierFactor).mul(getTokenMulti()).add(game.tokens); if (!auto) game.stats.presses++; } - } else if (index == 1 && D(row).gte(2)) { - cost = getMultiReqForCollapse(row, getButtonCost(row, tier), cost); - let prevData = game.ladder[index - 1]; - if (D.gte(prevData.amount, cost)) { - game.money = 0; - for (let a = 0; a < index; a++) game.ladder[a].amount = game.ladder[a].level = D(0); - data.amount = getButtonGain(row, tier).mul(getRowMulti(row)).add(data.amount); - data.level = D(0); - data.presses = D.add(data.presses, 1); - if (!auto && game.unlocks.tok1 && Math.random() * 100 <= temp.tokenUpgEffects.tokens.normalChance) - game.tokens = D.add(row, 1).pow(temp.tokenUpgEffects.tokens.normalTierFactor).mul(getTokenMulti()).add(game.tokens); - if (!auto) game.stats.presses++; - if (game.unlocks.btn5) makeRow(row); - } } else { let prevData = game.ladder[index - 1]; if (D.gte(prevData.amount, cost)) { @@ -364,8 +343,7 @@ function doResetAuto(times) { whileloop: while (D.gt(times, 0)) { for (let a = (game.automators.reset?.depth ?? 1); a >= 1; a--) { let row = game.ladder[a]; - let pos = getHighestButton(row.tier, game.ladder[a - 1].amount); - if(a == 1 && D(row.tier) >= 2)pos = getHighestButton1(row.tier, game.ladder[a - 1].amount); + let pos = getHighestButton(row.tier, game.ladder[a - 1].amount); if (D.lt(pos, 0)) continue; let gain = getButtonGain(row.tier, pos).mul(getRowMulti(row.tier)); if (D.div(gain, row.amount).gt(game.automators.reset?.factor ?? 0)) { @@ -384,13 +362,13 @@ function getHighestButtonForCollapse(row, amount){ return D.div(D(amount).max(0), base).add(1).logBase(D.add(row, 1).mul(10)).div(10).add(1).logBase(1.1); } -function getMultiReqForCollapse(row, amount, orig){ +/* function getMultiReqForCollapse(row, amount, orig){ if(game.unlocks.col2)return orig; amount = amount.div(getRowMulti(row)).div(temp.sigilEffects[0]); let tier = getButtonTierForCollapse(row, amount); if(D(row).gte(2))return getMultiReqForCollapse(D(row).sub(1), getButtonCostForCollapse(row, tier), orig); return getButtonCostForCollapse(row, tier).max(orig); -} +} */ function getButtonTierForCollapse(row, amount) { let base = D.eq(row, 0) ? 8 : 4; @@ -412,14 +390,4 @@ function getCollapseMult() { } } return mult; -} - -function getHighestButton1(row, amount){ - if(game.unlocks.col2)return getHighestButton(row, amount); - let a = -1; - while(true){ - if(getMultiReqForCollapse(row, getButtonCost(row, a), getButtonCost(row, a)).gte(amount))break; - a++; - } - return D(a-1); } \ No newline at end of file diff --git a/js/tabs/buttons.js b/js/tabs/buttons.js index a01ea46..2543139 100644 --- a/js/tabs/buttons.js +++ b/js/tabs/buttons.js @@ -96,8 +96,7 @@ tabs.buttons = { button.cost = cost; } - if (game.unlocks.btn5 && !(a == 1 && D(data.tier) >= 2)) data.level = getHighestButton(data.tier, a == 0 ? game.money : game.ladder[a - 1].amount).max(data.level); - if (game.unlocks.btn5 && a == 1 && D(data.tier) >= 2) data.level = getHighestButton1(data.tier, a == 0 ? game.money : game.ladder[a - 1].amount).max(data.level); + if (game.unlocks.btn5) data.level = getHighestButton(data.tier, a == 0 ? game.money : game.ladder[a - 1].amount).max(data.level); let offset = D.sub(data.level, 6).max(0); let multi = getRowMulti(data.tier); let needsUpdate = allDirty || D.neq(multi, row.multi) || D.neq(row.items[0]?.tier ?? -1, offset); @@ -108,8 +107,7 @@ tabs.buttons = { let button = row.items[b]; button.tier = D.add(offset, b); let cost = getButtonCost(data.tier, button.tier); - if (a == 1 && D(data.tier) >= 2)cost = getMultiReqForCollapse(data.tier, getButtonCost(data.tier, button.tier), getButtonCost(data.tier, button.tier)); - if (needsUpdate) { + if (needsUpdate) { button.gain.textContent = "+" + format(getButtonGain(data.tier, button.tier).mul(row.multi)) + " " + name; button.cost.textContent = (a == 0 ? "−" : "≥") + format(cost) + " " + prevName; if (game.unlocks.btn6) button.setAttribute("mark", "#" + format(button.tier.add(1))); From 0f12f402c626681842f1a090659205584c871b77 Mon Sep 17 00:00:00 2001 From: qq1010903229 <1010903229@qq.com> Date: Tue, 12 Dec 2023 14:50:47 +0800 Subject: [PATCH 4/4] commit --- js/data/buttons.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/data/buttons.js b/js/data/buttons.js index 1bb1354..b585f4f 100644 --- a/js/data/buttons.js +++ b/js/data/buttons.js @@ -268,7 +268,7 @@ function makeRow(row) { game.ladder.push(highest); } if(D.lte(highest.tier, row) && game.ladder.length == 10 && game.unlocks.col1){ - if(game.collapsed.gte(5) && !game.unlocks.col2)return; + //if(game.collapsed.gte(5) && !game.unlocks.col2)return; game.collapsed = game.collapsed.add(1); for(let i = 2;i < 10; i++){ game.ladder[i-1]=game.ladder[i];