forked from profectus/Profectus
Replaced demo mod with placeholder mod
This commit is contained in:
parent
12438b67b3
commit
da44b8c4c3
8 changed files with 68 additions and 3691 deletions
|
@ -1,135 +0,0 @@
|
||||||
import Row from "@/components/layout/Row.vue";
|
|
||||||
import Tooltip from "@/components/Tooltip.vue";
|
|
||||||
import { main } from "@/data/mod";
|
|
||||||
import { createAchievement } from "@/features/achievements/achievement";
|
|
||||||
import { jsx } from "@/features/feature";
|
|
||||||
import { createGrid } from "@/features/grids/grid";
|
|
||||||
import { createResource } from "@/features/resources/resource";
|
|
||||||
import { createTreeNode } from "@/features/trees/tree";
|
|
||||||
import { createLayer } from "@/game/layers";
|
|
||||||
import { DecimalSource } from "@/lib/break_eternity";
|
|
||||||
import Decimal from "@/util/bignum";
|
|
||||||
import { render, renderRow } from "@/util/vue";
|
|
||||||
import { computed } from "vue";
|
|
||||||
import f from "./f";
|
|
||||||
|
|
||||||
const layer = createLayer(() => {
|
|
||||||
const id = "a";
|
|
||||||
const color = "yellow";
|
|
||||||
const name = "Achievements";
|
|
||||||
const points = createResource<DecimalSource>(0, "achievement power");
|
|
||||||
|
|
||||||
const treeNode = createTreeNode(() => ({
|
|
||||||
display: "A",
|
|
||||||
color,
|
|
||||||
tooltip: {
|
|
||||||
display: "Achievements",
|
|
||||||
right: true
|
|
||||||
},
|
|
||||||
onClick() {
|
|
||||||
main.showAchievements();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const ach1 = createAchievement(() => ({
|
|
||||||
image: "https://unsoftcapped2.github.io/The-Modding-Tree-2/discord.png",
|
|
||||||
display: "Get me!",
|
|
||||||
tooltip: computed(() => {
|
|
||||||
if (ach1.earned.value) {
|
|
||||||
return "You did it!";
|
|
||||||
}
|
|
||||||
return "How did this happen?";
|
|
||||||
}),
|
|
||||||
shouldEarn: true
|
|
||||||
}));
|
|
||||||
const ach2 = createAchievement(() => ({
|
|
||||||
display: "Impossible!",
|
|
||||||
tooltip: computed(() => {
|
|
||||||
if (ach2.earned.value) {
|
|
||||||
return "HOW????";
|
|
||||||
}
|
|
||||||
return "Mwahahaha!";
|
|
||||||
}),
|
|
||||||
style: { color: "#04e050" }
|
|
||||||
}));
|
|
||||||
const ach3 = createAchievement(() => ({
|
|
||||||
display: "EIEIO",
|
|
||||||
tooltip:
|
|
||||||
"Get a farm point.\n\nReward: The dinosaur is now your friend (you can max Farm Points).",
|
|
||||||
shouldEarn: function () {
|
|
||||||
return Decimal.gte(f.points.value, 1);
|
|
||||||
},
|
|
||||||
onComplete() {
|
|
||||||
console.log("Bork bork bork!");
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const achievements = [ach1, ach2, ach3];
|
|
||||||
|
|
||||||
const grid = createGrid(() => ({
|
|
||||||
rows: 2,
|
|
||||||
cols: 2,
|
|
||||||
getStartState(id) {
|
|
||||||
return id;
|
|
||||||
},
|
|
||||||
getStyle(id, state) {
|
|
||||||
return { backgroundColor: `#${(Number(state) * 1234) % 999999}` };
|
|
||||||
},
|
|
||||||
// TODO display should return an object
|
|
||||||
getTitle(id) {
|
|
||||||
let direction = "";
|
|
||||||
if (id === "101") {
|
|
||||||
direction = "top";
|
|
||||||
} else if (id === "102") {
|
|
||||||
direction = "bottom";
|
|
||||||
} else if (id === "201") {
|
|
||||||
direction = "left";
|
|
||||||
} else if (id === "202") {
|
|
||||||
direction = "right";
|
|
||||||
}
|
|
||||||
return jsx(() => (
|
|
||||||
<Tooltip display={JSON.stringify(this.cells[id].style)} {...{ [direction]: true }}>
|
|
||||||
<h3>Gridable #{id}</h3>
|
|
||||||
</Tooltip>
|
|
||||||
));
|
|
||||||
},
|
|
||||||
getDisplay(id, state) {
|
|
||||||
return String(state);
|
|
||||||
},
|
|
||||||
getCanClick() {
|
|
||||||
return Decimal.eq(main.points.value, 10);
|
|
||||||
},
|
|
||||||
onClick(id, state) {
|
|
||||||
this.cells[id].state = Number(state) + 1;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const display = jsx(() => (
|
|
||||||
<>
|
|
||||||
<Row>
|
|
||||||
<Tooltip display={ach1.tooltip} bottom>
|
|
||||||
{render(ach1)}
|
|
||||||
</Tooltip>
|
|
||||||
<Tooltip display={ach2.tooltip} bottom>
|
|
||||||
{render(ach2)}
|
|
||||||
</Tooltip>
|
|
||||||
<Tooltip display={ach3.tooltip} bottom>
|
|
||||||
{render(ach3)}
|
|
||||||
</Tooltip>
|
|
||||||
</Row>
|
|
||||||
{renderRow(grid)}
|
|
||||||
</>
|
|
||||||
));
|
|
||||||
|
|
||||||
return {
|
|
||||||
id,
|
|
||||||
color,
|
|
||||||
name,
|
|
||||||
points,
|
|
||||||
achievements,
|
|
||||||
grid,
|
|
||||||
treeNode,
|
|
||||||
display
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
export default layer;
|
|
|
@ -1,686 +0,0 @@
|
||||||
import Slider from "@/components/fields/Slider.vue";
|
|
||||||
import Text from "@/components/fields/Text.vue";
|
|
||||||
import Toggle from "@/components/fields/Toggle.vue";
|
|
||||||
import Column from "@/components/layout/Column.vue";
|
|
||||||
import Row from "@/components/layout/Row.vue";
|
|
||||||
import Spacer from "@/components/layout/Spacer.vue";
|
|
||||||
import Sticky from "@/components/layout/Sticky.vue";
|
|
||||||
import VerticalRule from "@/components/layout/VerticalRule.vue";
|
|
||||||
import Modal from "@/components/Modal.vue";
|
|
||||||
import { createLayerTreeNode, createResetButton } from "@/data/common";
|
|
||||||
import { main } from "@/data/mod";
|
|
||||||
import themes from "@/data/themes";
|
|
||||||
import { createBar, Direction } from "@/features/bars/bar";
|
|
||||||
import { createBuyable } from "@/features/buyable";
|
|
||||||
import { createChallenge } from "@/features/challenges/challenge";
|
|
||||||
import { createClickable } from "@/features/clickables/clickable";
|
|
||||||
import {
|
|
||||||
addSoftcap,
|
|
||||||
createCumulativeConversion,
|
|
||||||
createExponentialScaling
|
|
||||||
} from "@/features/conversion";
|
|
||||||
import { jsx, showIf, Visibility } from "@/features/feature";
|
|
||||||
import { createHotkey } from "@/features/hotkey";
|
|
||||||
import { createInfobox } from "@/features/infoboxes/infobox";
|
|
||||||
import { createMilestone } from "@/features/milestones/milestone";
|
|
||||||
import { createReset } from "@/features/reset";
|
|
||||||
import MainDisplay from "@/features/resources/MainDisplay.vue";
|
|
||||||
import { createResource, displayResource, trackBest } from "@/features/resources/resource";
|
|
||||||
import Resource from "@/features/resources/Resource.vue";
|
|
||||||
import { createTab } from "@/features/tabs/tab";
|
|
||||||
import { createTabFamily } from "@/features/tabs/tabFamily";
|
|
||||||
import { createTree, createTreeNode, GenericTreeNode, TreeBranch } from "@/features/trees/tree";
|
|
||||||
import { createUpgrade } from "@/features/upgrades/upgrade";
|
|
||||||
import { createLayer } from "@/game/layers";
|
|
||||||
import { persistent } from "@/game/persistence";
|
|
||||||
import settings from "@/game/settings";
|
|
||||||
import { DecimalSource } from "@/lib/break_eternity";
|
|
||||||
import Decimal, { format, formatWhole } from "@/util/bignum";
|
|
||||||
import { render, renderCol, renderRow } from "@/util/vue";
|
|
||||||
import { computed, ComputedRef, ref } from "vue";
|
|
||||||
import f from "./f";
|
|
||||||
|
|
||||||
const layer = createLayer(() => {
|
|
||||||
const id = "c";
|
|
||||||
const color = "#4BDC13";
|
|
||||||
const name = "Candies";
|
|
||||||
const points = createResource<DecimalSource>(0, "lollipops");
|
|
||||||
const best = trackBest(points);
|
|
||||||
const beep = persistent<boolean>(false);
|
|
||||||
const thingy = persistent<string>("pointy");
|
|
||||||
const otherThingy = persistent<number>(10);
|
|
||||||
const spentOnBuyables = persistent(new Decimal(10));
|
|
||||||
|
|
||||||
const waffleBoost = computed(() => Decimal.pow(points.value, 0.2));
|
|
||||||
const icecreamCap = computed(() => Decimal.times(points.value, 10));
|
|
||||||
|
|
||||||
const coolInfo = createInfobox(() => ({
|
|
||||||
title: "Lore",
|
|
||||||
titleStyle: { color: "#FE0000" },
|
|
||||||
display: "DEEP LORE!",
|
|
||||||
bodyStyle: { backgroundColor: "#0000EE" },
|
|
||||||
color: "rgb(75, 220, 19)"
|
|
||||||
}));
|
|
||||||
|
|
||||||
const lollipopMilestone3 = createMilestone(() => ({
|
|
||||||
shouldEarn() {
|
|
||||||
return Decimal.gte(best.value, 3);
|
|
||||||
},
|
|
||||||
display: {
|
|
||||||
requirement: "3 Lollipops",
|
|
||||||
effectDisplay: "Unlock the next milestone"
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const lollipopMilestone4 = createMilestone(() => ({
|
|
||||||
visibility() {
|
|
||||||
return showIf(lollipopMilestone3.earned.value);
|
|
||||||
},
|
|
||||||
shouldEarn() {
|
|
||||||
return Decimal.gte(best.value, 4);
|
|
||||||
},
|
|
||||||
display: {
|
|
||||||
requirement: "4 Lollipops",
|
|
||||||
effectDisplay: "You can toggle beep and boop (which do nothing)",
|
|
||||||
optionsDisplay: jsx(() => (
|
|
||||||
<>
|
|
||||||
<Toggle
|
|
||||||
title="beep"
|
|
||||||
onUpdate:modelValue={value => (beep.value = value)}
|
|
||||||
modelValue={beep.value}
|
|
||||||
/>
|
|
||||||
<Toggle
|
|
||||||
title="boop"
|
|
||||||
onUpdate:modelValue={value => (f.boop.value = value)}
|
|
||||||
modelValue={f.boop.value}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
))
|
|
||||||
},
|
|
||||||
style() {
|
|
||||||
if (this.earned) {
|
|
||||||
return { backgroundColor: "#1111DD" };
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const lollipopMilestones = [lollipopMilestone3, lollipopMilestone4];
|
|
||||||
|
|
||||||
const funChallenge = createChallenge(() => ({
|
|
||||||
title: "Fun",
|
|
||||||
completionLimit: 3,
|
|
||||||
display() {
|
|
||||||
return {
|
|
||||||
description: `Makes the game 0% harder<br>${formatWhole(this.completions.value)}/${
|
|
||||||
this.completionLimit
|
|
||||||
} completions`,
|
|
||||||
goal: "Have 20 points I guess",
|
|
||||||
reward: "Says hi",
|
|
||||||
effectDisplay: format(funEffect.value) + "x"
|
|
||||||
};
|
|
||||||
},
|
|
||||||
visibility() {
|
|
||||||
return showIf(Decimal.gt(best.value, 0));
|
|
||||||
},
|
|
||||||
goal: 20,
|
|
||||||
resource: main.points,
|
|
||||||
onComplete() {
|
|
||||||
console.log("hiii");
|
|
||||||
},
|
|
||||||
onEnter() {
|
|
||||||
main.points.value = 0;
|
|
||||||
main.best.value = main.points.value;
|
|
||||||
main.total.value = main.points.value;
|
|
||||||
console.log("So challenging");
|
|
||||||
},
|
|
||||||
onExit() {
|
|
||||||
console.log("Sweet freedom!");
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
height: "200px"
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const funEffect = computed(() => Decimal.add(points.value, 1).tetrate(0.02));
|
|
||||||
|
|
||||||
const generatorUpgrade = createUpgrade(() => ({
|
|
||||||
display: {
|
|
||||||
title: "Generator of Genericness",
|
|
||||||
description: "Gain 1 point every second"
|
|
||||||
},
|
|
||||||
cost: 1,
|
|
||||||
resource: points
|
|
||||||
}));
|
|
||||||
const lollipopMultiplierUpgrade = createUpgrade(() => ({
|
|
||||||
display: () => ({
|
|
||||||
description: "Point generation is faster based on your unspent Lollipops",
|
|
||||||
effectDisplay: `${format(lollipopMultiplierEffect.value)}x`
|
|
||||||
}),
|
|
||||||
cost: 1,
|
|
||||||
resource: points,
|
|
||||||
visibility: () => showIf(generatorUpgrade.bought.value)
|
|
||||||
}));
|
|
||||||
const lollipopMultiplierEffect = computed(() => {
|
|
||||||
let ret = Decimal.add(points.value, 1).pow(0.5);
|
|
||||||
if (ret.gte("1e20000000")) ret = ret.sqrt().times("1e10000000");
|
|
||||||
return ret;
|
|
||||||
});
|
|
||||||
const unlockIlluminatiUpgrade = createUpgrade(() => ({
|
|
||||||
visibility() {
|
|
||||||
return showIf(lollipopMultiplierUpgrade.bought.value);
|
|
||||||
},
|
|
||||||
canAfford() {
|
|
||||||
return Decimal.lt(main.points.value, 7);
|
|
||||||
},
|
|
||||||
onPurchase() {
|
|
||||||
main.points.value = Decimal.add(main.points.value, 7);
|
|
||||||
},
|
|
||||||
display:
|
|
||||||
"Only buyable with less than 7 points, and gives you 7 more. Unlocks a secret subtab.",
|
|
||||||
style() {
|
|
||||||
if (this.bought) {
|
|
||||||
return { backgroundColor: "#1111dd" };
|
|
||||||
}
|
|
||||||
if (!this.canAfford) {
|
|
||||||
return { backgroundColor: "#dd1111" };
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const quasiUpgrade = createUpgrade(() => ({
|
|
||||||
resource: createResource(exhancers.amount, "Exhancers", 0),
|
|
||||||
cost: 3,
|
|
||||||
display: {
|
|
||||||
title: "This upgrade doesn't exist",
|
|
||||||
description: "Or does it?"
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const upgrades = [generatorUpgrade, lollipopMultiplierUpgrade, unlockIlluminatiUpgrade];
|
|
||||||
|
|
||||||
const exhancers = createBuyable(() => ({
|
|
||||||
resource: points,
|
|
||||||
cost() {
|
|
||||||
let x = new Decimal(this.amount.value);
|
|
||||||
if (x.gte(25)) {
|
|
||||||
x = x.pow(2).div(25);
|
|
||||||
}
|
|
||||||
const cost = Decimal.pow(2, x.pow(1.5));
|
|
||||||
return cost.floor();
|
|
||||||
},
|
|
||||||
display() {
|
|
||||||
return {
|
|
||||||
title: "Exhancers",
|
|
||||||
description: `Adds ${format(
|
|
||||||
thingEffect.value
|
|
||||||
)} things and multiplies stuff by ${format(stuffEffect.value)}.`
|
|
||||||
};
|
|
||||||
},
|
|
||||||
onPurchase(cost) {
|
|
||||||
spentOnBuyables.value = Decimal.add(spentOnBuyables.value, cost);
|
|
||||||
},
|
|
||||||
style: { height: "222px" },
|
|
||||||
purchaseLimit: 4
|
|
||||||
}));
|
|
||||||
// The following need redundant ComputedRef<Decimal> type annotations because otherwise the ts
|
|
||||||
// interpreter thinks exhancers are cyclically referenced
|
|
||||||
const thingEffect: ComputedRef<Decimal> = computed(() => {
|
|
||||||
if (Decimal.gte(exhancers.amount.value, 0)) {
|
|
||||||
return Decimal.pow(25, Decimal.pow(exhancers.amount.value, 1.1));
|
|
||||||
}
|
|
||||||
return Decimal.pow(1 / 25, Decimal.times(exhancers.amount.value, -1).pow(1.1));
|
|
||||||
});
|
|
||||||
const stuffEffect: ComputedRef<Decimal> = computed(() => {
|
|
||||||
if (Decimal.gte(exhancers.amount.value, 0)) {
|
|
||||||
return Decimal.pow(25, Decimal.pow(exhancers.amount.value, 1.1));
|
|
||||||
}
|
|
||||||
return Decimal.pow(1 / 25, Decimal.times(exhancers.amount.value, -1).pow(1.1));
|
|
||||||
});
|
|
||||||
const confirmRespec = persistent<boolean>(false);
|
|
||||||
const confirming = ref(false);
|
|
||||||
const respecBuyables = createClickable(() => ({
|
|
||||||
small: true,
|
|
||||||
display: "Respec Thingies",
|
|
||||||
onClick() {
|
|
||||||
if (confirmRespec.value && !confirming.value) {
|
|
||||||
confirming.value = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
points.value = Decimal.add(points.value, spentOnBuyables.value);
|
|
||||||
exhancers.amount.value = 0;
|
|
||||||
main.tree.reset(treeNode);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const sellExhancer = createClickable(() => ({
|
|
||||||
small: true,
|
|
||||||
display: "Sell One",
|
|
||||||
onClick() {
|
|
||||||
if (Decimal.lte(exhancers.amount.value, 0)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
exhancers.amount.value = Decimal.sub(exhancers.amount.value, 1);
|
|
||||||
points.value = Decimal.add(points.value, exhancers.cost.value);
|
|
||||||
spentOnBuyables.value = Decimal.sub(spentOnBuyables.value, exhancers.cost.value);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const buyablesDisplay = jsx(() => (
|
|
||||||
<Column>
|
|
||||||
<Row>
|
|
||||||
<Toggle
|
|
||||||
title="Confirm"
|
|
||||||
onUpdate:modelValue={value => (confirmRespec.value = value)}
|
|
||||||
modelValue={confirmRespec.value}
|
|
||||||
/>
|
|
||||||
{renderRow(respecBuyables)}
|
|
||||||
</Row>
|
|
||||||
{renderRow(exhancers)}
|
|
||||||
{renderRow(sellExhancer)}
|
|
||||||
<Modal
|
|
||||||
modelValue={confirming.value}
|
|
||||||
onUpdate:modelValue={value => (confirming.value = value)}
|
|
||||||
v-slots={{
|
|
||||||
header: () => <h2>Confirm Respec</h2>,
|
|
||||||
body: () => <>Are you sure? Respeccing these doesn't accomplish much</>,
|
|
||||||
footer: () => (
|
|
||||||
<div class="modal-default-footer">
|
|
||||||
<div class="modal-default-flex-grow"></div>
|
|
||||||
<button
|
|
||||||
class="button modal-default-button"
|
|
||||||
onClick={() => (confirming.value = false)}
|
|
||||||
>
|
|
||||||
Cancel
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
class="button modal-default-button danger"
|
|
||||||
onClick={() => {
|
|
||||||
respecBuyables.onClick();
|
|
||||||
confirming.value = false;
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Respec
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Column>
|
|
||||||
));
|
|
||||||
|
|
||||||
const longBoi = createBar(() => ({
|
|
||||||
fillStyle: { backgroundColor: "#FFFFFF" },
|
|
||||||
baseStyle: { backgroundColor: "#696969" },
|
|
||||||
textStyle: { color: "#04e050" },
|
|
||||||
direction: Direction.Right,
|
|
||||||
width: 300,
|
|
||||||
height: 30,
|
|
||||||
progress() {
|
|
||||||
return Decimal.add(main.points.value, 1).log(10).div(10).toNumber();
|
|
||||||
},
|
|
||||||
display() {
|
|
||||||
return format(main.points.value) + " / 1e10 points";
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const tallBoi = createBar(() => ({
|
|
||||||
fillStyle: { backgroundColor: "#4BEC13" },
|
|
||||||
baseStyle: { backgroundColor: "#000000" },
|
|
||||||
textStyle: { textShadow: "0px 0px 2px #000000" },
|
|
||||||
borderStyle: { borderWidth: "7px" },
|
|
||||||
direction: Direction.Up,
|
|
||||||
width: 50,
|
|
||||||
height: 200,
|
|
||||||
progress() {
|
|
||||||
return Decimal.div(main.points.value, 100);
|
|
||||||
},
|
|
||||||
display() {
|
|
||||||
return formatWhole(Decimal.div(main.points.value, 1).min(100)) + "%";
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const flatBoi = createBar(() => ({
|
|
||||||
fillStyle: { backgroundColor: "#FE0102" },
|
|
||||||
baseStyle: { backgroundColor: "#222222" },
|
|
||||||
textStyle: { textShadow: "0px 0px 2px #000000" },
|
|
||||||
direction: Direction.Up,
|
|
||||||
width: 100,
|
|
||||||
height: 30,
|
|
||||||
progress() {
|
|
||||||
return Decimal.div(points.value, 50);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const conversion = createCumulativeConversion(() => ({
|
|
||||||
scaling: addSoftcap(createExponentialScaling(10, 5, 0.5), 1e100, 0.5),
|
|
||||||
baseResource: main.points,
|
|
||||||
gainResource: points,
|
|
||||||
roundUpCost: true
|
|
||||||
}));
|
|
||||||
|
|
||||||
const reset = createReset(() => ({
|
|
||||||
thingsToReset: (): Record<string, unknown>[] => [layer]
|
|
||||||
}));
|
|
||||||
|
|
||||||
const hotkeys = [
|
|
||||||
createHotkey(() => ({
|
|
||||||
key: "c",
|
|
||||||
description: "reset for lollipops or whatever",
|
|
||||||
onPress() {
|
|
||||||
if (resetButton.canClick.value) {
|
|
||||||
resetButton.onClick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})),
|
|
||||||
createHotkey(() => ({
|
|
||||||
key: "ctrl+c",
|
|
||||||
description: "respec things",
|
|
||||||
onPress() {
|
|
||||||
respecBuyables.onClick();
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
];
|
|
||||||
|
|
||||||
const treeNode = createLayerTreeNode(() => ({
|
|
||||||
layerID: id,
|
|
||||||
color,
|
|
||||||
reset,
|
|
||||||
mark: "https://unsoftcapped2.github.io/The-Modding-Tree-2/discord.png",
|
|
||||||
tooltip() {
|
|
||||||
let tooltip = displayResource(points);
|
|
||||||
if (Decimal.gt(exhancers.amount.value, 0)) {
|
|
||||||
tooltip += `<br><i><br><br><br>${formatWhole(
|
|
||||||
exhancers.amount.value
|
|
||||||
)} Exhancers</i>`;
|
|
||||||
}
|
|
||||||
return tooltip;
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
color: "#3325CC",
|
|
||||||
textDecoration: "underline"
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const resetButton = createResetButton(() => ({
|
|
||||||
conversion,
|
|
||||||
tree: main.tree,
|
|
||||||
treeNode,
|
|
||||||
style: {
|
|
||||||
color: "#AA66AA"
|
|
||||||
},
|
|
||||||
resetDescription: "Melt your points into "
|
|
||||||
}));
|
|
||||||
|
|
||||||
const g = createTreeNode(() => ({
|
|
||||||
display: "TH",
|
|
||||||
color: "#6d3678",
|
|
||||||
canClick() {
|
|
||||||
return Decimal.gte(main.points.value, 10);
|
|
||||||
},
|
|
||||||
tooltip: "Thanos your points",
|
|
||||||
onClick() {
|
|
||||||
main.points.value = Decimal.div(main.points.value, 2);
|
|
||||||
console.log("Thanos'd");
|
|
||||||
},
|
|
||||||
glowColor() {
|
|
||||||
if (Decimal.eq(exhancers.amount.value, 1)) {
|
|
||||||
return "orange";
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const h = createTreeNode(() => ({
|
|
||||||
display: "h",
|
|
||||||
color() {
|
|
||||||
return themes[settings.theme].variables["--locked"];
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
display: computed(() => `Restore your points to ${format(otherThingy.value)}`),
|
|
||||||
right: true
|
|
||||||
},
|
|
||||||
canClick() {
|
|
||||||
return Decimal.lt(main.points.value, otherThingy.value);
|
|
||||||
},
|
|
||||||
onClick() {
|
|
||||||
main.points.value = otherThingy.value;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
const spook = createTreeNode(() => ({
|
|
||||||
visibility: Visibility.Hidden
|
|
||||||
}));
|
|
||||||
const tree = createTree(() => ({
|
|
||||||
nodes(): GenericTreeNode[][] {
|
|
||||||
return [
|
|
||||||
[f.treeNode, treeNode],
|
|
||||||
[g, spook, h]
|
|
||||||
];
|
|
||||||
},
|
|
||||||
branches(): TreeBranch[] {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
startNode: f.treeNode,
|
|
||||||
endNode: treeNode,
|
|
||||||
"stroke-width": "25px",
|
|
||||||
stroke: "green",
|
|
||||||
style: {
|
|
||||||
filter: "blur(5px)"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ startNode: treeNode, endNode: g },
|
|
||||||
{ startNode: g, endNode: h }
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const illuminatiTabs = createTabFamily(() => ({
|
|
||||||
tabs: {
|
|
||||||
first: {
|
|
||||||
tab: jsx(() => (
|
|
||||||
<>
|
|
||||||
{renderRow(...upgrades)}
|
|
||||||
{renderRow(quasiUpgrade)}
|
|
||||||
<div>confirmed</div>
|
|
||||||
</>
|
|
||||||
)),
|
|
||||||
display: "first"
|
|
||||||
},
|
|
||||||
second: {
|
|
||||||
tab: f.display,
|
|
||||||
display: "second"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
width: "660px",
|
|
||||||
backgroundColor: "brown",
|
|
||||||
"--background": "brown",
|
|
||||||
border: "solid white",
|
|
||||||
marginLeft: "auto",
|
|
||||||
marginRight: "auto"
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const tabs = createTabFamily(() => ({
|
|
||||||
tabs: {
|
|
||||||
mainTab: {
|
|
||||||
tab: createTab(() => ({
|
|
||||||
display: jsx(() => (
|
|
||||||
<>
|
|
||||||
<MainDisplay
|
|
||||||
resource={points}
|
|
||||||
color={color}
|
|
||||||
effectDisplay={`which are boosting waffles by ${format(
|
|
||||||
waffleBoost.value
|
|
||||||
)} and increasing the Ice Cream cap by ${format(
|
|
||||||
icecreamCap.value
|
|
||||||
)}`}
|
|
||||||
/>
|
|
||||||
<Sticky>{render(resetButton)}</Sticky>
|
|
||||||
<Resource resource={points} color={color} />
|
|
||||||
<Spacer height="5px" />
|
|
||||||
<button onClick={() => console.log("yeet")}>'HI'</button>
|
|
||||||
<div>Name your points!</div>
|
|
||||||
<Text
|
|
||||||
modelValue={thingy.value}
|
|
||||||
onUpdate:modelValue={value => (thingy.value = value)}
|
|
||||||
/>
|
|
||||||
<Sticky style="color: red; font-size: 32px; font-family: Comic Sans MS;">
|
|
||||||
I have {displayResource(main.points)} {thingy.value} points!
|
|
||||||
</Sticky>
|
|
||||||
<hr />
|
|
||||||
{renderCol(...lollipopMilestones)}
|
|
||||||
<Spacer />
|
|
||||||
{renderRow(...upgrades)}
|
|
||||||
{renderRow(quasiUpgrade)}
|
|
||||||
{renderRow(funChallenge)}
|
|
||||||
</>
|
|
||||||
))
|
|
||||||
})),
|
|
||||||
display: "main tab",
|
|
||||||
glowColor() {
|
|
||||||
if (
|
|
||||||
generatorUpgrade.canPurchase.value ||
|
|
||||||
lollipopMultiplierUpgrade.canPurchase.value ||
|
|
||||||
unlockIlluminatiUpgrade.canPurchase.value ||
|
|
||||||
funChallenge.canComplete.value
|
|
||||||
) {
|
|
||||||
return "blue";
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
style: { color: "orange" }
|
|
||||||
},
|
|
||||||
thingies: {
|
|
||||||
tab: createTab(() => ({
|
|
||||||
style() {
|
|
||||||
return { backgroundColor: "#222222", "--background": "#222222" };
|
|
||||||
},
|
|
||||||
display: jsx(() => (
|
|
||||||
<>
|
|
||||||
{render(buyablesDisplay)}
|
|
||||||
<Spacer />
|
|
||||||
<Row style="width: 600px; height: 350px; background-color: green; border-style: solid;">
|
|
||||||
<Toggle
|
|
||||||
onUpdate:modelValue={value => (beep.value = value)}
|
|
||||||
modelValue={beep.value}
|
|
||||||
/>
|
|
||||||
<Spacer width="30px" height="10px" />
|
|
||||||
<div>
|
|
||||||
<span>Beep</span>
|
|
||||||
</div>
|
|
||||||
<Spacer />
|
|
||||||
<VerticalRule height="200px" />
|
|
||||||
</Row>
|
|
||||||
<Spacer />
|
|
||||||
<img src="https://unsoftcapped2.github.io/The-Modding-Tree-2/discord.png" />
|
|
||||||
</>
|
|
||||||
))
|
|
||||||
})),
|
|
||||||
glowColor: "white",
|
|
||||||
display: "thingies",
|
|
||||||
style: { borderColor: "orange" }
|
|
||||||
},
|
|
||||||
jail: {
|
|
||||||
tab: createTab(() => ({
|
|
||||||
display: jsx(() => (
|
|
||||||
<>
|
|
||||||
{render(coolInfo)}
|
|
||||||
{render(longBoi)}
|
|
||||||
<Spacer />
|
|
||||||
<Row>
|
|
||||||
<Column style="background-color: #555555; padding: 15px">
|
|
||||||
<div style="color: teal">Sugar level:</div>
|
|
||||||
<Spacer />
|
|
||||||
{render(tallBoi)}
|
|
||||||
</Column>
|
|
||||||
<Spacer />
|
|
||||||
<Column>
|
|
||||||
<div>idk</div>
|
|
||||||
<Spacer width="0" height="50px" />
|
|
||||||
{render(flatBoi)}
|
|
||||||
</Column>
|
|
||||||
</Row>
|
|
||||||
<Spacer />
|
|
||||||
<div>It's jail because "bars"! So funny! Ha ha!</div>
|
|
||||||
{render(tree)}
|
|
||||||
</>
|
|
||||||
))
|
|
||||||
})),
|
|
||||||
display: "jail"
|
|
||||||
},
|
|
||||||
illuminati: {
|
|
||||||
tab: createTab(() => ({
|
|
||||||
display: jsx(() => (
|
|
||||||
// This should really just be <> and </>, however for some reason the
|
|
||||||
// typescript interpreter can't figure out this layer and f.tsx otherwise
|
|
||||||
<div>
|
|
||||||
<h1> C O N F I R M E D </h1>
|
|
||||||
<Spacer />
|
|
||||||
{render(illuminatiTabs)}
|
|
||||||
<div>Adjust how many points H gives you!</div>
|
|
||||||
<Slider
|
|
||||||
onUpdate:modelValue={value => (otherThingy.value = value)}
|
|
||||||
modelValue={otherThingy.value}
|
|
||||||
min={1}
|
|
||||||
max={30}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)),
|
|
||||||
style: {
|
|
||||||
backgroundColor: "#3325CC"
|
|
||||||
}
|
|
||||||
})),
|
|
||||||
visibility() {
|
|
||||||
return showIf(unlockIlluminatiUpgrade.bought.value);
|
|
||||||
},
|
|
||||||
display: "illuminati"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
return {
|
|
||||||
id,
|
|
||||||
color,
|
|
||||||
name,
|
|
||||||
links() {
|
|
||||||
const links = tree.links.value.slice();
|
|
||||||
links.push({
|
|
||||||
startNode: h,
|
|
||||||
endNode: flatBoi,
|
|
||||||
"stroke-width": "5px",
|
|
||||||
stroke: "red",
|
|
||||||
offsetEnd: { x: -50 + 100 * flatBoi.progress.value.toNumber(), y: 0 }
|
|
||||||
});
|
|
||||||
return links;
|
|
||||||
},
|
|
||||||
points,
|
|
||||||
best,
|
|
||||||
beep,
|
|
||||||
thingy,
|
|
||||||
otherThingy,
|
|
||||||
spentOnBuyables,
|
|
||||||
waffleBoost,
|
|
||||||
icecreamCap,
|
|
||||||
coolInfo,
|
|
||||||
lollipopMilestones,
|
|
||||||
funChallenge,
|
|
||||||
funEffect,
|
|
||||||
generatorUpgrade,
|
|
||||||
lollipopMultiplierUpgrade,
|
|
||||||
lollipopMultiplierEffect,
|
|
||||||
unlockIlluminatiUpgrade,
|
|
||||||
quasiUpgrade,
|
|
||||||
exhancers,
|
|
||||||
respecBuyables,
|
|
||||||
sellExhancer,
|
|
||||||
bars: { tallBoi, longBoi, flatBoi },
|
|
||||||
tree,
|
|
||||||
g,
|
|
||||||
h,
|
|
||||||
spook,
|
|
||||||
conversion,
|
|
||||||
reset,
|
|
||||||
hotkeys,
|
|
||||||
treeNode,
|
|
||||||
resetButton,
|
|
||||||
confirmRespec,
|
|
||||||
minWidth: 800,
|
|
||||||
tabs,
|
|
||||||
display: jsx(() => <>{render(tabs)}</>)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
export default layer;
|
|
|
@ -1,179 +0,0 @@
|
||||||
import { createLayerTreeNode, createResetButton } from "@/data/common";
|
|
||||||
import { main } from "@/data/mod";
|
|
||||||
import { createClickable } from "@/features/clickables/clickable";
|
|
||||||
import { createExponentialScaling, createIndependentConversion } from "@/features/conversion";
|
|
||||||
import { jsx } from "@/features/feature";
|
|
||||||
import { createInfobox } from "@/features/infoboxes/infobox";
|
|
||||||
import { createReset } from "@/features/reset";
|
|
||||||
import MainDisplay from "@/features/resources/MainDisplay.vue";
|
|
||||||
import { createResource, displayResource } from "@/features/resources/resource";
|
|
||||||
import { createLayer } from "@/game/layers";
|
|
||||||
import { persistent } from "@/game/persistence";
|
|
||||||
import Decimal, { DecimalSource, formatWhole } from "@/util/bignum";
|
|
||||||
import { render } from "@/util/vue";
|
|
||||||
import c from "./c";
|
|
||||||
|
|
||||||
const layer = createLayer(() => {
|
|
||||||
const id = "f";
|
|
||||||
const color = "#FE0102";
|
|
||||||
const name = "Farms";
|
|
||||||
const points = createResource<DecimalSource>(0, "farm points");
|
|
||||||
const boop = persistent<boolean>(false);
|
|
||||||
|
|
||||||
const coolInfo = createInfobox(() => ({
|
|
||||||
title: "Lore",
|
|
||||||
titleStyle: { color: "#FE0000" },
|
|
||||||
display: "DEEP LORE!",
|
|
||||||
bodyStyle: { backgroundColor: "#0000EE" }
|
|
||||||
}));
|
|
||||||
|
|
||||||
const clickableState = persistent<string>("Start");
|
|
||||||
const clickable = createClickable(() => ({
|
|
||||||
display() {
|
|
||||||
return {
|
|
||||||
title: "Clicky clicky!",
|
|
||||||
description: "Current state:<br>" + clickableState.value
|
|
||||||
};
|
|
||||||
},
|
|
||||||
initialState: "Start",
|
|
||||||
canClick() {
|
|
||||||
return clickableState.value !== "Borkened...";
|
|
||||||
},
|
|
||||||
onClick() {
|
|
||||||
switch (clickableState.value) {
|
|
||||||
case "Start":
|
|
||||||
clickableState.value = "A new state!";
|
|
||||||
break;
|
|
||||||
case "A new state!":
|
|
||||||
clickableState.value = "Keep going!";
|
|
||||||
break;
|
|
||||||
case "Keep going!":
|
|
||||||
clickableState.value = "Maybe that's a bit too far...";
|
|
||||||
break;
|
|
||||||
case "Maybe that's a bit too far...":
|
|
||||||
//makeParticles(coolParticle, 4)
|
|
||||||
clickableState.value = "Borkened...";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
clickableState.value = "Start";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onHold() {
|
|
||||||
console.log("Clickkkkk...");
|
|
||||||
},
|
|
||||||
style() {
|
|
||||||
switch (clickableState.value) {
|
|
||||||
case "Start":
|
|
||||||
return { "background-color": "green" };
|
|
||||||
case "A new state!":
|
|
||||||
return { "background-color": "yellow" };
|
|
||||||
case "Keep going!":
|
|
||||||
return { "background-color": "orange" };
|
|
||||||
case "Maybe that's a bit too far...":
|
|
||||||
return { "background-color": "red" };
|
|
||||||
default:
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const resetClickable = createClickable(() => ({
|
|
||||||
onClick() {
|
|
||||||
if (clickableState.value == "Borkened...") {
|
|
||||||
clickableState.value = "Start";
|
|
||||||
}
|
|
||||||
},
|
|
||||||
display() {
|
|
||||||
return clickableState.value == "Borkened..." ? "Fix the clickable!" : "Does nothing";
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const reset = createReset(() => ({
|
|
||||||
thingsToReset: (): Record<string, unknown>[] => [layer]
|
|
||||||
}));
|
|
||||||
|
|
||||||
const conversion = createIndependentConversion(() => ({
|
|
||||||
scaling: createExponentialScaling(10, 3, 0.5),
|
|
||||||
baseResource: main.points,
|
|
||||||
gainResource: points,
|
|
||||||
modifyGainAmount: gain => Decimal.times(gain, c.otherThingy.value)
|
|
||||||
}));
|
|
||||||
|
|
||||||
const treeNode = createLayerTreeNode(() => ({
|
|
||||||
layerID: id,
|
|
||||||
color,
|
|
||||||
reset,
|
|
||||||
tooltip() {
|
|
||||||
if (treeNode.canClick.value) {
|
|
||||||
return `${displayResource(points)} ${points.displayName}`;
|
|
||||||
}
|
|
||||||
return `This weird farmer dinosaur will only see you if you have at least 10 points. You only have ${displayResource(
|
|
||||||
main.points
|
|
||||||
)}`;
|
|
||||||
},
|
|
||||||
canClick() {
|
|
||||||
return Decimal.gte(main.points.value, 10);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
const resetButton = createResetButton(() => ({
|
|
||||||
conversion,
|
|
||||||
tree: main.tree,
|
|
||||||
treeNode,
|
|
||||||
display: jsx(() => {
|
|
||||||
if (resetButton.conversion.buyMax) {
|
|
||||||
return (
|
|
||||||
<span>
|
|
||||||
Hi! I'm a <u>weird dinosaur</u> and I'll give you{" "}
|
|
||||||
<b>{formatWhole(resetButton.conversion.currentGain.value)}</b> Farm Points
|
|
||||||
in exchange for all of your points and lollipops! (You'll get another one at{" "}
|
|
||||||
{formatWhole(resetButton.conversion.nextAt.value)} points)
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
<span>
|
|
||||||
Hi! I'm a <u>weird dinosaur</u> and I'll give you a Farm Point in exchange
|
|
||||||
for all of your points and lollipops! (At least{" "}
|
|
||||||
{formatWhole(resetButton.conversion.nextAt.value)} points)
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}));
|
|
||||||
|
|
||||||
const tab = jsx(() => (
|
|
||||||
<>
|
|
||||||
{render(coolInfo)}
|
|
||||||
<MainDisplay resource={points} color={color} />
|
|
||||||
{render(resetButton)}
|
|
||||||
<div>You have {formatWhole(conversion.baseResource.value)} points</div>
|
|
||||||
<div>
|
|
||||||
<br />
|
|
||||||
<img src="https://images.beano.com/store/24ab3094eb95e5373bca1ccd6f330d4406db8d1f517fc4170b32e146f80d?auto=compress%2Cformat&dpr=1&w=390" />
|
|
||||||
<div>Bork Bork!</div>
|
|
||||||
</div>
|
|
||||||
{render(clickable)}
|
|
||||||
</>
|
|
||||||
));
|
|
||||||
|
|
||||||
return {
|
|
||||||
id,
|
|
||||||
color,
|
|
||||||
name,
|
|
||||||
points,
|
|
||||||
boop,
|
|
||||||
coolInfo,
|
|
||||||
clickable,
|
|
||||||
clickableState,
|
|
||||||
resetClickable,
|
|
||||||
reset,
|
|
||||||
conversion,
|
|
||||||
treeNode,
|
|
||||||
resetButton,
|
|
||||||
display: tab
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
export default layer;
|
|
|
@ -1,354 +0,0 @@
|
||||||
/* eslint-disable */
|
|
||||||
import { layers } from "@/game/layers";
|
|
||||||
import player from "@/game/player";
|
|
||||||
import { Layer, RawLayer } from "@/typings/layer";
|
|
||||||
import Decimal, { format } from "@/util/bignum";
|
|
||||||
import {
|
|
||||||
getBuyableAmount, hasChallenge, hasMilestone, hasUpgrade, setBuyableAmount
|
|
||||||
} from "@/util/features";
|
|
||||||
import { resetLayer } from "@/util/layers";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
id: "i",
|
|
||||||
position: 2, // Horizontal position within a row. By default it uses the layer id and sorts in alphabetical order
|
|
||||||
startData() {
|
|
||||||
return {
|
|
||||||
unlocked: false,
|
|
||||||
points: new Decimal(0)
|
|
||||||
};
|
|
||||||
},
|
|
||||||
branches: ["p"],
|
|
||||||
color: "#964B00",
|
|
||||||
requires() {
|
|
||||||
const require = new Decimal(8).plus(
|
|
||||||
player.layers.i.points
|
|
||||||
.div(10)
|
|
||||||
.floor()
|
|
||||||
.times(2)
|
|
||||||
);
|
|
||||||
return require;
|
|
||||||
}, // Can be a function that takes requirement increases into account
|
|
||||||
effectDisplay() {
|
|
||||||
return (
|
|
||||||
"Multiplying points and prestige points by " +
|
|
||||||
format(
|
|
||||||
player.layers[this.layer].points
|
|
||||||
.plus(1)
|
|
||||||
.pow(hasUpgrade("p", 235) ? 6.942 : 1)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
resource: "Infinity", // Name of prestige currency
|
|
||||||
baseResource: "pointy points", // Name of resource prestige is based on
|
|
||||||
baseAmount() {
|
|
||||||
return player.layers.p.buyables![21];
|
|
||||||
}, // Get the current amount of baseResource
|
|
||||||
type: "custom", // normal: cost to gain currency depends on amount gained. static: cost depends on how much you already have
|
|
||||||
resetGain() {
|
|
||||||
if (hasMilestone("p", 12)) {
|
|
||||||
return getBuyableAmount("p", 21)!
|
|
||||||
.div(2)
|
|
||||||
.floor()
|
|
||||||
.times(2)
|
|
||||||
.times(5)
|
|
||||||
.sub(30)
|
|
||||||
.sub(player.layers.i.points);
|
|
||||||
}
|
|
||||||
return player.layers.p.buyables![21].gte(layers.i.requires!) ? 1 : 0;
|
|
||||||
}, // Prestige currency exponent
|
|
||||||
getNextAt() {
|
|
||||||
return new Decimal(100);
|
|
||||||
},
|
|
||||||
canReset() {
|
|
||||||
return player.layers.p.buyables![21].gte(layers.i.requires!);
|
|
||||||
},
|
|
||||||
prestigeButtonDisplay() {
|
|
||||||
return (
|
|
||||||
"Reset everything for +" +
|
|
||||||
format(layers.i.resetGain) +
|
|
||||||
" Infinity.<br>You need " +
|
|
||||||
format(layers.i.requires!) +
|
|
||||||
" pointy points to reset."
|
|
||||||
);
|
|
||||||
},
|
|
||||||
row: 1, // Row the layer is in on the tree (0 is the first row)
|
|
||||||
hotkeys: [
|
|
||||||
{
|
|
||||||
key: "i",
|
|
||||||
description: "I: Infinity",
|
|
||||||
press() {
|
|
||||||
if (layers.i.canReset) resetLayer(this.layer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
layerShown() {
|
|
||||||
return (
|
|
||||||
player.layers[this.layer].unlocked ||
|
|
||||||
new Decimal(player.layers.p.buyables[21]).gte(8)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
milestones: {
|
|
||||||
data: {
|
|
||||||
0: {
|
|
||||||
requirementDisplay: "2 Infinity points",
|
|
||||||
effectDisplay: "Keep ALL milestones on reset",
|
|
||||||
done() {
|
|
||||||
return player.layers[this.layer].points.gte(2);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
1: {
|
|
||||||
requirementDisplay: "3 Infinity points",
|
|
||||||
effectDisplay: "Pointy points don't reset generators",
|
|
||||||
done() {
|
|
||||||
return player.layers[this.layer].points.gte(3);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, Number(this.id) - 1);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
2: {
|
|
||||||
requirementDisplay: "4 Infinity points",
|
|
||||||
effectDisplay:
|
|
||||||
"Start with 6 <b>Time Dilation</b>, 3 <b>Point</b>, and 1 of the other 2 challenges",
|
|
||||||
done() {
|
|
||||||
return player.layers[this.layer].points.gte(4);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, Number(this.id) - 1);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
3: {
|
|
||||||
requirementDisplay: "5 Infinity points",
|
|
||||||
effectDisplay: "Start with 40 upgrades and 6 boosts",
|
|
||||||
done() {
|
|
||||||
return player.layers[this.layer].points.gte(5);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, Number(this.id) - 1);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
4: {
|
|
||||||
requirementDisplay: "6 Infinity points",
|
|
||||||
effectDisplay:
|
|
||||||
"You can choose all of the 14th row upgrades, and remove the respec button",
|
|
||||||
done() {
|
|
||||||
return player.layers[this.layer].points.gte(6);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, Number(this.id) - 1);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
5: {
|
|
||||||
requirementDisplay: "8 Infinity points",
|
|
||||||
effectDisplay: "Keep all upgrades and 7 Time dilation",
|
|
||||||
done() {
|
|
||||||
return player.layers[this.layer].points.gte(8);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, Number(this.id) - 1);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
6: {
|
|
||||||
requirementDisplay: "10 Infinity points",
|
|
||||||
effectDisplay: "Infinity reset nothing and auto prestige",
|
|
||||||
done() {
|
|
||||||
return player.layers[this.layer].points.gte(10);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, Number(this.id) - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
resetsNothing() {
|
|
||||||
return hasMilestone(this.layer, 6);
|
|
||||||
},
|
|
||||||
update(this: Layer) {
|
|
||||||
if (hasMilestone(this.layer, 0)) {
|
|
||||||
if (!hasMilestone("p", 0)) {
|
|
||||||
player.layers.p.milestones!.push(0);
|
|
||||||
player.layers.p.milestones!.push(1);
|
|
||||||
player.layers.p.milestones!.push(2);
|
|
||||||
player.layers.p.milestones!.push(3);
|
|
||||||
player.layers.p.milestones!.push(4);
|
|
||||||
player.layers.p.milestones!.push(5);
|
|
||||||
player.layers.p.milestones!.push(6);
|
|
||||||
player.layers.p.milestones!.push(7);
|
|
||||||
player.layers.p.milestones!.push(8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasMilestone(this.layer, 2)) {
|
|
||||||
if (!hasChallenge("p", 11)) {
|
|
||||||
player.layers.p.challenges![11] = new Decimal(
|
|
||||||
hasMilestone(this.layer, 5) ? 7 : 6
|
|
||||||
);
|
|
||||||
player.layers.p.challenges![12] = new Decimal(3);
|
|
||||||
player.layers.p.challenges![21] = new Decimal(1);
|
|
||||||
player.layers.p.challenges![22] = new Decimal(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasMilestone(this.layer, 3)) {
|
|
||||||
if (!hasUpgrade("p", 71)) {
|
|
||||||
player.layers.p.upgrades = [
|
|
||||||
11,
|
|
||||||
12,
|
|
||||||
13,
|
|
||||||
14,
|
|
||||||
21,
|
|
||||||
22,
|
|
||||||
23,
|
|
||||||
24,
|
|
||||||
31,
|
|
||||||
32,
|
|
||||||
33,
|
|
||||||
34,
|
|
||||||
41,
|
|
||||||
42,
|
|
||||||
43,
|
|
||||||
44,
|
|
||||||
51,
|
|
||||||
52,
|
|
||||||
53,
|
|
||||||
54,
|
|
||||||
61,
|
|
||||||
62,
|
|
||||||
63,
|
|
||||||
64,
|
|
||||||
71,
|
|
||||||
72,
|
|
||||||
73,
|
|
||||||
74,
|
|
||||||
81,
|
|
||||||
82,
|
|
||||||
83,
|
|
||||||
84,
|
|
||||||
91,
|
|
||||||
92,
|
|
||||||
93,
|
|
||||||
94,
|
|
||||||
101,
|
|
||||||
102,
|
|
||||||
103,
|
|
||||||
104
|
|
||||||
];
|
|
||||||
}
|
|
||||||
if (getBuyableAmount("p", 11)!.lt(6)) {
|
|
||||||
setBuyableAmount("p", 11, new Decimal(6));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasUpgrade(this.layer, 13)) {
|
|
||||||
for (
|
|
||||||
let i = 0;
|
|
||||||
i < (hasUpgrade("p", 222) ? 100 : hasUpgrade("p", 215) ? 10 : 1);
|
|
||||||
i++
|
|
||||||
) {
|
|
||||||
if (layers.p.buyables!.data[12].canAfford) layers.p.buyables!.data[12].buy();
|
|
||||||
if (layers.p.buyables!.data[13].canAfford) layers.p.buyables!.data[13].buy();
|
|
||||||
if (
|
|
||||||
layers.p.buyables!.data[14].canAfford &&
|
|
||||||
layers.p.buyables!.data[14].unlocked
|
|
||||||
)
|
|
||||||
layers.p.buyables!.data[14].buy();
|
|
||||||
if (layers.p.buyables!.data[21].canAfford) layers.p.buyables!.data[21].buy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasUpgrade("p", 223)) {
|
|
||||||
if (hasMilestone("p", 14))
|
|
||||||
player.layers.p.buyables![22] = player.layers.p.buyables![22].max(
|
|
||||||
player.layers.p.buyables![21].sub(7)
|
|
||||||
);
|
|
||||||
else if (layers.p.buyables!.data[22].canAfford) layers.p.buyables!.data[22].buy();
|
|
||||||
}
|
|
||||||
if (hasMilestone(this.layer, 5) && !hasUpgrade("p", 111)) {
|
|
||||||
player.layers.p.upgrades = [
|
|
||||||
11,
|
|
||||||
12,
|
|
||||||
13,
|
|
||||||
14,
|
|
||||||
21,
|
|
||||||
22,
|
|
||||||
23,
|
|
||||||
24,
|
|
||||||
31,
|
|
||||||
32,
|
|
||||||
33,
|
|
||||||
34,
|
|
||||||
41,
|
|
||||||
42,
|
|
||||||
43,
|
|
||||||
44,
|
|
||||||
51,
|
|
||||||
52,
|
|
||||||
53,
|
|
||||||
54,
|
|
||||||
61,
|
|
||||||
62,
|
|
||||||
63,
|
|
||||||
64,
|
|
||||||
71,
|
|
||||||
72,
|
|
||||||
73,
|
|
||||||
74,
|
|
||||||
81,
|
|
||||||
82,
|
|
||||||
83,
|
|
||||||
84,
|
|
||||||
91,
|
|
||||||
92,
|
|
||||||
93,
|
|
||||||
94,
|
|
||||||
101,
|
|
||||||
102,
|
|
||||||
103,
|
|
||||||
104,
|
|
||||||
111,
|
|
||||||
121,
|
|
||||||
122,
|
|
||||||
131,
|
|
||||||
132,
|
|
||||||
141,
|
|
||||||
142,
|
|
||||||
143
|
|
||||||
];
|
|
||||||
}
|
|
||||||
if (hasMilestone(this.layer, 6)) {
|
|
||||||
this.reset();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
upgrades: {
|
|
||||||
rows: 999,
|
|
||||||
cols: 5,
|
|
||||||
data: {
|
|
||||||
11: {
|
|
||||||
title: "Prestige",
|
|
||||||
description: "Gain 100% of prestige points per second",
|
|
||||||
cost() {
|
|
||||||
return new Decimal(1);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, 4);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
12: {
|
|
||||||
title: "Automation",
|
|
||||||
description: "Remove the nerf of upgrade <b>Active</b>",
|
|
||||||
cost() {
|
|
||||||
return new Decimal(2);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasUpgrade(this.layer, 11);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
13: {
|
|
||||||
title: "Pointy",
|
|
||||||
description: "Automatically buy generators and pointy points",
|
|
||||||
cost() {
|
|
||||||
return new Decimal(5);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasUpgrade(this.layer, 11);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} as RawLayer;
|
|
File diff suppressed because it is too large
Load diff
56
src/data/layers/prestige.tsx
Normal file
56
src/data/layers/prestige.tsx
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
import { main } from "@/data/mod";
|
||||||
|
import { createCumulativeConversion, createExponentialScaling } from "@/features/conversion";
|
||||||
|
import { jsx } from "@/features/feature";
|
||||||
|
import { createReset } from "@/features/reset";
|
||||||
|
import MainDisplay from "@/features/resources/MainDisplay.vue";
|
||||||
|
import { createResource } from "@/features/resources/resource";
|
||||||
|
import { createLayer } from "@/game/layers";
|
||||||
|
import { DecimalSource } from "@/lib/break_eternity";
|
||||||
|
import { render } from "@/util/vue";
|
||||||
|
import { createLayerTreeNode, createResetButton } from "../common";
|
||||||
|
|
||||||
|
const layer = createLayer(() => {
|
||||||
|
const id = "p";
|
||||||
|
const name = "Prestige";
|
||||||
|
const color = "#4BDC13";
|
||||||
|
const points = createResource<DecimalSource>(0, "prestige points");
|
||||||
|
|
||||||
|
const conversion = createCumulativeConversion(() => ({
|
||||||
|
scaling: createExponentialScaling(10, 5, 0.5),
|
||||||
|
baseResource: main.points,
|
||||||
|
gainResource: points,
|
||||||
|
roundUpCost: true
|
||||||
|
}));
|
||||||
|
|
||||||
|
const reset = createReset(() => ({
|
||||||
|
thingsToReset: (): Record<string, unknown>[] => [layer]
|
||||||
|
}));
|
||||||
|
|
||||||
|
const treeNode = createLayerTreeNode(() => ({
|
||||||
|
layerID: id,
|
||||||
|
color,
|
||||||
|
reset
|
||||||
|
}));
|
||||||
|
|
||||||
|
const resetButton = createResetButton(() => ({
|
||||||
|
conversion,
|
||||||
|
tree: main.tree,
|
||||||
|
treeNode
|
||||||
|
}));
|
||||||
|
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
color,
|
||||||
|
points,
|
||||||
|
display: jsx(() => (
|
||||||
|
<>
|
||||||
|
<MainDisplay resource={points} color={color} />
|
||||||
|
{render(resetButton)}
|
||||||
|
</>
|
||||||
|
)),
|
||||||
|
treeNode
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
export default layer;
|
|
@ -1,18 +1,15 @@
|
||||||
import Profectus from "@/components/Profectus.vue";
|
|
||||||
import Spacer from "@/components/layout/Spacer.vue";
|
import Spacer from "@/components/layout/Spacer.vue";
|
||||||
import { jsx } from "@/features/feature";
|
import { jsx } from "@/features/feature";
|
||||||
import { createResource, trackBest, trackOOMPS, trackTotal } from "@/features/resources/resource";
|
import { createResource, trackBest, trackOOMPS, trackTotal } from "@/features/resources/resource";
|
||||||
import { branchedResetPropagation, createTree, GenericTree } from "@/features/trees/tree";
|
import { branchedResetPropagation, createTree, GenericTree } from "@/features/trees/tree";
|
||||||
import { globalBus } from "@/game/events";
|
import { globalBus } from "@/game/events";
|
||||||
import { createLayer, GenericLayer, setupLayerModal } from "@/game/layers";
|
import { createLayer, GenericLayer } from "@/game/layers";
|
||||||
import player, { PlayerData } from "@/game/player";
|
import player, { PlayerData } from "@/game/player";
|
||||||
import { DecimalSource } from "@/lib/break_eternity";
|
import { DecimalSource } from "@/lib/break_eternity";
|
||||||
import Decimal, { format, formatTime } from "@/util/bignum";
|
import Decimal, { format, formatTime } from "@/util/bignum";
|
||||||
import { render } from "@/util/vue";
|
import { render } from "@/util/vue";
|
||||||
import { computed, toRaw } from "vue";
|
import { computed, toRaw } from "vue";
|
||||||
import a from "./layers/aca/a";
|
import prestige from "./layers/prestige";
|
||||||
import c from "./layers/aca/c";
|
|
||||||
import f from "./layers/aca/f";
|
|
||||||
|
|
||||||
export const main = createLayer(() => {
|
export const main = createLayer(() => {
|
||||||
const points = createResource<DecimalSource>(10);
|
const points = createResource<DecimalSource>(10);
|
||||||
|
@ -20,10 +17,7 @@ export const main = createLayer(() => {
|
||||||
const total = trackTotal(points);
|
const total = trackTotal(points);
|
||||||
|
|
||||||
const pointGain = computed(() => {
|
const pointGain = computed(() => {
|
||||||
if (!c.generatorUpgrade.bought.value) return new Decimal(0);
|
let gain = new Decimal(1);
|
||||||
let gain = new Decimal(3.19);
|
|
||||||
if (c.lollipopMultiplierUpgrade.bought.value)
|
|
||||||
gain = gain.times(c.lollipopMultiplierEffect.value);
|
|
||||||
return gain;
|
return gain;
|
||||||
});
|
});
|
||||||
globalBus.on("update", diff => {
|
globalBus.on("update", diff => {
|
||||||
|
@ -31,34 +25,17 @@ export const main = createLayer(() => {
|
||||||
});
|
});
|
||||||
const oomps = trackOOMPS(points, pointGain);
|
const oomps = trackOOMPS(points, pointGain);
|
||||||
|
|
||||||
const { openModal, modal } = setupLayerModal(a);
|
|
||||||
|
|
||||||
// Note: Casting as generic tree to avoid recursive type definitions
|
|
||||||
const tree = createTree(() => ({
|
const tree = createTree(() => ({
|
||||||
nodes: [[c.treeNode], [f.treeNode, c.spook]],
|
nodes: [[prestige.treeNode]],
|
||||||
leftSideNodes: [a.treeNode, c.h],
|
branches: [],
|
||||||
branches: [
|
|
||||||
{
|
|
||||||
startNode: f.treeNode,
|
|
||||||
endNode: c.treeNode,
|
|
||||||
stroke: "blue",
|
|
||||||
"stroke-width": "25px",
|
|
||||||
style: {
|
|
||||||
filter: "blur(5px)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
onReset() {
|
onReset() {
|
||||||
points.value = toRaw(this.resettingNode.value) === toRaw(c.treeNode) ? 0 : 10;
|
points.value = toRaw(this.resettingNode.value) === toRaw(prestige.treeNode) ? 0 : 10;
|
||||||
best.value = points.value;
|
best.value = points.value;
|
||||||
total.value = points.value;
|
total.value = points.value;
|
||||||
},
|
},
|
||||||
resetPropagation: branchedResetPropagation
|
resetPropagation: branchedResetPropagation
|
||||||
})) as GenericTree;
|
})) as GenericTree;
|
||||||
|
|
||||||
// Note: layers don't _need_ a reference to everything,
|
|
||||||
// but I'd recommend it over trying to remember what does and doesn't need to be included.
|
|
||||||
// Officially all you need are anything with persistency or that you want to access elsewhere
|
|
||||||
return {
|
return {
|
||||||
id: "main",
|
id: "main",
|
||||||
name: "Tree",
|
name: "Tree",
|
||||||
|
@ -79,28 +56,24 @@ export const main = createLayer(() => {
|
||||||
</div>
|
</div>
|
||||||
<div v-show={Decimal.gt(pointGain.value, 0)}>({oomps.value})</div>
|
<div v-show={Decimal.gt(pointGain.value, 0)}>({oomps.value})</div>
|
||||||
<Spacer />
|
<Spacer />
|
||||||
<button onClick={openModal}>open achievements</button>
|
|
||||||
{render(modal)}
|
|
||||||
{render(tree)}
|
{render(tree)}
|
||||||
<Profectus height="200px" style="margin: 10px auto; display: block" />
|
|
||||||
</>
|
</>
|
||||||
)),
|
)),
|
||||||
points,
|
points,
|
||||||
best,
|
best,
|
||||||
total,
|
total,
|
||||||
oomps,
|
oomps,
|
||||||
tree,
|
tree
|
||||||
showAchievements: openModal
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
export const getInitialLayers = (
|
export const getInitialLayers = (
|
||||||
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
||||||
player: Partial<PlayerData>
|
player: Partial<PlayerData>
|
||||||
): Array<GenericLayer> => [main, f, c, a];
|
): Array<GenericLayer> => [main, prestige];
|
||||||
|
|
||||||
export const hasWon = computed(() => {
|
export const hasWon = computed(() => {
|
||||||
return Decimal.gt(main.points.value, 25);
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"title": "Profectus",
|
"title": "Profectus",
|
||||||
"id": "profectus-demo",
|
"id": "profectus",
|
||||||
"author": "thepaperpilot",
|
"author": "thepaperpilot",
|
||||||
"discordName": "The Paper Pilot Community",
|
"discordName": "The Paper Pilot Community",
|
||||||
"discordLink": "https://discord.gg/WzejVAx",
|
"discordLink": "https://discord.gg/WzejVAx",
|
||||||
|
@ -13,8 +13,8 @@
|
||||||
"defaultDecimalsShown": 2,
|
"defaultDecimalsShown": 2,
|
||||||
"useHeader": true,
|
"useHeader": true,
|
||||||
"banner": null,
|
"banner": null,
|
||||||
"logo": "Logo.png",
|
"logo": "",
|
||||||
"initialTabs": [ "main", "c" ],
|
"initialTabs": [ "main" ],
|
||||||
|
|
||||||
"maxTickLength": 3600,
|
"maxTickLength": 3600,
|
||||||
"offlineLimit": 1
|
"offlineLimit": 1
|
||||||
|
|
Loading…
Reference in a new issue