Implemented buyables

This commit is contained in:
thepaperpilot 2022-11-30 23:33:23 -06:00
parent 22cf0ade3b
commit d258d0cfbe
3 changed files with 75 additions and 23 deletions

View file

@ -19,16 +19,27 @@
<component :is="tab" :index="index" v-else /> <component :is="tab" :index="index" v-else />
</div> </div>
</div> </div>
<Modal
:model-value="main.loreBody.value !== ''"
@update:model-value="() => (main.loreBody.value = '')"
>
<template v-slot:header
><h2>{{ main.loreTitle.value }}</h2></template
>
<template v-slot:body>{{ main.loreBody.value }}</template>
</Modal>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { main } from "data/projEntry";
import projInfo from "data/projInfo.json"; import projInfo from "data/projInfo.json";
import type { GenericLayer } from "game/layers"; import type { GenericLayer } from "game/layers";
import { layers } from "game/layers"; import { layers } from "game/layers";
import player from "game/player"; import player from "game/player";
import { computed, toRef, unref } from "vue"; import { computed, toRef, unref } from "vue";
import Layer from "./Layer.vue"; import Layer from "./Layer.vue";
import Modal from "./Modal.vue";
import Nav from "./Nav.vue"; import Nav from "./Nav.vue";
const tabs = toRef(player, "tabs"); const tabs = toRef(player, "tabs");

View file

@ -5,6 +5,7 @@
import Spacer from "components/layout/Spacer.vue"; import Spacer from "components/layout/Spacer.vue";
import { main } from "data/projEntry"; import { main } from "data/projEntry";
import { createBar } from "features/bars/bar"; import { createBar } from "features/bars/bar";
import { createBuyable } from "features/buyable";
import { createClickable } from "features/clickables/clickable"; import { createClickable } from "features/clickables/clickable";
import { jsx, showIf } from "features/feature"; import { jsx, showIf } from "features/feature";
import MainDisplay from "features/resources/MainDisplay.vue"; import MainDisplay from "features/resources/MainDisplay.vue";
@ -21,6 +22,7 @@ import {
createSequentialModifier createSequentialModifier
} from "game/modifiers"; } from "game/modifiers";
import { persistent } from "game/persistence"; import { persistent } from "game/persistence";
import player from "game/player";
import Decimal, { DecimalSource, format, formatWhole } from "util/bignum"; import Decimal, { DecimalSource, format, formatWhole } from "util/bignum";
import { Direction } from "util/common"; import { Direction } from "util/common";
import { joinJSX, render, renderRow } from "util/vue"; import { joinJSX, render, renderRow } from "util/vue";
@ -139,6 +141,44 @@ const layer = createLayer(id, function (this: BaseLayer) {
researchUpgrade2 researchUpgrade2
]; ];
const autoCuttingBuyable1 = createBuyable(() => ({
resource: logs,
cost() {
return Decimal.times(100, this.amount.value).add(200);
},
display: {
title: "Generic Cutters",
description: "Each cutter cuts down 1 tree/s"
},
visibility: () => showIf(researchUpgrade2.bought.value)
}));
const autoPlantingBuyable1 = createBuyable(() => ({
resource: logs,
cost() {
return Decimal.times(100, this.amount.value).add(200);
},
display: {
title: "Generic Planters",
description: "Each planter plants 0.5 trees/s"
},
visibility: () => showIf(researchUpgrade2.bought.value)
}));
const expandingForestBuyable = createBuyable(() => ({
resource: logs,
cost() {
return Decimal.pow(Decimal.add(this.amount.value, 1), 1.5).times(500);
},
display: {
title: "Expand Forest",
description: "Add 10 trees to the forest"
},
visibility: () => showIf(researchUpgrade2.bought.value),
onPurchase() {
trees.value = Decimal.add(trees.value, 10);
}
}));
const row1Buyables = [autoCuttingBuyable1, autoPlantingBuyable1, expandingForestBuyable];
const manualCuttingAmount = createSequentialModifier(() => [ const manualCuttingAmount = createSequentialModifier(() => [
createAdditiveModifier(() => ({ createAdditiveModifier(() => ({
addend: 1, addend: 1,
@ -166,6 +206,11 @@ const layer = createLayer(id, function (this: BaseLayer) {
addend: 1, addend: 1,
description: "Automated Knives", description: "Automated Knives",
enabled: autoCutUpgrade1.bought enabled: autoCutUpgrade1.bought
})),
createAdditiveModifier(() => ({
addend: autoCuttingBuyable1.amount,
description: "Generic Cutters",
enabled: researchUpgrade2.bought
})) }))
]); ]);
const computedAutoCuttingAmount = computed(() => autoCuttingAmount.apply(0)); const computedAutoCuttingAmount = computed(() => autoCuttingAmount.apply(0));
@ -197,6 +242,11 @@ const layer = createLayer(id, function (this: BaseLayer) {
addend: 1, addend: 1,
description: "Automated Spade", description: "Automated Spade",
enabled: autoPlantUpgrade1.bought enabled: autoPlantUpgrade1.bought
})),
createAdditiveModifier(() => ({
addend: () => Decimal.div(autoPlantingBuyable1.amount.value, 2),
description: "Generic Planters",
enabled: researchUpgrade2.bought
})) }))
]); ]);
const computedAutoPlantingAmount = computed(() => autoPlantingAmount.apply(0)); const computedAutoPlantingAmount = computed(() => autoPlantingAmount.apply(0));
@ -229,7 +279,7 @@ const layer = createLayer(id, function (this: BaseLayer) {
title: "Cut trees", title: "Cut trees",
description: jsx(() => ( description: jsx(() => (
<> <>
Cut down up to {formatWhole(computedManualCuttingAmount.value)} tree Cut down up to {format(computedManualCuttingAmount.value, 1)} tree
{Decimal.eq(computedManualCuttingAmount.value, 1) ? "" : "s"} at once! {Decimal.eq(computedManualCuttingAmount.value, 1) ? "" : "s"} at once!
<br /> <br />
{render(manualCutProgressBar)} {render(manualCutProgressBar)}
@ -291,7 +341,7 @@ const layer = createLayer(id, function (this: BaseLayer) {
title: "Plant trees", title: "Plant trees",
description: jsx(() => ( description: jsx(() => (
<> <>
Plant up to {formatWhole(computedManualPlantingAmount.value)} tree Plant up to {format(computedManualPlantingAmount.value, 1)} tree
{Decimal.eq(computedManualPlantingAmount.value, 1) ? "" : "s"} at once! {Decimal.eq(computedManualPlantingAmount.value, 1) ? "" : "s"} at once!
<br /> <br />
{render(manualPlantProgressBar)} {render(manualPlantProgressBar)}
@ -337,15 +387,6 @@ const layer = createLayer(id, function (this: BaseLayer) {
style: "width: 400px; text-align: left" style: "width: 400px; text-align: left"
}); });
watchEffect(() => {
if (main.day.value === 1 && Decimal.gte(totalLogs.value, 1e6)) {
main.loreTitle.value = "Day complete!";
main.loreBody.value =
"Santa looks at all the wood you've gathered and tells you you've done well! He says you should take the rest of the day off so you're refreshed for tomorrow's work. Good Job!";
main.day.value = 2;
}
});
globalBus.on("update", diff => { globalBus.on("update", diff => {
if (Decimal.lt(main.day.value, 1)) { if (Decimal.lt(main.day.value, 1)) {
return; return;
@ -384,6 +425,16 @@ const layer = createLayer(id, function (this: BaseLayer) {
saplings.value = Decimal.sub(saplings.value, amountPlanted); saplings.value = Decimal.sub(saplings.value, amountPlanted);
}); });
watchEffect(() => {
if (main.day.value === 1 && Decimal.gte(totalLogs.value, 1e4)) {
main.loreTitle.value = "Day complete!";
main.loreBody.value =
"Santa looks at all the wood you've gathered and tells you you've done well! He says you should take the rest of the day off so you're refreshed for tomorrow's work. Good Job!";
main.day.value = 2;
main.minimized.value = false;
}
});
return { return {
name, name,
color, color,
@ -395,6 +446,7 @@ const layer = createLayer(id, function (this: BaseLayer) {
plantTree, plantTree,
row1Upgrades, row1Upgrades,
row2Upgrades, row2Upgrades,
row1Buyables,
manualCutProgress, manualCutProgress,
manualPlantProgress, manualPlantProgress,
minWidth: 700, minWidth: 700,
@ -444,6 +496,7 @@ const layer = createLayer(id, function (this: BaseLayer) {
<Spacer /> <Spacer />
{renderRow(...row1Upgrades)} {renderRow(...row1Upgrades)}
{renderRow(...row2Upgrades)} {renderRow(...row2Upgrades)}
{renderRow(...row1Buyables)}
</> </>
)) ))
}; };

View file

@ -255,17 +255,6 @@ export const main = createLayer("main", function (this: BaseLayer) {
})) }))
]; ];
const loreModal = jsx(() => (
<Modal
modelValue={loreBody.value !== ""}
onUpdate:modelValue={() => (loreBody.value = "")}
v-slots={{
header: () => <h2>{loreTitle.value}</h2>,
body: () => loreBody.value
}}
/>
));
return { return {
name: "Calendar", name: "Calendar",
days, days,
@ -297,7 +286,6 @@ export const main = createLayer("main", function (this: BaseLayer) {
) )
.map(days => renderRow(...days))} .map(days => renderRow(...days))}
</div> </div>
{render(loreModal)}
</> </>
)) ))
}; };