Implemented day 14

This commit is contained in:
thepaperpilot 2022-12-15 00:52:01 -06:00
parent f48ae55cec
commit 36f78951b5
4 changed files with 346 additions and 24 deletions

View file

@ -7,6 +7,12 @@
style="left: 4%; bottom: 3%; width: 40px; height: 40px"
/>
<img v-if="day >= 0" :src="tree" class="scene-item" style="left: 10%; bottom: 10%" />
<img
v-if="day >= 13"
:src="letters"
class="scene-item"
style="left: 26%; bottom: 12%; width: 40px; height: 40px"
/>
<img
v-if="day >= 12"
:src="advManagement"
@ -68,6 +74,7 @@ import plastic from "./symbols/plastic.png";
import dyes from "./symbols/dyes.png";
import management from "./symbols/elfManagement.png";
import advManagement from "./symbols/workshopMansion.png";
import letters from "./symbols/letterbox.png";
defineProps<{
day: number;

292
src/data/layers/letters.tsx Normal file
View file

@ -0,0 +1,292 @@
import Spacer from "components/layout/Spacer.vue";
import Modal from "components/Modal.vue";
import MainDisplay from "features/resources/MainDisplay.vue";
import Sqrt from "components/math/Sqrt.vue";
import {
createCollapsibleMilestones,
createCollapsibleModifierSections,
setUpDailyProgressTracker
} from "data/common";
import { createBar } from "features/bars/bar";
import { createClickable } from "features/clickables/clickable";
import { jsx, showIf } from "features/feature";
import { createMilestone } from "features/milestones/milestone";
import { createResource } from "features/resources/resource";
import { BaseLayer, createLayer } from "game/layers";
import { createMultiplicativeModifier, createSequentialModifier } from "game/modifiers";
import { persistent } from "game/persistence";
import Decimal, { DecimalSource, format, formatWhole } from "util/bignum";
import { Direction } from "util/common";
import { render, renderRow } from "util/vue";
import { computed, ref } from "vue";
import { createBuyable, GenericBuyable } from "features/buyable";
import metal from "./metal";
import plastic from "./plastic";
import paper from "./paper";
import SqrtVue from "components/math/Sqrt.vue";
import { globalBus } from "game/events";
import { main } from "data/projEntry";
const id = "letters";
const day = 14;
const layer = createLayer(id, function (this: BaseLayer) {
const name = "Letters";
const color = "antiquewhite";
const letters = createResource<DecimalSource>(0, "letters processed");
const processingProgress = persistent<DecimalSource>(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
<br />
{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 <SqrtVue>Blue Dye</SqrtVue> 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{" "}
<Sqrt>amount</Sqrt>
</>
))
},
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(() => (
<Modal
modelValue={showModifiersModal.value}
onUpdate:modelValue={(value: boolean) => (showModifiersModal.value = value)}
v-slots={{
header: () => <h2>{name} Modifiers</h2>,
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)}
<Spacer />
<MainDisplay resource={letters} color={color} />
{render(process)}
<div>
The more letters you process, the more you'll improve at processing letters.
</div>
<div>Currently: {format(synergy.value)}x</div>
<Spacer />
{renderRow(...Object.values(buyables))}
<Spacer />
{milestonesDisplay()}
</>
)),
minimizedDisplay: jsx(() => (
<div>
{name} - {format(letters.value)} {letters.displayName}
</div>
))
};
});
export default layer;

View file

@ -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)));

View file

@ -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
];
/**