From 63314c8f99f869df47dfd3f85b4780858a29020c Mon Sep 17 00:00:00 2001 From: unsoftcapped3 <75136164+unsoftcapped3@users.noreply.github.com> Date: Thu, 15 Dec 2022 04:41:25 +0000 Subject: [PATCH 01/21] Recently updated for new upgrades/buyables from management layer --- src/data/layers/management.tsx | 45 +++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/data/layers/management.tsx b/src/data/layers/management.tsx index feb73b9..cccafa3 100644 --- a/src/data/layers/management.tsx +++ b/src/data/layers/management.tsx @@ -426,7 +426,10 @@ const layer = createLayer(id, () => { effectDisplay: "Unlock an elf that autobuys coal drills." }, visibility: () => showIf(expanderElfMilestones[2].earned.value && main.day.value >= 13), - shouldEarn: () => expandersElfTraining.level.value >= 4 + shouldEarn: () => expandersElfTraining.level.value >= 4, + onComplete() { + main.days[4].recentlyUpdated.value = true; + }, })), createMilestone(() => ({ display: { @@ -481,7 +484,10 @@ const layer = createLayer(id, () => { }, visibility: () => showIf(heatedCutterElfMilestones[3].earned.value && main.day.value >= 13), - shouldEarn: () => heatedCutterElfTraining.level.value >= 5 + shouldEarn: () => heatedCutterElfTraining.level.value >= 5, + onComplete() { + main.days[4].recentlyUpdated.value = true; + }, })) ] as Array; const heatedPlanterElfMilestones = [ @@ -579,7 +585,10 @@ const layer = createLayer(id, () => { }, visibility: () => showIf(fertilizerElfMilestones[3].earned.value && main.day.value >= 13), - shouldEarn: () => fertilizerElfTraining.level.value >= 5 + shouldEarn: () => fertilizerElfTraining.level.value >= 5, + onComplete() { + main.days[4].recentlyUpdated.value = true; + }, })) ] as Array; const smallfireElfMilestones = [ @@ -782,7 +791,10 @@ const layer = createLayer(id, () => { effectDisplay: "Unlock a second row of box buyables" }, visibility: () => showIf(boxElfMilestones[2].earned.value && main.day.value >= 13), - shouldEarn: () => boxElfTraining.level.value >= 4 + shouldEarn: () => boxElfTraining.level.value >= 4, + onComplete() { + main.days[6].recentlyUpdated.value = true; + }, })), createMilestone(() => ({ display: { @@ -790,7 +802,10 @@ const layer = createLayer(id, () => { effectDisplay: "Unlock another row of box upgrades" }, visibility: () => showIf(boxElfMilestones[3].earned.value && main.day.value >= 13), - shouldEarn: () => boxElfTraining.level.value >= 5 + shouldEarn: () => boxElfTraining.level.value >= 5, + onComplete() { + main.days[6].recentlyUpdated.value = true; + }, })) ] as Array; const clothElfMilestones = [ @@ -850,7 +865,10 @@ const layer = createLayer(id, () => { effectDisplay: "Unlock another row of focus upgrades" }, visibility: () => showIf(clothElfMilestones[3].earned.value && main.day.value >= 13), - shouldEarn: () => clothElfTraining.level.value >= 5 + shouldEarn: () => clothElfTraining.level.value >= 5, + onComplete() { + main.days[12].recentlyUpdated.value = true; + }, })) ] as Array; const coalDrillElfMilestones = [ @@ -884,7 +902,10 @@ const layer = createLayer(id, () => { }, visibility: () => showIf(coalDrillElfMilestones[2].earned.value && main.day.value >= 13), - shouldEarn: () => coalDrillElfTraining.level.value >= 4 + shouldEarn: () => coalDrillElfTraining.level.value >= 4, + onComplete() { + main.days[3].recentlyUpdated.value = true; + }, })), createMilestone(() => ({ display: { @@ -979,7 +1000,10 @@ const layer = createLayer(id, () => { effectDisplay: "Unlock another row of oil upgrades" }, visibility: () => showIf(oilElfMilestones[3].earned.value && main.day.value >= 13), - shouldEarn: () => oilElfTraining.level.value >= 5 + shouldEarn: () => oilElfTraining.level.value >= 5, + onComplete() { + main.days[9].recentlyUpdated.value = true; + }, })) ] as Array; const heavyDrillElfMilestones = [ @@ -1026,7 +1050,10 @@ const layer = createLayer(id, () => { }, visibility: () => showIf(heavyDrillElfMilestones[3].earned.value && main.day.value >= 13), - shouldEarn: () => heavyDrillElfTraining.level.value >= 5 + shouldEarn: () => heavyDrillElfTraining.level.value >= 5, + onComplete() { + main.days[5].recentlyUpdated.value = true; + }, })) ] as Array; // ------------------------------------------------------------------------------- Milestone display From f1f43398a705de94ae94d630b2f5c0f7c4860a85 Mon Sep 17 00:00:00 2001 From: ducdat0507 <62660527+ducdat0507@users.noreply.github.com> Date: Thu, 15 Dec 2022 11:57:33 +0700 Subject: [PATCH 02/21] Fix oil smelter's inverse cost --- src/data/layers/oil.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/layers/oil.tsx b/src/data/layers/oil.tsx index 64a0ad4..dd37b69 100644 --- a/src/data/layers/oil.tsx +++ b/src/data/layers/oil.tsx @@ -450,7 +450,9 @@ const layer = createLayer(id, function (this: BaseLayer) { } let v = Decimal.div(x, 1e7).log(10); v = v.div(Decimal.pow(0.95, paper.books.oilBook.totalAmount.value)); - if (Decimal.gte(v, 100)) v = Decimal.mul(v, 100).root(4); + if (Decimal.gte(v, 1e4)) v = Decimal.mul(v, 1e4).root(2); + if (Decimal.gte(v, 200)) v = Decimal.mul(v, 200).root(2); + if (Decimal.gte(v, 50)) v = Decimal.mul(v, 50).root(2); return Decimal.isNaN(v) ? Decimal.dZero : v.floor().max(0); }, display: jsx(() => ( From f48ae55cecdd6652e70ba40fb6e2ed4465c92f98 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Wed, 14 Dec 2022 23:15:46 -0600 Subject: [PATCH 03/21] Replace some text references to "buyables" --- src/data/layers/elves.tsx | 2 +- src/data/layers/management.tsx | 2 +- src/data/layers/paper.tsx | 6 +++--- src/data/projEntry.tsx | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/data/layers/elves.tsx b/src/data/layers/elves.tsx index 66ab1df..5ee3928 100644 --- a/src/data/layers/elves.tsx +++ b/src/data/layers/elves.tsx @@ -895,7 +895,7 @@ const layer = createLayer(id, function (this: BaseLayer) { const metalElf = createElf({ name: "Twinkle", description: - "Twinkle will automatically purchase all metal buyables you can afford, without actually spending any resources.", + "Twinkle will automatically purchase all metal machines you can afford, without actually spending any resources.", buyable: [metal.oreDrill, metal.industrialCrucible, metal.hotterForge], cooldownModifier: metalCooldown, visibility: () => diff --git a/src/data/layers/management.tsx b/src/data/layers/management.tsx index cccafa3..96d7cd3 100644 --- a/src/data/layers/management.tsx +++ b/src/data/layers/management.tsx @@ -581,7 +581,7 @@ const layer = createLayer(id, () => { createMilestone(() => ({ display: { requirement: "Noel Level 5", - effectDisplay: "Unlock an elf that autobuys metal buyables" + effectDisplay: "Unlock an elf that autobuys metal machines" }, visibility: () => showIf(fertilizerElfMilestones[3].earned.value && main.day.value >= 13), diff --git a/src/data/layers/paper.tsx b/src/data/layers/paper.tsx index caea52d..f18d412 100644 --- a/src/data/layers/paper.tsx +++ b/src/data/layers/paper.tsx @@ -244,7 +244,7 @@ const layer = createLayer(id, function (this: BaseLayer) { const paperBook = createBook({ name: "The Book Thief", elfName: "Star", - buyableName: "Paper Buyables", + buyableName: "Books", visibility: () => showIf(elves.elves.paperElf.bought.value) }); const boxBook = createBook({ @@ -280,13 +280,13 @@ const layer = createLayer(id, function (this: BaseLayer) { const metalBook = createBook({ name: "Physical Metallurgy", elfName: "Twinkle", - buyableName: "Metal Buyables", + buyableName: "Metal Machines", visibility: () => showIf(elves.elves.metalElf.bought.value) }); const dyeBook = createBook({ name: "Arts and Crafts", elfName: "Carol", - buyableName: "Dye Buyables", + buyableName: "Dyes", visibility: () => showIf(elves.elves.dyeElf.bought.value) }); const books = { diff --git a/src/data/projEntry.tsx b/src/data/projEntry.tsx index 2cf2ed4..367ffd3 100644 --- a/src/data/projEntry.tsx +++ b/src/data/projEntry.tsx @@ -259,7 +259,7 @@ export const main = createLayer("main", function (this: BaseLayer) { symbol: dyesSymbol, story: "To make toys, we're going to need some color to make them look nice and enticing! We can't just give kids clear toys after all! To add some color to our toys, we'll need some dyes!", completedStory: - "After all that effort, you finally have a rainbow of dyes to choose from! Now the children won't be able to resist the toys you have to offer, once you get them made of course..." + "After all that effort, you finally have a rainbow of dyes to choose from! Now the children won't be able to resist the toys you have to offer, once you get them made of course... Good Job!" })), createDay(() => ({ day: 12, From 14fc325ead551d6d1c764eb8b31cbe6c6e3efd89 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Wed, 14 Dec 2022 23:36:27 -0600 Subject: [PATCH 04/21] Fix recentlUpdated --- src/data/layers/management.tsx | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/data/layers/management.tsx b/src/data/layers/management.tsx index 96d7cd3..a8f7e29 100644 --- a/src/data/layers/management.tsx +++ b/src/data/layers/management.tsx @@ -428,8 +428,8 @@ const layer = createLayer(id, () => { visibility: () => showIf(expanderElfMilestones[2].earned.value && main.day.value >= 13), shouldEarn: () => expandersElfTraining.level.value >= 4, onComplete() { - main.days[4].recentlyUpdated.value = true; - }, + main.days[3].recentlyUpdated.value = true; + } })), createMilestone(() => ({ display: { @@ -486,8 +486,8 @@ const layer = createLayer(id, () => { showIf(heatedCutterElfMilestones[3].earned.value && main.day.value >= 13), shouldEarn: () => heatedCutterElfTraining.level.value >= 5, onComplete() { - main.days[4].recentlyUpdated.value = true; - }, + main.days[3].recentlyUpdated.value = true; + } })) ] as Array; const heatedPlanterElfMilestones = [ @@ -587,8 +587,8 @@ const layer = createLayer(id, () => { showIf(fertilizerElfMilestones[3].earned.value && main.day.value >= 13), shouldEarn: () => fertilizerElfTraining.level.value >= 5, onComplete() { - main.days[4].recentlyUpdated.value = true; - }, + main.days[3].recentlyUpdated.value = true; + } })) ] as Array; const smallfireElfMilestones = [ @@ -793,8 +793,8 @@ const layer = createLayer(id, () => { visibility: () => showIf(boxElfMilestones[2].earned.value && main.day.value >= 13), shouldEarn: () => boxElfTraining.level.value >= 4, onComplete() { - main.days[6].recentlyUpdated.value = true; - }, + main.days[5].recentlyUpdated.value = true; + } })), createMilestone(() => ({ display: { @@ -804,8 +804,8 @@ const layer = createLayer(id, () => { visibility: () => showIf(boxElfMilestones[3].earned.value && main.day.value >= 13), shouldEarn: () => boxElfTraining.level.value >= 5, onComplete() { - main.days[6].recentlyUpdated.value = true; - }, + main.days[5].recentlyUpdated.value = true; + } })) ] as Array; const clothElfMilestones = [ @@ -868,7 +868,7 @@ const layer = createLayer(id, () => { shouldEarn: () => clothElfTraining.level.value >= 5, onComplete() { main.days[12].recentlyUpdated.value = true; - }, + } })) ] as Array; const coalDrillElfMilestones = [ @@ -904,8 +904,8 @@ const layer = createLayer(id, () => { showIf(coalDrillElfMilestones[2].earned.value && main.day.value >= 13), shouldEarn: () => coalDrillElfTraining.level.value >= 4, onComplete() { - main.days[3].recentlyUpdated.value = true; - }, + main.days[2].recentlyUpdated.value = true; + } })), createMilestone(() => ({ display: { @@ -1002,8 +1002,8 @@ const layer = createLayer(id, () => { visibility: () => showIf(oilElfMilestones[3].earned.value && main.day.value >= 13), shouldEarn: () => oilElfTraining.level.value >= 5, onComplete() { - main.days[9].recentlyUpdated.value = true; - }, + main.days[8].recentlyUpdated.value = true; + } })) ] as Array; const heavyDrillElfMilestones = [ @@ -1052,8 +1052,8 @@ const layer = createLayer(id, () => { showIf(heavyDrillElfMilestones[3].earned.value && main.day.value >= 13), shouldEarn: () => heavyDrillElfTraining.level.value >= 5, onComplete() { - main.days[5].recentlyUpdated.value = true; - }, + main.days[4].recentlyUpdated.value = true; + } })) ] as Array; // ------------------------------------------------------------------------------- Milestone display From 0488416654dd7997e52331c4bd17a1bb6122d788 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Thu, 15 Dec 2022 00:04:46 -0600 Subject: [PATCH 05/21] Fix description --- src/data/layers/management.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/layers/management.tsx b/src/data/layers/management.tsx index a8f7e29..b829f5d 100644 --- a/src/data/layers/management.tsx +++ b/src/data/layers/management.tsx @@ -1390,7 +1390,7 @@ const layer = createLayer(id, () => { const focusUpgrade6 = createUpgrade(() => ({ display: { title: "Focus Doubler", - description: "Focus now applies to 6 elves." + description: "Focus applies to an additional elf." }, resource: trees.logs, visibility: () => showIf(elfTraining.clothElfTraining.milestones[4].earned.value), From f3916c29b74f18ba3d39e9c2340db9387500393a Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Thu, 15 Dec 2022 00:04:59 -0600 Subject: [PATCH 06/21] Add new save preset --- saves/Day 13 Complete.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 saves/Day 13 Complete.txt diff --git a/saves/Day 13 Complete.txt b/saves/Day 13 Complete.txt new file mode 100644 index 0000000..577e30c --- /dev/null +++ b/saves/Day 13 Complete.txt @@ -0,0 +1 @@ +eyJpZCI6ImFkdmVudC1pbmNyZW1lbnRhbC0xIiwiZGV2U3BlZWQiOjAsIm5hbWUiOiJEZWZhdWx0IFNhdmUiLCJ0YWJzIjpbIm1haW4iLCJkeWVzIl0sInRpbWUiOjE2NzEwODMzMjMzNDUsImF1dG9zYXZlIjp0cnVlLCJvZmZsaW5lUHJvZCI6ZmFsc2UsIm9mZmxpbmVUaW1lIjpudWxsLCJ0aW1lUGxheWVkIjo5NzIyOS4yMzEwMDAwNzA5Mywia2VlcEdvaW5nIjpmYWxzZSwibW9kSUQiOiJhZHZlbnQtaW5jcmVtZW50YWwiLCJtb2RWZXJzaW9uIjoiMC41IiwibGF5ZXJzIjp7Im1haW4iOnsibWluaW1pemVkIjpmYWxzZSwiZGF5cyI6eyIwIjp7Im9wZW5lZCI6dHJ1ZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjEiOnsib3BlbmVkIjp0cnVlLCJyZWNlbnRseVVwZGF0ZWQiOmZhbHNlfSwiMiI6eyJvcGVuZWQiOnRydWUsInJlY2VudGx5VXBkYXRlZCI6ZmFsc2V9LCIzIjp7Im9wZW5lZCI6dHJ1ZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjQiOnsib3BlbmVkIjp0cnVlLCJyZWNlbnRseVVwZGF0ZWQiOmZhbHNlfSwiNSI6eyJvcGVuZWQiOnRydWUsInJlY2VudGx5VXBkYXRlZCI6ZmFsc2V9LCI2Ijp7Im9wZW5lZCI6dHJ1ZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjciOnsib3BlbmVkIjp0cnVlLCJyZWNlbnRseVVwZGF0ZWQiOmZhbHNlfSwiOCI6eyJvcGVuZWQiOnRydWUsInJlY2VudGx5VXBkYXRlZCI6ZmFsc2V9LCI5Ijp7Im9wZW5lZCI6dHJ1ZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjEwIjp7Im9wZW5lZCI6dHJ1ZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjExIjp7Im9wZW5lZCI6dHJ1ZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjEyIjp7Im9wZW5lZCI6dHJ1ZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjEzIjp7Im9wZW5lZCI6ZmFsc2UsInJlY2VudGx5VXBkYXRlZCI6ZmFsc2V9LCIxNCI6eyJvcGVuZWQiOmZhbHNlLCJyZWNlbnRseVVwZGF0ZWQiOmZhbHNlfSwiMTUiOnsib3BlbmVkIjpmYWxzZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjE2Ijp7Im9wZW5lZCI6ZmFsc2UsInJlY2VudGx5VXBkYXRlZCI6ZmFsc2V9LCIxNyI6eyJvcGVuZWQiOmZhbHNlLCJyZWNlbnRseVVwZGF0ZWQiOmZhbHNlfSwiMTgiOnsib3BlbmVkIjpmYWxzZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjE5Ijp7Im9wZW5lZCI6ZmFsc2UsInJlY2VudGx5VXBkYXRlZCI6ZmFsc2V9LCIyMCI6eyJvcGVuZWQiOmZhbHNlLCJyZWNlbnRseVVwZGF0ZWQiOmZhbHNlfSwiMjEiOnsib3BlbmVkIjpmYWxzZSwicmVjZW50bHlVcGRhdGVkIjpmYWxzZX0sIjIyIjp7Im9wZW5lZCI6ZmFsc2UsInJlY2VudGx5VXBkYXRlZCI6ZmFsc2V9LCIyMyI6eyJvcGVuZWQiOmZhbHNlLCJyZWNlbnRseVVwZGF0ZWQiOmZhbHNlfX0sImRheSI6MTR9LCJ0cmVlcyI6eyJtaW5pbWl6ZWQiOmZhbHNlLCJsb2dzIjoiNi4zODEyNTE1NTg2NDg2MTllMzciLCJ0b3RhbExvZ3MiOiIxLjM2NDEyNDAxMzg4MTEzNDhlMzkiLCJzYXBsaW5ncyI6IjQ0MTY2ODI5Mjc3NjMwLjciLCJyb3cxVXBncmFkZXMiOnsiMCI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYm91Z2h0Ijp0cnVlfSwiMSI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYm91Z2h0Ijp0cnVlfSwiMiI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYm91Z2h0Ijp0cnVlfSwiMyI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYm91Z2h0Ijp0cnVlfSwiNCI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYm91Z2h0Ijp0cnVlfX0sInJvdzJVcGdyYWRlcyI6eyIwIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJib3VnaHQiOnRydWV9LCIxIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJib3VnaHQiOnRydWV9LCIyIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJib3VnaHQiOnRydWV9LCIzIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJib3VnaHQiOnRydWV9LCI0Ijp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJib3VnaHQiOnRydWV9fSwicm93MUJ1eWFibGVzIjp7IjAiOnsicmVzb3VyY2UiOiIxODAwNzY1NDAxMjQ1OS4zNiIsImFtb3VudCI6IjEyOTIyODIifSwiMSI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYW1vdW50IjoiMTMzMDAxNyJ9LCIyIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJhbW91bnQiOiIxOTQ0MjM2In19LCJtYW51YWxDdXRQcm9ncmVzcyI6IjAuMDAwMDA3NjI5Mzk0NTMxMjQ5OTg0IiwibWFudWFsUGxhbnRQcm9ncmVzcyI6IjAuMDAwMDA3NjI5Mzk0NTMxMjQ5OTg0IiwiZ2VuZXJhbFRhYkNvbGxhcHNlZCI6e319LCJ3b3Jrc2hvcCI6eyJtaW5pbWl6ZWQiOmZhbHNlLCJmb3VuZGF0aW9uUHJvZ3Jlc3MiOiI3MTciLCJmb3VuZGF0aW9uQ29udmVyc2lvbiI6eyJiYXNlUmVzb3VyY2UiOiIxODAwNzY1NDAxMjQ1OS4zNiIsImdhaW5SZXNvdXJjZSI6MTAwfSwibWlsZXN0b25lcyI6eyJsb2dHYWluTWlsZXN0b25lMSI6eyJlYXJuZWQiOnRydWV9LCJhdXRvQ3V0TWlsZXN0b25lMSI6eyJlYXJuZWQiOnRydWV9LCJhdXRvUGxhbnRNaWxlc3RvbmUxIjp7ImVhcm5lZCI6dHJ1ZX0sImF1dG9DdXRNaWxlc3RvbmUyIjp7ImVhcm5lZCI6dHJ1ZX0sImF1dG9QbGFudE1pbGVzdG9uZTIiOnsiZWFybmVkIjp0cnVlfSwibG9nR2Fpbk1pbGVzdG9uZTIiOnsiZWFybmVkIjp0cnVlfSwibW9yZVBsYW50c01pbGVzdG9uZTEiOnsiZWFybmVkIjp0cnVlfSwibG9nR2Fpbk1pbGVzdG9uZTMiOnsiZWFybmVkIjp0cnVlfSwiZXh0cmFFeHBhbnNpb25NaWxlc3RvbmUxIjp7ImVhcm5lZCI6dHJ1ZX0sImV4dHJhRXhwYW5zaW9uTWlsZXN0b25lMiI6eyJlYXJuZWQiOnRydWV9LCJleHRyYUV4cGFuc2lvbk1pbGVzdG9uZTMiOnsiZWFybmVkIjp0cnVlfSwiZXh0cmFFeHBhbnNpb25NaWxlc3RvbmU0Ijp7ImVhcm5lZCI6ZmFsc2V9LCJleHRyYUV4cGFuc2lvbk1pbGVzdG9uZTUiOnsiZWFybmVkIjpmYWxzZX19LCJjb2xsYXBzZU1pbGVzdG9uZXMiOmZhbHNlfSwiY29hbCI6eyJtaW5pbWl6ZWQiOmZhbHNlLCJjb2FsIjoiNS42ODEwMTc4MzkyNTIyMjVlNTgiLCJ0b3RhbENvYWwiOiI1LjY4MTAxODk1MDM2NDg3M2U1OCIsImFzaCI6IjYuNjc2NjU3OTc0NjEwNjUwNWU0NCIsImFjdGl2ZUZpcmVzIjoiMCIsImJ1aWxkRmlyZSI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYW1vdW50IjoiMCJ9LCJhY3RpdmVCb25maXJlcyI6IjExMjAxMjU2MzQwIiwiYnVpbGRCb25maXJlIjp7InJlc291cmNlIjoiMzAxNyIsImFtb3VudCI6IjExMjAxMjU2MzQwIn0sImFjdGl2ZUtpbG5zIjoiMjM4NyIsImJ1aWxkS2lsbiI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYW1vdW50IjoiMjM4NyJ9LCJ3YXJtZXJDdXR0ZXJzIjp7InJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYm91Z2h0Ijp0cnVlfSwid2FybWVyUGxhbnRlcnMiOnsicmVzb3VyY2UiOiIxMTc5OTk3ODgxMDg0Ljk3NjgiLCJib3VnaHQiOnRydWV9LCJiYXNpY0ZlcnRpbGl6ZXIiOnsicmVzb3VyY2UiOiI1NDU2NDA4NDYuMTUzMzU5OSIsImJvdWdodCI6dHJ1ZX0sInVubG9ja0JvbmZpcmUiOnsicmVzb3VyY2UiOiIzMDE3IiwiYm91Z2h0Ijp0cnVlfSwiZGVkaWNhdGVkQ3V0dGVycyI6eyJyZXNvdXJjZSI6IjExNzk5OTc4ODEwODQuOTc2OCIsImJvdWdodCI6dHJ1ZX0sImRlZGljYXRlZFBsYW50ZXJzIjp7InJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYm91Z2h0Ijp0cnVlfSwiYmV0dGVyRmVydGlsaXplciI6eyJib3VnaHQiOnRydWV9LCJ1bmxvY2tLaWxuIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJib3VnaHQiOnRydWV9LCJoZWF0ZWRDdXR0ZXJzIjp7InJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYW1vdW50IjoiNTcxODAzIn0sImhlYXRlZFBsYW50ZXJzIjp7InJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYW1vdW50IjoiNTcxODAzIn0sIm1vcmVGZXJ0aWxpemVyIjp7InJlc291cmNlIjoiNTQ1NjQwODQ2LjE1MzM1OTkiLCJhbW91bnQiOiIxMzMyNTQyIn0sImdlbmVyYWxUYWJDb2xsYXBzZWQiOnt9LCJhY3RpdmVEcmlsbHMiOiI1MTciLCJidWlsZERyaWxsIjp7ImFtb3VudCI6IjUxNyJ9LCJlZmZpY2llbnRTbWVsdGhlciI6eyJib3VnaHQiOnRydWV9LCJhcnNvbmlzdEFzc2lzdGFuY2UiOnsiYm91Z2h0IjpmYWxzZX0sInJlZmluZWRDb2FsIjp7ImJvdWdodCI6ZmFsc2V9LCJjb2xvcmVkRmlyZSI6eyJib3VnaHQiOmZhbHNlfX0sImVsdmVzIjp7Im1pbmltaXplZCI6ZmFsc2UsImVsdmVzIjp7ImN1dHRlcnNFbGYiOnsiYnV5YWJsZSI6eyJyZXNvdXJjZSI6IjE4MDA3NjU0MDEyNDU5LjM2IiwiYW1vdW50IjoiNjQ1MSJ9LCJidXlQcm9ncmVzcyI6IjAuMDAxNzEwNDA0NjExNjUzNzQwMiIsInJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYm91Z2h0Ijp0cnVlLCJhbW91bnRPZlRpbWVzRG9uZSI6MC40OTYwMDAwMDAxNzAxMzQ1N30sInBsYW50ZXJzRWxmIjp7ImJ1eWFibGUiOnsicmVzb3VyY2UiOiIxODAwNzY1NDAxMjQ1OS4zNiIsImFtb3VudCI6IjY0NTEifSwiYnV5UHJvZ3Jlc3MiOiIwLjAwMTcxMDQwNDYxMTY1Mzc0MDIiLCJyZXNvdXJjZSI6IjExNzk5OTc4ODEwODQuOTc2OCIsImJvdWdodCI6dHJ1ZSwiYW1vdW50T2ZUaW1lc0RvbmUiOjAuNTY4MDAwMDAwMTcwNTkyfSwiZXhwYW5kZXJzRWxmIjp7ImJ1eWFibGUiOnsicmVzb3VyY2UiOiIxODAwNzY1NDAxMjQ1OS4zNiIsImFtb3VudCI6IjE4NDEwIn0sImJ1eVByb2dyZXNzIjoiMC4wMDE3MTA0MDQ2MTE2NTM3NDAyIiwicmVzb3VyY2UiOiIxMTc5OTk3ODgxMDg0Ljk3NjgiLCJib3VnaHQiOnRydWUsImFtb3VudE9mVGltZXNEb25lIjowLjI0MDAwMDAwMDE3MDUwMzgyfSwiaGVhdGVkQ3V0dGVyc0VsZiI6eyJidXlhYmxlIjp7InJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYW1vdW50IjoiMzYzIn0sImJ1eVByb2dyZXNzIjoiMC4wMDEyNDM0MjE3MTMxNjkwODc4IiwicmVzb3VyY2UiOiIxMTc5OTk3ODgxMDg0Ljk3NjgiLCJib3VnaHQiOnRydWUsImFtb3VudE9mVGltZXNEb25lIjowLjY0NDAwMDAwMDE3MTQwOTd9LCJoZWF0ZWRQbGFudGVyc0VsZiI6eyJidXlhYmxlIjp7InJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYW1vdW50IjoiMzYzIn0sImJ1eVByb2dyZXNzIjoiMC4wMDA1OTk4MTkyMTcwNDA4MTczIiwicmVzb3VyY2UiOiIxMTc5OTk3ODgxMDg0Ljk3NjgiLCJib3VnaHQiOnRydWUsImFtb3VudE9mVGltZXNEb25lIjowLjQ4MDAwMDAwMDE3MzU4MjQ2fSwiZmVydGlsaXplckVsZiI6eyJidXlhYmxlIjp7InJlc291cmNlIjoiNTQ1NjQwODQ2LjE1MzM1OTkiLCJhbW91bnQiOiIyNTUifSwiYnV5UHJvZ3Jlc3MiOiIwLjAwMTE3MjQwMzM0OTk4MzI5NDgiLCJyZXNvdXJjZSI6IjExNzk5OTc4ODEwODQuOTc2OCIsImJvdWdodCI6dHJ1ZSwiYW1vdW50T2ZUaW1lc0RvbmUiOjAuODA4MDAwMDAwMTcyODYwN30sInNtYWxsRmlyZUVsZiI6eyJidXlhYmxlIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJhbW91bnQiOiIzMDE3In0sInRvZ2dsZSI6dHJ1ZSwiYnV5UHJvZ3Jlc3MiOiIwLjAwMDc2NDEzNzAyODczNTM4NzEiLCJyZXNvdXJjZSI6IjExNzk5OTc4ODEwODQuOTc2OCIsImJvdWdodCI6dHJ1ZSwiYW1vdW50T2ZUaW1lc0RvbmUiOjAuODgwMDAwMDAwMTczNDMxOH0sImJvbmZpcmVFbGYiOnsiYnV5YWJsZSI6eyJyZXNvdXJjZSI6IjMwMTciLCJhbW91bnQiOiI0MTAifSwidG9nZ2xlIjp0cnVlLCJidXlQcm9ncmVzcyI6IjAuMDAxMjYwMzgyODk4Nzg2NDI0NiIsInJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYm91Z2h0Ijp0cnVlLCJhbW91bnRPZlRpbWVzRG9uZSI6MC41MDAwMDAwMDAxNzg1NjY1fSwia2lsbkVsZiI6eyJidXlhYmxlIjp7InJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJhbW91bnQiOiIxNDQifSwidG9nZ2xlIjp0cnVlLCJidXlQcm9ncmVzcyI6IjAuMDAxNDQ0OTg0NzU2MjY2OTA2NiIsInJlc291cmNlIjoiMTE3OTk5Nzg4MTA4NC45NzY4IiwiYm91Z2h0Ijp0cnVlLCJhbW91bnRPZlRpbWVzRG9uZSI6MC4zNDQwMDAwMDAxNzkwNzIyfSwicGFwZXJFbGYiOnsiYnV5UHJvZ3Jlc3MiOiIwLjAxMTIzODA5NTIzODI3NjQ1OCIsImJvdWdodCI6dHJ1ZSwiYW1vdW50T2ZUaW1lc0RvbmUiOjAuNDIwMDAwMDAwMDAzMzk5fSwiYm94RWxmIjp7ImJ1eVByb2dyZXNzIjoiMC4wMDUyODU3MTQyODU4OTQ0MDIiLCJib3VnaHQiOnRydWUsImFtb3VudE9mVGltZXNEb25lIjowLjA1NjAwMDAwMDAwMzI1Nzg5fSwiY2xvdGhFbGYiOnsiYnV5UHJvZ3Jlc3MiOiIwLjAwMTM5MjY3OTY1NzU0NTA2MSIsImJvdWdodCI6dHJ1ZSwiYW1vdW50T2ZUaW1lc0RvbmUiOjAuODE2MDAwMDAwMjAxMDgyNX0sIm1pbmluZ0RyaWxsRWxmIjp7InRvZ2dsZSI6ZmFsc2UsImJ1eVByb2dyZXNzIjowLCJhbW91bnRPZlRpbWVzRG9uZSI6MCwiYm91Z2h0IjpmYWxzZX0sImhlYXZ5RHJpbGxFbGYiOnsidG9nZ2xlIjp0cnVlLCJidXlQcm9ncmVzcyI6IjAuMDAwNDU0Njg4NjU5NzgzMzgyNCIsImFtb3VudE9mVGltZXNEb25lIjowLjUyMDAwMDAwMDAxMDgyNDcsImJvdWdodCI6dHJ1ZX0sIm9pbEVsZiI6eyJ0b2dnbGUiOnRydWUsImJ1eVByb2dyZXNzIjoiMC4wMDM2MzY1MDM3NDc5ODE5NzQyIiwiYW1vdW50T2ZUaW1lc0RvbmUiOjAuMDc2MDAwMDAwMDA5Njc4MSwiYm91Z2h0Ijp0cnVlfSwibWV0YWxFbGYiOnsiYnV5UHJvZ3Jlc3MiOiIwLjAwNDEyOTM2OTI3NDI1NjA2MyIsImFtb3VudE9mVGltZXNEb25lIjowLjM2NDAwMDAwMDAwNjQ3NzM2LCJib3VnaHQiOnRydWV9LCJjb2FsRHJpbGxFbGYiOnsidG9nZ2xlIjp0cnVlLCJidXlQcm9ncmVzcyI6IjAuMDAxOTM4MzQ2NjAyNTIxNzI3NSIsImFtb3VudE9mVGltZXNEb25lIjowLjc1NjAwMDAwMDAyMjM4OTQsImJvdWdodCI6dHJ1ZX0sImR5ZUVsZiI6eyJidXlQcm9ncmVzcyI6MCwiYW1vdW50T2ZUaW1lc0RvbmUiOjAsImJvdWdodCI6ZmFsc2V9fSwibWlsZXN0b25lcyI6eyIwIjp7ImVhcm5lZCI6dHJ1ZX0sIjEiOnsiZWFybmVkIjp0cnVlfSwiMiI6eyJlYXJuZWQiOnRydWV9LCIzIjp7ImVhcm5lZCI6dHJ1ZX0sIjQiOnsiZWFybmVkIjp0cnVlfSwiNSI6eyJlYXJuZWQiOnRydWV9LCI2Ijp7ImVhcm5lZCI6dHJ1ZX0sIjciOnsiZWFybmVkIjp0cnVlfSwiOCI6eyJlYXJuZWQiOnRydWV9LCI5Ijp7ImVhcm5lZCI6dHJ1ZX0sIjEwIjp7ImVhcm5lZCI6dHJ1ZX0sIjExIjp7ImVhcm5lZCI6dHJ1ZX19LCJjb2xsYXBzZU1pbGVzdG9uZXMiOmZhbHNlLCJnZW5lcmFsVGFiQ29sbGFwc2VkIjp7fX0sInBhcGVyIjp7Im1pbmltaXplZCI6ZmFsc2UsInBhcGVyIjoiMy4xNjYwODM5NzcwMzA3MDY1ZTQwIiwidG90YWxQYXBlciI6IjQuMTc2MTgzOTc4NjM2ODAxZTQwIiwicGFwZXJDb252ZXJzaW9uIjp7ImdhaW5SZXNvdXJjZSI6IjE0MTgyLjk5OTk5OTk5OTkyNyJ9LCJib29rcyI6eyJjdXR0ZXJzQm9vayI6eyJyZXNvdXJjZSI6IjE0MTgyLjk5OTk5OTk5OTkyNyIsImFtb3VudCI6IjExMyJ9LCJwbGFudGVyc0Jvb2siOnsicmVzb3VyY2UiOiIxNDE4Mi45OTk5OTk5OTk5MjciLCJhbW91bnQiOiIxMTMifSwiZXhwYW5kZXJzQm9vayI6eyJyZXNvdXJjZSI6IjE0MTgyLjk5OTk5OTk5OTkyNyIsImFtb3VudCI6IjExMyJ9LCJoZWF0ZWRDdXR0ZXJzQm9vayI6eyJyZXNvdXJjZSI6IjE0MTgyLjk5OTk5OTk5OTkyNyIsImFtb3VudCI6IjExMyJ9LCJoZWF0ZWRQbGFudGVyc0Jvb2siOnsicmVzb3VyY2UiOiIxNDE4Mi45OTk5OTk5OTk5MjciLCJhbW91bnQiOiIxMTMifSwiZmVydGlsaXplckJvb2siOnsicmVzb3VyY2UiOiIxNDE4Mi45OTk5OTk5OTk5MjciLCJhbW91bnQiOiIxMTMifSwic21hbGxGaXJlQm9vayI6eyJyZXNvdXJjZSI6IjE0MTgyLjk5OTk5OTk5OTkyNyIsImFtb3VudCI6IjExMyJ9LCJib25maXJlQm9vayI6eyJyZXNvdXJjZSI6IjE0MTgyLjk5OTk5OTk5OTkyNyIsImFtb3VudCI6IjExMyJ9LCJraWxuQm9vayI6eyJyZXNvdXJjZSI6IjE0MTgyLjk5OTk5OTk5OTkyNyIsImFtb3VudCI6IjExMyJ9LCJwYXBlckJvb2siOnsiYW1vdW50IjoiMTEifSwiYm94Qm9vayI6eyJhbW91bnQiOiIxMSJ9LCJjbG90aEJvb2siOnsiYW1vdW50IjoiMTEzIn0sIm1pbmluZ0RyaWxsQm9vayI6eyJhbW91bnQiOjB9LCJoZWF2eURyaWxsQm9vayI6eyJhbW91bnQiOiIzNyJ9LCJvaWxCb29rIjp7ImFtb3VudCI6IjM3In0sIm1ldGFsQm9vayI6eyJhbW91bnQiOiIzNyJ9LCJjb2FsRHJpbGxCb29rIjp7ImFtb3VudCI6IjM3In0sImR5ZUJvb2siOnsiYW1vdW50IjowfX0sImdlbmVyYWxUYWJDb2xsYXBzZWQiOnt9LCJ1cGdyYWRlcyI6eyJjbG90aFVwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfSwiZHJpbGxpbmdVcGdyYWRlIjp7ImJvdWdodCI6dHJ1ZX0sIm9pbFVwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfX0sInVwZ3JhZGVzMiI6eyJhc2hVcGdyYWRlIjp7ImJvdWdodCI6dHJ1ZX0sImJvb2tVcGdyYWRlIjp7ImJvdWdodCI6dHJ1ZX0sImNsYXNzcm9vbVVwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfX19LCJib3hlcyI6eyJtaW5pbWl6ZWQiOmZhbHNlLCJib3hlcyI6IjEuODI2MTUzMjk1NTM3MzY5ZTMzIiwidG90YWxCb3hlcyI6IjEuODI3MjYzMzA2MTY4NTllMzMiLCJib3hlc0NvbnZlcnNpb24iOnsiYmFzZVJlc291cmNlIjoiMTgwMDc2NTQwMTI0NTkuMzYiLCJnYWluUmVzb3VyY2UiOiI4MDEzLjk5OTk5OTk5OTk5MyJ9LCJ1cGdyYWRlcyI6eyJsb2dzVXBncmFkZSI6eyJyZXNvdXJjZSI6IjgwMTMuOTk5OTk5OTk5OTkzIiwiYm91Z2h0Ijp0cnVlfSwiYXNoVXBncmFkZSI6eyJyZXNvdXJjZSI6IjgwMTMuOTk5OTk5OTk5OTkzIiwiYm91Z2h0Ijp0cnVlfSwiY29hbFVwZ3JhZGUiOnsicmVzb3VyY2UiOiI4MDEzLjk5OTk5OTk5OTk5MyIsImJvdWdodCI6dHJ1ZX19LCJidXlhYmxlcyI6eyJsb2dCb3hlc0J1eWFibGUiOnsicmVzb3VyY2UiOiI4MDEzLjk5OTk5OTk5OTk5MyIsImFtb3VudCI6IjE4OSJ9LCJhc2hCb3hlc0J1eWFibGUiOnsicmVzb3VyY2UiOiI4MDEzLjk5OTk5OTk5OTk5MyIsImFtb3VudCI6IjkyIn0sImNvYWxCb3hlc0J1eWFibGUiOnsicmVzb3VyY2UiOiI4MDEzLjk5OTk5OTk5OTk5MyIsImFtb3VudCI6IjcxIn19LCJyb3cyVXBncmFkZXMiOnsib3JlVXBncmFkZSI6eyJib3VnaHQiOnRydWV9LCJtZXRhbFVwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfSwicGxhc3RpY1VwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfX0sInJvdzNVcGdyYWRlcyI6eyJjbG90aFVwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfSwiZHllVXBncmFkZSI6eyJib3VnaHQiOnRydWV9LCJ4cFVwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfX0sImdlbmVyYWxUYWJDb2xsYXBzZWQiOnt9LCJidXlhYmxlczIiOnsib3JlQm94ZXNCdXlhYmxlIjp7ImFtb3VudCI6IjE4In0sIm1ldGFsQm94ZXNCdXlhYmxlIjp7ImFtb3VudCI6IjEwIn0sInBsYXN0aWNCb3hlc0J1eWFibGUiOnsiYW1vdW50IjoiNSJ9fX0sIm1ldGFsIjp7Im1pbmltaXplZCI6ZmFsc2UsIm9yZSI6IjAuOTAxOTk2NTUyOTQ0MTgzMyIsImJlc3RPcmUiOiI1NjI2NzY1NTUzLjQyNjQxNyIsIm9yZVByb2dyZXNzIjoiMC43MTE5OTk5OTk5OTk2NjY3IiwibWV0YWwiOiIxLjAyMjU3MzE3NzU1OTAwMzdlMjIiLCJiZXN0TWV0YWwiOiIxLjg3MjM2NDk1MzMxMjQxMDdlMjIiLCJ0b3RhbE1ldGFsIjoiOC4zOTU4NTM0NjM4MTM1NjZlMjIiLCJzaW1wbGVQaWNrYXhlIjp7ImJvdWdodCI6dHJ1ZX0sImRvdWJsZVBpY2theGUiOnsiYm91Z2h0IjpmYWxzZX0sImNydWNpYmxlIjp7ImJvdWdodCI6dHJ1ZX0sImNvYWxEcmlsbCI6eyJib3VnaHQiOnRydWV9LCJpbmR1c3RyaWFsRnVybmFjZSI6eyJib3VnaHQiOnRydWV9LCJvcmVEcmlsbCI6eyJhbW91bnQiOiIyNjgxIn0sImluZHVzdHJpYWxDcnVjaWJsZSI6eyJhbW91bnQiOiIyNjkifSwiYXV0b1NtZWx0RW5hYmxlZCI6dHJ1ZSwiaG90dGVyRm9yZ2UiOnsiYW1vdW50IjoiMzMzIn0sImdlbmVyYWxUYWJDb2xsYXBzZWQiOnt9LCJlZmZpY2llbnREcmlsbCI6eyJib3VnaHQiOnRydWV9fSwiY2xvdGgiOnsibWluaW1pemVkIjpmYWxzZSwiY2xvdGgiOiIxMDE0MjQ4MzUxIiwidG90YWxDbG90aCI6IjExMjUzNjQ1MzEiLCJ3b29sIjoiMCIsInNoZWVwIjoiMzQ2NjAwNDQiLCJidWlsZFBlbnMiOnsiYW1vdW50IjoiMjE0NCJ9LCJiZXR0ZXJTaGVhcnMiOnsiYW1vdW50IjoiMjAyOSJ9LCJmYXN0ZXJTcGlubmluZyI6eyJhbW91bnQiOiIzMTU3In0sInRyZWVzVXBncmFkZXMiOnsidHJlZXNVcGdyYWRlMyI6eyJib3VnaHQiOnRydWV9LCJ0cmVlc1VwZ3JhZGUyIjp7ImJvdWdodCI6dHJ1ZX0sInRyZWVzVXBncmFkZTEiOnsiYm91Z2h0Ijp0cnVlfSwidHJlZXNVcGdyYWRlNCI6eyJib3VnaHQiOnRydWV9fSwibWV0YWxVcGdyYWRlcyI6eyJtZXRhbFVwZ3JhZGUzIjp7ImJvdWdodCI6dHJ1ZX0sIm1ldGFsVXBncmFkZTIiOnsiYm91Z2h0Ijp0cnVlfSwibWV0YWxVcGdyYWRlMSI6eyJib3VnaHQiOnRydWV9LCJtZXRhbFVwZ3JhZGU0Ijp7ImJvdWdodCI6dHJ1ZX19LCJwYXBlclVwZ3JhZGVzIjp7InBhcGVyVXBncmFkZTMiOnsiYm91Z2h0Ijp0cnVlfSwicGFwZXJVcGdyYWRlMiI6eyJib3VnaHQiOnRydWV9LCJwYXBlclVwZ3JhZGUxIjp7ImJvdWdodCI6dHJ1ZX0sInBhcGVyVXBncmFkZTQiOnsiYm91Z2h0Ijp0cnVlfX0sImdlbmVyYWxUYWJDb2xsYXBzZWQiOnt9LCJicmVlZGluZ1Byb2dyZXNzIjoxLCJzaGVhcmluZ1Byb2dyZXNzIjoxLCJzcGlubmluZ1Byb2dyZXNzIjoxfSwib2lsIjp7Im1pbmltaXplZCI6ZmFsc2UsIm9pbCI6IjQ4MTUxMDYzMzk1NDU4NS40IiwidG90YWxPaWwiOiI1OTMyODA3NDYwMjQzNzYuMiIsImRlcHRoIjoiMTcyMTUiLCJkcmlsbFByb2dyZXNzIjoiNTcyOTI3MjY3Ljc3MjA5NDciLCJhY3RpdmVIZWF2eSI6IjE4MCIsImJ1aWxkSGVhdnkiOnsiYW1vdW50IjoiMTgwIn0sImFjdGl2ZUhlYXZ5MiI6Ijg0IiwiYnVpbGRIZWF2eTIiOnsiYW1vdW50IjoiODQifSwiYWN0aXZlRXh0cmFjdG9yIjoiMTkiLCJidWlsZEV4dHJhY3RvciI6eyJhbW91bnQiOiIxOSJ9LCJhY3RpdmVQdW1wIjoiMTkiLCJidWlsZFB1bXAiOnsiYW1vdW50IjoiMTkifSwiYWN0aXZlQnVybmVyIjoiMTMxIiwiYnVpbGRCdXJuZXIiOnsiYW1vdW50IjoiMTMxIn0sImFjdGl2ZVNtZWx0ZXIiOiI3NyIsImJ1aWxkU21lbHRlciI6eyJhbW91bnQiOiI3NyJ9LCJkZXB0aE1pbGVzdG9uZXMiOnsiMCI6eyJlYXJuZWQiOnRydWV9LCIxIjp7ImVhcm5lZCI6dHJ1ZX0sIjIiOnsiZWFybmVkIjp0cnVlfSwiMyI6eyJlYXJuZWQiOnRydWV9LCI0Ijp7ImVhcm5lZCI6dHJ1ZX0sIjUiOnsiZWFybmVkIjp0cnVlfSwiNiI6eyJlYXJuZWQiOnRydWV9LCI3Ijp7ImVhcm5lZCI6dHJ1ZX19LCJjb2xsYXBzZWREZXB0aE1pbGVzdG9uZXMiOmZhbHNlLCJyb3cxVXBncmFkZXMiOnsiMCI6eyJib3VnaHQiOnRydWV9LCIxIjp7ImJvdWdodCI6dHJ1ZX0sIjIiOnsiYm91Z2h0Ijp0cnVlfSwiMyI6eyJib3VnaHQiOnRydWV9LCI0Ijp7ImJvdWdodCI6dHJ1ZX19LCJyb3cyVXBncmFkZXMiOnsiMCI6eyJib3VnaHQiOnRydWV9LCIxIjp7ImJvdWdodCI6dHJ1ZX0sIjIiOnsiYm91Z2h0Ijp0cnVlfSwiMyI6eyJib3VnaHQiOnRydWV9LCI0Ijp7ImJvdWdodCI6dHJ1ZX19LCJvaWxNaWxlc3RvbmVzIjp7IjAiOnsiZWFybmVkIjp0cnVlfSwiMSI6eyJlYXJuZWQiOnRydWV9LCIyIjp7ImVhcm5lZCI6dHJ1ZX19LCJjb2xsYXBzZWRPaWxNaWxlc3RvbmVzIjpmYWxzZSwiZ2VuZXJhbFRhYkNvbGxhcHNlZCI6e30sInJvdzNVcGdyYWRlcyI6eyIwIjp7ImJvdWdodCI6dHJ1ZX0sIjEiOnsiYm91Z2h0Ijp0cnVlfSwiMiI6eyJib3VnaHQiOmZhbHNlfSwiMyI6eyJib3VnaHQiOmZhbHNlfSwiNCI6eyJib3VnaHQiOmZhbHNlfX19LCJwbGFzdGljIjp7Im1pbmltaXplZCI6ZmFsc2UsInBsYXN0aWMiOiIzNzk3MzY4MTE1LjMwOTQ1NSIsInRvdGFsUGxhc3RpYyI6Ijc0MDM3MDMzMTUuNDk2OTY5IiwiYnVpbGRSZWZpbmVyeSI6eyJhbW91bnQiOiIxODQifSwiYWN0aXZlUmVmaW5lcnkiOiIxODQiLCJ1cGdyYWRlcyI6eyJwYXBlclRvb2xzIjp7ImJvdWdodCI6dHJ1ZX0sImJveFRvb2xzIjp7ImJvdWdodCI6dHJ1ZX0sImNsb3RoVG9vbHMiOnsiYm91Z2h0Ijp0cnVlfX0sImVsZlVwZ3JhZGVzIjp7InBhcGVyRWxmIjp7ImJvdWdodCI6dHJ1ZX0sImJveEVsZiI6eyJib3VnaHQiOnRydWV9LCJjbG90aEVsZiI6eyJib3VnaHQiOnRydWV9fSwiYnV5YWJsZXMiOnsicGFzc2l2ZVBhcGVyIjp7ImFtb3VudCI6IjYwIn0sInBhc3NpdmVCb3hlcyI6eyJhbW91bnQiOiI1NiJ9LCJjbG90aEdhaW5zIjp7ImFtb3VudCI6IjUwIn19LCJnZW5lcmFsVGFiQ29sbGFwc2VkIjp7fX0sImR5ZXMiOnsibWluaW1pemVkIjpmYWxzZSwiZHllcyI6eyJyZWQiOnsiYW1vdW50IjoiMTAzMTIyOTI4LjA2MDM2MTk4IiwiYnV5YWJsZSI6eyJhbW91bnQiOiI1NCJ9fSwieWVsbG93Ijp7ImFtb3VudCI6IjEwMzEyMjkyOC4wNjAzNjE5OCIsImJ1eWFibGUiOnsiYW1vdW50IjoiNTQifX0sImJsdWUiOnsiYW1vdW50IjoiMTAzMTIyOTI4LjA2MDM2MTk4IiwiYnV5YWJsZSI6eyJhbW91bnQiOiI1NCJ9fSwib3JhbmdlIjp7ImFtb3VudCI6IjI1MjAiLCJidXlhYmxlIjp7ImFtb3VudCI6IjM1In19LCJncmVlbiI6eyJhbW91bnQiOiIyNTIwIiwiYnV5YWJsZSI6eyJhbW91bnQiOiIzNSJ9fSwicHVycGxlIjp7ImFtb3VudCI6IjI1MjAiLCJidXlhYmxlIjp7ImFtb3VudCI6IjM1In19fSwiZ2VuZXJhbFRhYkNvbGxhcHNlZCI6e30sInVwZ3JhZGVzIjp7ImJsdWVEeWVVcGciOnsiYm91Z2h0Ijp0cnVlfSwicmVkRHllVXBnIjp7ImJvdWdodCI6dHJ1ZX0sInllbGxvd0R5ZVVwZyI6eyJib3VnaHQiOnRydWV9LCJ5ZWxsb3dEeWVVcGcyIjp7ImJvdWdodCI6dHJ1ZX0sInJlZER5ZVVwZzIiOnsiYm91Z2h0Ijp0cnVlfSwiYmx1ZUR5ZVVwZzIiOnsiYm91Z2h0Ijp0cnVlfSwiY29hbFVwZyI6eyJib3VnaHQiOnRydWV9fX0sIm1hbmFnZW1lbnQiOnsibWluaW1pemVkIjpmYWxzZSwiZWxmVHJhaW5pbmciOnsiY3V0dGVyRWxmVHJhaW5pbmciOnsic3RhdGUiOmZhbHNlLCJleHAiOiIzMTI4MzUxLjI3NDA0MzM3ODQiLCJtaWxlc3RvbmVzIjp7IjAiOnsiZWFybmVkIjp0cnVlfSwiMSI6eyJlYXJuZWQiOnRydWV9LCIyIjp7ImVhcm5lZCI6dHJ1ZX0sIjMiOnsiZWFybmVkIjp0cnVlfSwiNCI6eyJlYXJuZWQiOnRydWV9fX0sInBsYW50ZXJFbGZUcmFpbmluZyI6eyJzdGF0ZSI6ZmFsc2UsImV4cCI6IjYyNjQ2MDQuNTM1NTQ4NTI2IiwibWlsZXN0b25lcyI6eyIwIjp7ImVhcm5lZCI6dHJ1ZX0sIjEiOnsiZWFybmVkIjp0cnVlfSwiMiI6eyJlYXJuZWQiOnRydWV9LCIzIjp7ImVhcm5lZCI6dHJ1ZX0sIjQiOnsiZWFybmVkIjp0cnVlfX19LCJleHBhbmRlcnNFbGZUcmFpbmluZyI6eyJzdGF0ZSI6ZmFsc2UsImV4cCI6IjkzNzIwNzIuODI2NzYxNDU2IiwibWlsZXN0b25lcyI6eyIwIjp7ImVhcm5lZCI6dHJ1ZX0sIjEiOnsiZWFybmVkIjp0cnVlfSwiMiI6eyJlYXJuZWQiOnRydWV9LCIzIjp7ImVhcm5lZCI6dHJ1ZX0sIjQiOnsiZWFybmVkIjp0cnVlfX19LCJoZWF0ZWRDdXR0ZXJFbGZUcmFpbmluZyI6eyJzdGF0ZSI6dHJ1ZSwiZXhwIjoiMTI0OTY2ODMuNjM5MTAzOTg2IiwibWlsZXN0b25lcyI6eyIwIjp7ImVhcm5lZCI6dHJ1ZX0sIjEiOnsiZWFybmVkIjp0cnVlfSwiMiI6eyJlYXJuZWQiOnRydWV9LCIzIjp7ImVhcm5lZCI6dHJ1ZX0sIjQiOnsiZWFybmVkIjp0cnVlfX19LCJoZWF0ZWRQbGFudGVyRWxmVHJhaW5pbmciOnsic3RhdGUiOmZhbHNlLCJleHAiOiIxNTYzODMzOC40OTkxNjEwMjIiLCJtaWxlc3RvbmVzIjp7IjAiOnsiZWFybmVkIjp0cnVlfSwiMSI6eyJlYXJuZWQiOnRydWV9LCIyIjp7ImVhcm5lZCI6dHJ1ZX0sIjMiOnsiZWFybmVkIjp0cnVlfSwiNCI6eyJlYXJuZWQiOnRydWV9fX0sImZlcnRpbGl6ZXJFbGZUcmFpbmluZyI6eyJzdGF0ZSI6dHJ1ZSwiZXhwIjoiMTg3NDQzNjguNjUzOTgwMTYiLCJtaWxlc3RvbmVzIjp7IjAiOnsiZWFybmVkIjp0cnVlfSwiMSI6eyJlYXJuZWQiOnRydWV9LCIyIjp7ImVhcm5lZCI6dHJ1ZX0sIjMiOnsiZWFybmVkIjp0cnVlfSwiNCI6eyJlYXJuZWQiOnRydWV9fX0sInNtYWxsZmlyZUVsZlRyYWluaW5nIjp7InN0YXRlIjp0cnVlLCJleHAiOiIyMTg2ODE3OC41NjAzNDc2OTUiLCJtaWxlc3RvbmVzIjp7IjAiOnsiZWFybmVkIjp0cnVlfSwiMSI6eyJlYXJuZWQiOnRydWV9LCIyIjp7ImVhcm5lZCI6dHJ1ZX0sIjMiOnsiZWFybmVkIjp0cnVlfSwiNCI6eyJlYXJuZWQiOnRydWV9fX0sImJvbmZpcmVFbGZUcmFpbmluZyI6eyJzdGF0ZSI6dHJ1ZSwiZXhwIjoiMjQ5OTI5ODAuNzIzODU3MTA1IiwibWlsZXN0b25lcyI6eyIwIjp7ImVhcm5lZCI6dHJ1ZX0sIjEiOnsiZWFybmVkIjp0cnVlfSwiMiI6eyJlYXJuZWQiOnRydWV9LCIzIjp7ImVhcm5lZCI6dHJ1ZX0sIjQiOnsiZWFybmVkIjp0cnVlfX19LCJraWxuRWxmVHJhaW5pbmciOnsic3RhdGUiOnRydWUsImV4cCI6IjI4MTE2MjQ5LjIxMjA0MDI2IiwibWlsZXN0b25lcyI6eyIwIjp7ImVhcm5lZCI6dHJ1ZX0sIjEiOnsiZWFybmVkIjp0cnVlfSwiMiI6eyJlYXJuZWQiOnRydWV9LCIzIjp7ImVhcm5lZCI6dHJ1ZX0sIjQiOnsiZWFybmVkIjp0cnVlfX19LCJwYXBlckVsZlRyYWluaW5nIjp7InN0YXRlIjp0cnVlLCJleHAiOiIxMDQzNzY0Ny4yNzc0NzQ1NiIsIm1pbGVzdG9uZXMiOnsiMCI6eyJlYXJuZWQiOnRydWV9LCIxIjp7ImVhcm5lZCI6dHJ1ZX0sIjIiOnsiZWFybmVkIjp0cnVlfSwiMyI6eyJlYXJuZWQiOnRydWV9LCI0Ijp7ImVhcm5lZCI6dHJ1ZX19fSwiYm94RWxmVHJhaW5pbmciOnsic3RhdGUiOnRydWUsImV4cCI6IjExNDU2Mzg3LjczNDcyMTA0OCIsIm1pbGVzdG9uZXMiOnsiMCI6eyJlYXJuZWQiOnRydWV9LCIxIjp7ImVhcm5lZCI6dHJ1ZX0sIjIiOnsiZWFybmVkIjp0cnVlfSwiMyI6eyJlYXJuZWQiOnRydWV9LCI0Ijp7ImVhcm5lZCI6dHJ1ZX19fSwiY2xvdGhFbGZUcmFpbmluZyI6eyJzdGF0ZSI6ZmFsc2UsImV4cCI6IjM3NTYzOTc2LjQyMDMyMDA4NiIsIm1pbGVzdG9uZXMiOnsiMCI6eyJlYXJuZWQiOnRydWV9LCIxIjp7ImVhcm5lZCI6dHJ1ZX0sIjIiOnsiZWFybmVkIjp0cnVlfSwiMyI6eyJlYXJuZWQiOnRydWV9LCI0Ijp7ImVhcm5lZCI6dHJ1ZX19fSwiY29hbERyaWxsRWxmVHJhaW5pbmciOnsic3RhdGUiOnRydWUsImV4cCI6IjQwNjI5MTg1LjYyNDk2MDcxIiwibWlsZXN0b25lcyI6eyIwIjp7ImVhcm5lZCI6dHJ1ZX0sIjEiOnsiZWFybmVkIjp0cnVlfSwiMiI6eyJlYXJuZWQiOnRydWV9LCIzIjp7ImVhcm5lZCI6dHJ1ZX0sIjQiOnsiZWFybmVkIjp0cnVlfX19LCJtZXRhbEVsZlRyYWluaW5nIjp7InN0YXRlIjp0cnVlLCJleHAiOiI0OTk4NTgwNC4xOTQ4MDM0NCIsIm1pbGVzdG9uZXMiOnsiMCI6eyJlYXJuZWQiOnRydWV9LCIxIjp7ImVhcm5lZCI6dHJ1ZX0sIjIiOnsiZWFybmVkIjp0cnVlfSwiMyI6eyJlYXJuZWQiOnRydWV9LCI0Ijp7ImVhcm5lZCI6dHJ1ZX19fSwib2lsRWxmVHJhaW5pbmciOnsic3RhdGUiOnRydWUsImV4cCI6IjQ2ODYzMTM2LjEwMzU5MDExNiIsIm1pbGVzdG9uZXMiOnsiMCI6eyJlYXJuZWQiOnRydWV9LCIxIjp7ImVhcm5lZCI6dHJ1ZX0sIjIiOnsiZWFybmVkIjp0cnVlfSwiMyI6eyJlYXJuZWQiOnRydWV9LCI0Ijp7ImVhcm5lZCI6dHJ1ZX19fSwiaGVhdnlEcmlsbEVsZlRyYWluaW5nIjp7InN0YXRlIjp0cnVlLCJleHAiOiI0MzczNjQzMy4zNzE3ODQyNyIsIm1pbGVzdG9uZXMiOnsiMCI6eyJlYXJuZWQiOnRydWV9LCIxIjp7ImVhcm5lZCI6dHJ1ZX0sIjIiOnsiZWFybmVkIjp0cnVlfSwiMyI6eyJlYXJuZWQiOnRydWV9LCI0Ijp7ImVhcm5lZCI6dHJ1ZX19fX0sImN1cnJlbnRTaG93biI6IkNvY29hIiwiZ2VuZXJhbFRhYkNvbGxhcHNlZCI6e30sInRlYWNoaW5nIjp7ImJvdWdodCI6dHJ1ZX0sInNjaG9vbHMiOnsiYW1vdW50IjoiNSJ9LCJjbGFzc3Jvb21zIjp7ImFtb3VudCI6Ijc1MyJ9LCJjbGFzc3Jvb21VcGdyYWRlIjp7ImJvdWdodCI6dHJ1ZX0sImZvY3VzTXVsdGlwbGllciI6IjE5LjM3MTc0ODk3NDI5MDQ4MyIsInVwZ3JhZGVzIjp7IjAiOnsiYm91Z2h0Ijp0cnVlfSwiMSI6eyJib3VnaHQiOnRydWV9LCIyIjp7ImJvdWdodCI6dHJ1ZX19LCJmb2N1c1RhcmdldHMiOnsiUGVwcGVybWludCI6dHJ1ZSwiTm9lbCI6dHJ1ZSwiR2luZ2Vyc25hcCI6dHJ1ZSwiSXZ5Ijp0cnVlLCJDb2NvYSI6dHJ1ZX0sImZvY3VzQ29vbGRvd24iOjguNjk5LCJmb2N1c1RpbWUiOjguNjk5LCJhZHZhbmNlZFVwZ3JhZGUiOnsiYm91Z2h0Ijp0cnVlfSwidXBncmFkZXMyIjp7IjAiOnsiYm91Z2h0Ijp0cnVlfSwiMSI6eyJib3VnaHQiOnRydWV9LCIyIjp7ImJvdWdodCI6dHJ1ZX19fSwid3JhcHBpbmdQYXBlciI6eyJtaW5pbWl6ZWQiOmZhbHNlLCJ3cmFwcGluZ1BhcGVyIjp7ImNocmlzdG1hcyI6eyJidXlhYmxlIjp7ImFtb3VudCI6MH19LCJyYWluYm93Ijp7ImJ1eWFibGUiOnsiYW1vdW50IjowfX0sImphenp5Ijp7ImJ1eWFibGUiOnsiYW1vdW50IjowfX0sInN1bnNoaW5lIjp7ImJ1eWFibGUiOnsiYW1vdW50IjowfX0sIm9jZWFuIjp7ImJ1eWFibGUiOnsiYW1vdW50IjowfX0sImJlYWNoIjp7ImJ1eWFibGUiOnsiYW1vdW50IjowfX19LCJnZW5lcmFsVGFiQ29sbGFwc2VkIjp7fSwibWlsZXN0b25lcyI6eyJwcmltYXJ5Qm9vc3QiOnsiZWFybmVkIjpmYWxzZX0sInNlY29uZGFyeUJvb3N0Ijp7ImVhcm5lZCI6ZmFsc2V9LCJidXlNYXhQcmltYXJ5Ijp7ImVhcm5lZCI6ZmFsc2V9LCJzZWNvbmRhcnlOb1Jlc2V0Ijp7ImVhcm5lZCI6ZmFsc2V9LCJidXlNYXhTZWNvbmRhcnkiOnsiZWFybmVkIjpmYWxzZX0sInVubG9ja0R5ZUVsZiI6eyJlYXJuZWQiOmZhbHNlfX0sImNvbGxhcHNlTWlsZXN0b25lcyI6dHJ1ZX19LCJhdXRvUGF1c2UiOnRydWUsInVzaW5nTG9nIjp0cnVlfQ== \ No newline at end of file From 36f78951b5960ffafe8724801bb40a7919099a74 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Thu, 15 Dec 2022 00:52:01 -0600 Subject: [PATCH 07/21] Implemented day 14 --- src/data/Scene.vue | 7 + src/data/layers/letters.tsx | 292 ++++++++++++++++++++++++++++++++++++ src/data/layers/metal.tsx | 57 ++++--- src/data/projEntry.tsx | 14 +- 4 files changed, 346 insertions(+), 24 deletions(-) create mode 100644 src/data/layers/letters.tsx diff --git a/src/data/Scene.vue b/src/data/Scene.vue index 0f63ccd..4cbed77 100644 --- a/src/data/Scene.vue +++ b/src/data/Scene.vue @@ -7,6 +7,12 @@ style="left: 4%; bottom: 3%; width: 40px; height: 40px" /> + (0, "letters processed"); + + const processingProgress = persistent(0); + const processingProgressBar = createBar(() => ({ + direction: Direction.Right, + width: 100, + height: 10, + style: "margin-top: 8px", + borderStyle: "border-color: black", + baseStyle: "margin-top: 0", + fillStyle: "margin-top: 0; transition-duration: 0s; background: black", + progress: () => Decimal.div(processingProgress.value, computedProcessingCooldown.value) + })); + const process = createClickable(() => ({ + display: { + title: "Process Letters", + description: jsx(() => ( + <> + Process {format(computedLettersGain.value, 1)} letters +
+ {render(processingProgressBar)} + + )) + }, + style: { + minHeight: "80px" + }, + canClick: () => Decimal.gte(processingProgress.value, computedProcessingCooldown.value), + onClick() { + if (Decimal.lt(processingProgress.value, computedProcessingCooldown.value)) { + return; + } + const amount = Decimal.div( + processingProgress.value, + computedProcessingCooldown.value + ).floor(); + letters.value = Decimal.times(amount, computedLettersGain.value).add(letters.value); + processingProgress.value = 0; + } + })); + + const metalBuyable = createBuyable(() => ({ + display: { + title: "Sorting Machine", + description: + "Use a mechanic sorting machine to speed up how quickly you process letters", + effectDisplay: jsx(() => ( + <>{format(Decimal.div(metalBuyable.amount.value, 2).add(1))}x + )) + }, + resource: metal.metal, + cost() { + return Decimal.pow(10, metalBuyable.amount.value).times(1e21); + } + })) as GenericBuyable; + const plasticBuyable = createBuyable(() => ({ + display: { + title: "Plastic Bins", + description: + "Use various plastic bins to allow you to process larger quantities of letters at once", + effectDisplay: jsx(() => ( + <>{format(Decimal.div(plasticBuyable.amount.value, 2).add(1))}x + )) + }, + resource: plastic.plastic, + cost() { + return Decimal.pow(1.5, plasticBuyable.amount.value).times(1e9); + } + })) as GenericBuyable; + const paperBuyable = createBuyable(() => ({ + display: { + title: "Printed Labels", + description: "Use printed labels to improve how many letters you can process at once", + effectDisplay: jsx(() => ( + <>{format(Decimal.div(paperBuyable.amount.value, 2).add(1))}x + )) + }, + resource: paper.paper, + cost() { + return Decimal.pow(3, paperBuyable.amount.value).times(1e38); + } + })) as GenericBuyable; + const buyables = { metalBuyable, plasticBuyable, paperBuyable }; + + const autoSmeltingMilestone = createMilestone(() => ({ + display: { + requirement: "100 Letters Processed", + effectDisplay: "Double mining speed for every letters processed milestone" + }, + shouldEarn: () => Decimal.gte(totalLetters.value, 100) + })); + const miningMilestone = createMilestone(() => ({ + display: { + requirement: "1000 Letters Processed", + effectDisplay: jsx(() => ( + <> + Mine Blue Dye additional ore each operation + + )) + }, + shouldEarn: () => Decimal.gte(totalLetters.value, 1000), + visibility: () => showIf(autoSmeltingMilestone.earned.value) + })); + const synergyMilestone = createMilestone(() => ({ + display: { + requirement: "10,000 Letters Processed", + effectDisplay: + "Improve how much your experience processing letters allows you to process more letters" + }, + shouldEarn: () => Decimal.gte(totalLetters.value, 10000), + visibility: () => showIf(miningMilestone.earned.value) + })); + const industrialCrucibleMilestone = createMilestone(() => ({ + display: { + requirement: "100,000 Letters Processed", + effectDisplay: jsx(() => ( + <> + "Industrial Crucible" also multiplies the auto smelting multi by{" "} + amount + + )) + }, + shouldEarn: () => Decimal.gte(totalLetters.value, 100000), + visibility: () => showIf(synergyMilestone.earned.value) + })); + const milestones = { + autoSmeltingMilestone, + miningMilestone, + synergyMilestone, + industrialCrucibleMilestone + }; + const { collapseMilestones, display: milestonesDisplay } = + createCollapsibleMilestones(milestones); + + const synergy = computed(() => { + const amount = Decimal.add(totalLetters.value, 1); + if (synergyMilestone.earned.value) { + const preSoftcap = Decimal.log2(10001).add(1); + return preSoftcap.add(amount.sub(9999).sqrt()); + } else { + return Decimal.log2(amount).add(1); + } + }); + + const lettersGain = createSequentialModifier(() => [ + createMultiplicativeModifier(() => ({ + multiplier: synergy, + description: "Processing Letters Experience" + })), + createMultiplicativeModifier(() => ({ + multiplier: () => Decimal.div(plasticBuyable.amount.value, 2).add(1), + description: "Plastic Bins" + })), + createMultiplicativeModifier(() => ({ + multiplier: () => Decimal.div(paperBuyable.amount.value, 2).add(1), + description: "Printed Labels" + })) + ]); + const computedLettersGain = computed(() => lettersGain.apply(1)); + const processingCooldown = createSequentialModifier(() => [ + createMultiplicativeModifier(() => ({ + multiplier: () => Decimal.div(metalBuyable.amount.value, 2).add(1).recip(), + description: "Sorting Machine" + })) + ]); + const computedProcessingCooldown = computed(() => processingCooldown.apply(5)); + + const [generalTab, generalTabCollapsed] = createCollapsibleModifierSections(() => [ + { + title: "Processed Letters Amount", + modifier: lettersGain, + base: 1 + }, + { + title: "Processed Letters Cooldown", + modifier: processingCooldown, + base: 5 + } + ]); + const showModifiersModal = ref(false); + const modifiersModal = jsx(() => ( + (showModifiersModal.value = value)} + v-slots={{ + header: () =>

{name} Modifiers

, + body: generalTab + }} + /> + )); + + globalBus.on("update", diff => { + if (Decimal.lt(main.day.value, day)) { + return; + } + + if (Decimal.gte(processingProgress.value, computedProcessingCooldown.value)) { + processingProgress.value = computedProcessingCooldown.value; + } else { + processingProgress.value = Decimal.add(processingProgress.value, diff); + if (process.isHolding.value) { + process.onClick(); + } + } + }); + + const { total: totalLetters, trackerDisplay } = setUpDailyProgressTracker({ + resource: letters, + goal: 1e6, + name, + day, + color, + textColor: "var(--feature-foreground)", + modal: { + show: showModifiersModal, + display: modifiersModal + } + }); + + return { + name, + day, + color, + letters, + totalLetters, + processingProgress, + buyables, + milestones, + minWidth: 700, + generalTabCollapsed, + collapseMilestones, + display: jsx(() => ( + <> + {render(trackerDisplay)} + + + {render(process)} +
+ The more letters you process, the more you'll improve at processing letters. +
+
Currently: {format(synergy.value)}x
+ + {renderRow(...Object.values(buyables))} + + {milestonesDisplay()} + + )), + minimizedDisplay: jsx(() => ( +
+ {name} - {format(letters.value)} {letters.displayName} +
+ )) + }; +}); + +export default layer; diff --git a/src/data/layers/metal.tsx b/src/data/layers/metal.tsx index b73348f..ecd0f82 100644 --- a/src/data/layers/metal.tsx +++ b/src/data/layers/metal.tsx @@ -1,40 +1,40 @@ -import Spacer from "components/layout/Spacer.vue"; -import MainDisplay from "features/resources/MainDisplay.vue"; import Toggle from "components/fields/Toggle.vue"; +import Spacer from "components/layout/Spacer.vue"; import Modal from "components/Modal.vue"; import { createCollapsibleModifierSections, setUpDailyProgressTracker } from "data/common"; +import { createBar } from "features/bars/bar"; +import { createBuyable } from "features/buyable"; +import { createClickable } from "features/clickables/clickable"; import { jsx, showIf } from "features/feature"; +import MainDisplay from "features/resources/MainDisplay.vue"; import { createResource, Resource, trackBest } from "features/resources/resource"; -import { BaseLayer, createLayer } from "game/layers"; -import Decimal, { DecimalSource } from "lib/break_eternity"; -import { render, renderRow } from "util/vue"; -import { persistent } from "game/persistence"; +import { createUpgrade, GenericUpgrade } from "features/upgrades/upgrade"; import { globalBus } from "game/events"; +import { BaseLayer, createLayer } from "game/layers"; import { createAdditiveModifier, createExponentialModifier, createMultiplicativeModifier, createSequentialModifier } from "game/modifiers"; -import { computed, ref, unref } from "vue"; -import { createBar } from "features/bars/bar"; -import { Direction } from "util/common"; +import { noPersist, persistent } from "game/persistence"; +import Decimal, { DecimalSource } from "lib/break_eternity"; import { format, formatGain, formatLimit, formatWhole } from "util/break_eternity"; -import { createClickable } from "features/clickables/clickable"; -import coal from "./coal"; -import { createUpgrade, GenericUpgrade } from "features/upgrades/upgrade"; -import { noPersist } from "game/persistence"; -import { createBuyable, GenericBuyable } from "features/buyable"; +import { Direction } from "util/common"; +import { render, renderRow } from "util/vue"; +import { computed, ref, unref } from "vue"; import { main } from "../projEntry"; -import oil from "./oil"; import boxes from "./boxes"; import cloth from "./cloth"; -import plastic from "./plastic"; +import coal from "./coal"; import dyes from "./dyes"; -import management from "./management"; -import workshop from "./workshop"; -import paper from "./paper"; import { ElfBuyable } from "./elves"; +import letters from "./letters"; +import management from "./management"; +import oil from "./oil"; +import paper from "./paper"; +import plastic from "./plastic"; +import workshop from "./workshop"; const id = "metal"; const day = 7; @@ -188,6 +188,11 @@ const layer = createLayer(id, function (this: BaseLayer) { multiplier: 3, description: "Twinkle Level 3", enabled: management.elfTraining.metalElfTraining.milestones[2].earned + })), + createMultiplicativeModifier(() => ({ + multiplier: () => Decimal.add(industrialCrucible.amount.value, 1).sqrt(), + description: "100,000 Letters Processed", + enabled: letters.milestones.industrialCrucibleMilestone.earned })) ]); const computedAutoSmeltMulti = computed(() => autoSmeltMulti.apply(1)); @@ -258,6 +263,11 @@ const layer = createLayer(id, function (this: BaseLayer) { multiplier: 2, description: "Carry ore in boxes", enabled: boxes.row2Upgrades.oreUpgrade.bought + })), + createMultiplicativeModifier(() => ({ + multiplier: () => Decimal.add(dyes.dyes.blue.amount.value, 1).sqrt(), + description: "1000 Letters Processed", + enabled: letters.milestones.miningMilestone.earned })) ]); const computedOreAmount = computed(() => oreAmount.apply(1)); @@ -286,6 +296,15 @@ const layer = createLayer(id, function (this: BaseLayer) { multiplier: 2, description: "Oil the Metal Drills", enabled: oil.row2Upgrades[1].bought + })), + createMultiplicativeModifier(() => ({ + multiplier: () => + Decimal.pow( + 2, + Object.values(letters.milestones).filter(m => m.earned.value).length + ), + description: "100 Letters Processed", + enabled: letters.milestones.autoSmeltingMilestone.earned })) ]); const computedOreSpeed = computed(() => oreSpeed.apply(Decimal.recip(maxOreProgress))); diff --git a/src/data/projEntry.tsx b/src/data/projEntry.tsx index 367ffd3..498f0e8 100644 --- a/src/data/projEntry.tsx +++ b/src/data/projEntry.tsx @@ -23,6 +23,7 @@ import cloth from "./layers/cloth"; import coal from "./layers/coal"; import dyes from "./layers/dyes"; import elves from "./layers/elves"; +import letters from "./layers/letters"; import management from "./layers/management"; import metal from "./layers/metal"; import oil from "./layers/oil"; @@ -37,6 +38,7 @@ import coalSymbol from "./symbols/coal.png"; import dyesSymbol from "./symbols/dyes.png"; import elfSymbol from "./symbols/elf.png"; import managementSymbol from "./symbols/elfManagement.png"; +import lettersSymbol from "./symbols/letterbox.png"; import metalSymbol from "./symbols/metal.png"; import oilSymbol from "./symbols/oil.png"; import paperSymbol from "./symbols/paperStacks.png"; @@ -282,10 +284,11 @@ export const main = createLayer("main", function (this: BaseLayer) { createDay(() => ({ day: 14, shouldNotify: false, - layer: null, // "letters to santa" - symbol: "", - story: "", - completedStory: "" + layer: "letters", + symbol: lettersSymbol, + story: "Fully prepared to start working on presents, you realize you don't actually know what to make! You ask Santa and he points at a massive pile of letters hiding just off-camera. Those are all the letters to Santa that need to be processed, sorted, and categorized appropriately so every kid gets what they need!", + completedStory: + "The letters are sorted! You have a slight feeling you may have rushed a little, and suddenly understand why sometimes you don't get everything you asked Santa for every year, or even the occasional bad gift. You sympathetically pat Santa on the back as you head to bed for the day. Good Job!" })), createDay(() => ({ day: 15, @@ -441,7 +444,8 @@ export const getInitialLayers = ( plastic, dyes, wrappingPaper, - management + management, + letters ]; /** From 9147911675d8bda14a69a99c8581474f21bfb2de Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Thu, 15 Dec 2022 00:53:14 -0600 Subject: [PATCH 08/21] Preload calendar image --- index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/index.html b/index.html index f986505..b0cf092 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,7 @@ + Advent Incremental From f81c469373b86f78841096edcaea53b31fb3c2f0 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Thu, 15 Dec 2022 00:53:40 -0600 Subject: [PATCH 09/21] Add hardcap to workshop --- src/data/layers/workshop.tsx | 10 ++++++---- src/data/projEntry.tsx | 12 ++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/data/layers/workshop.tsx b/src/data/layers/workshop.tsx index cfae845..70bfeaa 100644 --- a/src/data/layers/workshop.tsx +++ b/src/data/layers/workshop.tsx @@ -8,6 +8,7 @@ import { main } from "data/projEntry"; import { createBar } from "features/bars/bar"; import { createClickable } from "features/clickables/clickable"; import { + addHardcap, addSoftcap, createIndependentConversion, createPolynomialScaling @@ -42,10 +43,11 @@ const layer = createLayer(id, function (this: BaseLayer) { const foundationProgress = createResource(0, "foundation progress"); const foundationConversion = createIndependentConversion(() => ({ - scaling: addSoftcap( - addSoftcap(createPolynomialScaling(250, 1.5), 5387, 1 / 1e10), - 1e20, - 3e8 + scaling: addHardcap( + addSoftcap(addSoftcap(createPolynomialScaling(250, 1.5), 5387, 1 / 1e10), 1e20, 3e8), + computed(() => + management.elfTraining.expandersElfTraining.milestones[2].earned.value ? 1000 : 100 + ) ), baseResource: trees.logs, gainResource: noPersist(foundationProgress), diff --git a/src/data/projEntry.tsx b/src/data/projEntry.tsx index 498f0e8..d79dd39 100644 --- a/src/data/projEntry.tsx +++ b/src/data/projEntry.tsx @@ -8,9 +8,9 @@ import { } from "features/feature"; import { BaseLayer, createLayer, GenericLayer, layers } from "game/layers"; import { persistent } from "game/persistence"; -import type { PlayerData } from "game/player"; +import type { LayerData, PlayerData } from "game/player"; import player from "game/player"; -import { format, formatTime } from "util/bignum"; +import Decimal, { format, formatTime } from "util/bignum"; import { Computable, convertComputable, ProcessedComputable } from "util/computed"; import { createLazyProxy } from "util/proxies"; import { renderRow, VueFeature } from "util/vue"; @@ -469,6 +469,14 @@ export function fixOldSave( if (!["0.0", "0.1", "0.2", "0.3", "0.4"].includes(oldVersion ?? "")) { return; } + if ((player.layers?.workshop as LayerData | undefined)?.foundationProgress) { + (player.layers?.workshop as LayerData | undefined)!.foundationProgress = + Decimal.min( + (player.layers!.workshop as LayerData | undefined)! + .foundationProgress!, + 1000 + ); + } /*player.offlineProd = false; delete player.layers?.management; if ((player.layers?.main as LayerData | undefined)?.days?.[11]) { From 00ba83db0049475092c8db2d36ecb54e1bb2134f Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Thu, 15 Dec 2022 01:04:53 -0600 Subject: [PATCH 10/21] Modify two upgrades about management --- src/data/layers/dyes.tsx | 43 ++++++++++++++++++++++++++++--------- src/data/layers/oil.tsx | 13 +++++++---- src/data/layers/paper.tsx | 16 +++++++------- src/data/layers/plastic.tsx | 5 +++++ src/data/layers/trees.tsx | 5 +++++ 5 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/data/layers/dyes.tsx b/src/data/layers/dyes.tsx index 4d7a5b6..5c97f7d 100644 --- a/src/data/layers/dyes.tsx +++ b/src/data/layers/dyes.tsx @@ -91,21 +91,25 @@ const layer = createLayer(id, function (this: BaseLayer) { description: `${options.name} Chambers` })) ]; - if (options.color === "yellow" && oil.row3Upgrades[0].bought.value){ + if (options.color === "yellow" && oil.row3Upgrades[0].bought.value) { modifiers.push( createMultiplicativeModifier(() => ({ - multiplier(){return Decimal.add(dyes.red.amount.value,1).log10().pow(0.75)}, + multiplier() { + return Decimal.add(dyes.red.amount.value, 1).log10().pow(0.75); + }, description: "Dye Synergy I" })) - ) + ); } - if (options.color === "red" && oil.row3Upgrades[3].bought.value){ + if (options.color === "red" && oil.row3Upgrades[3].bought.value) { modifiers.push( createMultiplicativeModifier(() => ({ - multiplier(){return Decimal.add(dyes.blue.amount.value,1).log10()}, + multiplier() { + return Decimal.add(dyes.blue.amount.value, 1).log10(); + }, description: "Dye Synergy II" })) - ) + ); } if (options.color === "red" || options.color === "yellow") { modifiers.push( @@ -253,9 +257,16 @@ const layer = createLayer(id, function (this: BaseLayer) { }, inverseCost() { if (unref(buyable.visibility) != Visibility.Visible) return Decimal.dZero; - return unref(costs).reduce((pre, c) => - Decimal.min(this.inverseCostPre(Decimal.div(c.res.value, unref(c.base)).root(unref(c.root ?? 1))), pre) - , Decimal.dInf); + return unref(costs).reduce( + (pre, c) => + Decimal.min( + this.inverseCostPre( + Decimal.div(c.res.value, unref(c.base)).root(unref(c.root ?? 1)) + ), + pre + ), + Decimal.dInf + ); }, canPurchase: computed((cost?: DecimalSource) => { if (unref(buyable.visibility) != Visibility.Visible) return false; @@ -532,7 +543,12 @@ const layer = createLayer(id, function (this: BaseLayer) { .pow(upgrades.coalUpg.bought.value ? 1.2 : 1) .pow(management.elfTraining.clothElfTraining.milestones[3].earned.value ? 1.1 : 1) ), - orange2: computed(() => Decimal.add(dyes.orange.amount.value, 1).log2().plus(1).pow(oil.row3Upgrades[1].bought.value ? 2.5 : 1)), + orange2: computed(() => + Decimal.add(dyes.orange.amount.value, 1) + .log2() + .plus(1) + .pow(oil.row3Upgrades[1].bought.value ? 2.5 : 1) + ), green1: computed(() => Decimal.pow(2, Decimal.add(dyes.green.amount.value, 1).log2().sqrt()) .pow(upgrades.coalUpg.bought.value ? 1.2 : 1) @@ -742,6 +758,12 @@ const layer = createLayer(id, function (this: BaseLayer) { ), "Sum of Dyes" ); + const secondaryDyeSum = computed(() => + [dyes.orange, dyes.green, dyes.purple].reduce( + (acc, curr) => acc.add(curr.amount.value), + new Decimal(0) + ) + ); const { total: totalDyeSum, trackerDisplay } = setUpDailyProgressTracker({ resource: dyeSum, @@ -764,6 +786,7 @@ const layer = createLayer(id, function (this: BaseLayer) { dyeSum, boosts, totalDyeSum, + secondaryDyeSum, minWidth: 700, generalTabCollapsed, upgrades, diff --git a/src/data/layers/oil.tsx b/src/data/layers/oil.tsx index dd37b69..a3a7f0c 100644 --- a/src/data/layers/oil.tsx +++ b/src/data/layers/oil.tsx @@ -741,7 +741,7 @@ const layer = createLayer(id, function (this: BaseLayer) { cost: 1e13, display: { title: "Dye Synergy I", - description: "Red dye boosts yellow dye gain *(log(x)^0.75)" + description: "Red dye boosts yellow dye gain by (log(x)^0.75)" }, visibility: () => showIf(management.elfTraining.oilElfTraining.milestones[4].earned.value), @@ -762,8 +762,13 @@ const layer = createLayer(id, function (this: BaseLayer) { resource: noPersist(oil), cost: 1e15, display: { - title: "Colorful Focus", - description: "Sum of secondary dyes increases max focus multiplier by cbrt(x)" + title: "Colorful Plastic", + description: jsx(() => ( + <> + Sum of secondary dyes increases plastic gain by 3 + x + + )) }, visibility: () => showIf(management.elfTraining.oilElfTraining.milestones[4].earned.value), @@ -774,7 +779,7 @@ const layer = createLayer(id, function (this: BaseLayer) { cost: 1e16, display: { title: "Dye Synergy II", - description: "Blue dye boosts red dye gain *log(x)" + description: "Blue dye boosts red dye gain by log(x)" }, visibility: () => showIf(management.elfTraining.oilElfTraining.milestones[4].earned.value), diff --git a/src/data/layers/paper.tsx b/src/data/layers/paper.tsx index f18d412..162108e 100644 --- a/src/data/layers/paper.tsx +++ b/src/data/layers/paper.tsx @@ -6,7 +6,7 @@ import Spacer from "components/layout/Spacer.vue"; import Modal from "components/Modal.vue"; import { createCollapsibleModifierSections, setUpDailyProgressTracker } from "data/common"; import { main } from "data/projEntry"; -import { BuyableOptions, createBuyable, GenericBuyable } from "features/buyable"; +import { BuyableOptions, createBuyable } from "features/buyable"; import { createClickable } from "features/clickables/clickable"; import { createCumulativeConversion, createPolynomialScaling } from "features/conversion"; import { jsx, showIf } from "features/feature"; @@ -19,15 +19,15 @@ import { createMultiplicativeModifier, createSequentialModifier, Modifier } from import { noPersist } from "game/persistence"; import Decimal, { DecimalSource, format, formatSmall, formatWhole } from "util/bignum"; import { WithRequired } from "util/common"; -import { render, renderCol, renderGrid, renderRow } from "util/vue"; +import { render, renderCol, renderGrid } from "util/vue"; import { computed, ComputedRef, ref, unref } from "vue"; import cloth from "./cloth"; import coal from "./coal"; +import dyes from "./dyes"; import elves, { ElfBuyable } from "./elves"; +import management from "./management"; import plastic from "./plastic"; import trees from "./trees"; -import dyes from "./dyes"; -import management from "./management"; import workshop from "./workshop"; import wrappingPaper from "./wrapping-paper"; @@ -360,17 +360,17 @@ const layer = createLayer(id, function (this: BaseLayer) { description: "Books are less expensive" } })); - const classroomUpgrade = createUpgrade(() => ({ + const treeUpgrade = createUpgrade(() => ({ resource: noPersist(paper), cost: 1e40, visibility: () => showIf(management.elfTraining.heavyDrillElfTraining.milestones[4].earned.value), display: { - title: "Classroom Supplies", - description: "Classrooms' effect is raised to the 1.1" + title: "Un-Processing", + description: "Log gain is raised to the ^1.05" } })); - const upgrades2 = { ashUpgrade, bookUpgrade, classroomUpgrade }; + const upgrades2 = { ashUpgrade, bookUpgrade, treeUpgrade }; const paperGain = createSequentialModifier(() => [ createMultiplicativeModifier(() => ({ multiplier: 2, diff --git a/src/data/layers/plastic.tsx b/src/data/layers/plastic.tsx index f6131cf..b201a1a 100644 --- a/src/data/layers/plastic.tsx +++ b/src/data/layers/plastic.tsx @@ -281,6 +281,11 @@ const layer = createLayer(id, function (this: BaseLayer) { multiplier: () => Decimal.add(oil.buildExtractor.amount.value, 1).pow(1.25), description: "Snowball Level 4", enabled: management.elfTraining.kilnElfTraining.milestones[3].earned + })), + createMultiplicativeModifier(() => ({ + multiplier: () => Decimal.add(dyes.secondaryDyeSum.value, 1).cbrt(), + description: "Colorful Plastic", + enabled: oil.row3Upgrades[2].bought })) ]); const computedPlasticGain = computed(() => plasticGain.apply(0)); diff --git a/src/data/layers/trees.tsx b/src/data/layers/trees.tsx index 312adbf..49193c9 100644 --- a/src/data/layers/trees.tsx +++ b/src/data/layers/trees.tsx @@ -532,6 +532,11 @@ const layer = createLayer(id, function (this: BaseLayer) { exponent: 1.2, description: "100% Foundation Completed", enabled: workshop.milestones.logGainMilestone3.earned + })), + createExponentialModifier(() => ({ + exponent: 1.05, + description: "Un-Processing", + enabled: paper.upgrades2.treeUpgrade.bought })) ]); From ccca7d72bf6f1db14667f97f123cd1f2cba1b72a Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Thu, 15 Dec 2022 01:12:45 -0600 Subject: [PATCH 11/21] Disable auto-saving while between days --- src/components/Options.vue | 16 ++++++++++++---- src/data/projEntry.tsx | 2 ++ src/util/save.ts | 11 +++++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/components/Options.vue b/src/components/Options.vue index f61e2b6..0be178a 100644 --- a/src/components/Options.vue +++ b/src/components/Options.vue @@ -13,10 +13,13 @@