forked from profectus/Profectus
setup basic mod info
This commit is contained in:
parent
0afcd1cd3d
commit
8fff8f2835
10 changed files with 25 additions and 3641 deletions
|
@ -1 +0,0 @@
|
||||||
eyJpZCI6InRtdC14LTEwNSIsIm5hbWUiOiJEZWZhdWx0IFNhZmZmZiAtIHNvbWV0aGluZyBlbHNlIiwidGFicyI6WyJtYWluIiwiYyJdLCJ0aW1lIjoxNjI0MjQ1MjYxMDg3LCJhdXRvc2F2ZSI6dHJ1ZSwib2ZmbGluZVByb2QiOnRydWUsInRpbWVQbGF5ZWQiOiIzNDQ4LjYxNTc4MTcwOTAxIiwia2VlcEdvaW5nIjpmYWxzZSwibGFzdFRlblRpY2tzIjpbMC4wNTEsMC4wNSwwLjA0OSwwLjA1LDAuMDUsMC4wNTEsMC4wNDksMC4wNSwwLjA1LDAuMDUxXSwic2hvd1RQUyI6dHJ1ZSwibXNEaXNwbGF5IjoiYWxsIiwiaGlkZUNoYWxsZW5nZXMiOmZhbHNlLCJ0aGVtZSI6InBhcGVyIiwic3VidGFicyI6e30sIm1pbmltaXplZCI6e30sIm1vZElEIjoidG10LXgiLCJtb2RWZXJzaW9uIjoiMC4wIiwicG9pbnRzIjoiMzMwMC4zNzc3NzM4NTkwNTUiLCJtYWluIjp7InVwZ3JhZGVzIjpbXSwiYWNoaWV2ZW1lbnRzIjpbXSwibWlsZXN0b25lcyI6W10sImluZm9ib3hlcyI6e319LCJmIjp7InVwZ3JhZGVzIjpbXSwiYWNoaWV2ZW1lbnRzIjpbXSwibWlsZXN0b25lcyI6W10sImluZm9ib3hlcyI6e30sImNsaWNrYWJsZXMiOnsiMTEiOiJTdGFydCJ9LCJ1bmxvY2tlZCI6ZmFsc2UsInBvaW50cyI6IjAiLCJib29wIjpmYWxzZX0sImMiOnsidXBncmFkZXMiOlsiMTEiXSwiYWNoaWV2ZW1lbnRzIjpbXSwibWlsZXN0b25lcyI6W10sImluZm9ib3hlcyI6e30sImJ1eWFibGVzIjp7IjExIjoiMCJ9LCJjaGFsbGVuZ2VzIjp7IjExIjoiMCJ9LCJ1bmxvY2tlZCI6dHJ1ZSwicG9pbnRzIjoiMCIsImJlc3QiOiIxIiwidG90YWwiOiIwIiwiYmVlcCI6ZmFsc2UsInRoaW5neSI6InBvaW50eSIsIm90aGVyVGhpbmd5IjoxMCwic3BlbnRPbkJ1eWFibGVzIjoiMCJ9LCJhIjp7InVwZ3JhZGVzIjpbXSwiYWNoaWV2ZW1lbnRzIjpbIjExIl0sIm1pbGVzdG9uZXMiOltdLCJpbmZvYm94ZXMiOnt9LCJ1bmxvY2tlZCI6dHJ1ZSwicG9pbnRzIjoiMCJ9LCJnIjp7InVwZ3JhZGVzIjpbXSwiYWNoaWV2ZW1lbnRzIjpbXSwibWlsZXN0b25lcyI6W10sImluZm9ib3hlcyI6e319LCJoIjp7InVwZ3JhZGVzIjpbXSwiYWNoaWV2ZW1lbnRzIjpbXSwibWlsZXN0b25lcyI6W10sImluZm9ib3hlcyI6e319LCJzcG9vayI6eyJ1cGdyYWRlcyI6W10sImFjaGlldmVtZW50cyI6W10sIm1pbGVzdG9uZXMiOltdLCJpbmZvYm94ZXMiOnt9fSwib29tcHNNYWciOjAsImxhc3RQb2ludHMiOiIzMzAwLjM3Nzc3Mzg1OTA1NSJ9
|
|
|
@ -14,7 +14,7 @@
|
||||||
:layer="tab"
|
:layer="tab"
|
||||||
:index="index"
|
:index="index"
|
||||||
v-else-if="tab in components"
|
v-else-if="tab in components"
|
||||||
:minimizable="true"
|
:minimizable="minimizable[tab]"
|
||||||
:tab="() => $refs[`tab-${index}`]"
|
:tab="() => $refs[`tab-${index}`]"
|
||||||
/>
|
/>
|
||||||
<component :is="tab" :index="index" v-else />
|
<component :is="tab" :index="index" v-else />
|
||||||
|
@ -47,6 +47,12 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
},
|
||||||
|
minimizable() {
|
||||||
|
return Object.keys(layers).reduce((acc: Record<string, boolean>, curr) => {
|
||||||
|
acc[curr] = layers[curr].minimizable !== false;
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,103 +0,0 @@
|
||||||
/* eslint-disable */
|
|
||||||
import player from "@/game/player";
|
|
||||||
import { GridCell } from "@/typings/features/grid";
|
|
||||||
import { RawLayer } from "@/typings/layer";
|
|
||||||
import Decimal from "@/util/bignum";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
id: "a",
|
|
||||||
startData() {
|
|
||||||
return {
|
|
||||||
unlocked: true,
|
|
||||||
points: new Decimal(0)
|
|
||||||
};
|
|
||||||
},
|
|
||||||
color: "yellow",
|
|
||||||
modal: true,
|
|
||||||
name: "Achievements",
|
|
||||||
resource: "achievement power",
|
|
||||||
row: "side",
|
|
||||||
tooltip() {
|
|
||||||
// Optional, tooltip displays when the layer is locked
|
|
||||||
return "Achievements";
|
|
||||||
},
|
|
||||||
achievementPopups: true,
|
|
||||||
achievements: {
|
|
||||||
data: {
|
|
||||||
11: {
|
|
||||||
image: "https://unsoftcapped2.github.io/The-Modding-Tree-2/discord.png",
|
|
||||||
name: "Get me!",
|
|
||||||
done() {
|
|
||||||
return true;
|
|
||||||
}, // This one is a freebie
|
|
||||||
goalTooltip: "How did this happen?", // Shows when achievement is not completed
|
|
||||||
doneTooltip: "You did it!" // Showed when the achievement is completed
|
|
||||||
},
|
|
||||||
12: {
|
|
||||||
name: "Impossible!",
|
|
||||||
done() {
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
goalTooltip: "Mwahahaha!", // Shows when achievement is not completed
|
|
||||||
doneTooltip: "HOW????", // Showed when the achievement is completed
|
|
||||||
style: { color: "#04e050" }
|
|
||||||
},
|
|
||||||
13: {
|
|
||||||
name: "EIEIO",
|
|
||||||
done() {
|
|
||||||
return player.layers.f.points.gte(1);
|
|
||||||
},
|
|
||||||
tooltip:
|
|
||||||
"Get a farm point.\n\nReward: The dinosaur is now your friend (you can max Farm Points).", // Showed when the achievement is completed
|
|
||||||
onComplete() {
|
|
||||||
console.log("Bork bork bork!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
midsection: "<grid id='test' />",
|
|
||||||
grids: {
|
|
||||||
data: {
|
|
||||||
test: {
|
|
||||||
maxRows: 3,
|
|
||||||
rows: 2,
|
|
||||||
cols: 2,
|
|
||||||
getStartData(cell: string) {
|
|
||||||
return cell;
|
|
||||||
},
|
|
||||||
getUnlocked() {
|
|
||||||
// Default
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
getCanClick() {
|
|
||||||
return player.points.eq(10);
|
|
||||||
},
|
|
||||||
getStyle(cell) {
|
|
||||||
return { backgroundColor: "#" + ((Number((this[cell] as GridCell).data) * 1234) % 999999) };
|
|
||||||
},
|
|
||||||
click(cell) {
|
|
||||||
// Don't forget onHold
|
|
||||||
(this[cell] as GridCell).data = ((this[cell] as GridCell).data as number) + 1;
|
|
||||||
},
|
|
||||||
getTitle(cell) {
|
|
||||||
let direction;
|
|
||||||
if (cell === "101") {
|
|
||||||
direction = "top";
|
|
||||||
} else if (cell === "102") {
|
|
||||||
direction = "bottom";
|
|
||||||
} else if (cell === "201") {
|
|
||||||
direction = "left";
|
|
||||||
} else if (cell === "202") {
|
|
||||||
direction = "right";
|
|
||||||
}
|
|
||||||
return `<tooltip display='${JSON.stringify(this.style)}' ${direction}>
|
|
||||||
<h3>Gridable #${cell}</h3>
|
|
||||||
</tooltip>`;
|
|
||||||
},
|
|
||||||
getDisplay(cell) {
|
|
||||||
return (this[cell] as GridCell).data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} as RawLayer;
|
|
|
@ -1,573 +0,0 @@
|
||||||
/* eslint-disable */
|
|
||||||
import { Direction } from "@/game/enums";
|
|
||||||
import { layers } from "@/game/layers";
|
|
||||||
import player from "@/game/player";
|
|
||||||
import { DecimalSource } from "@/lib/break_eternity";
|
|
||||||
import { RawLayer } from "@/typings/layer";
|
|
||||||
import Decimal, { format, formatWhole } from "@/util/bignum";
|
|
||||||
import {
|
|
||||||
buyableEffect,
|
|
||||||
challengeCompletions,
|
|
||||||
getBuyableAmount,
|
|
||||||
hasMilestone,
|
|
||||||
hasUpgrade,
|
|
||||||
setBuyableAmount,
|
|
||||||
upgradeEffect
|
|
||||||
} from "@/util/features";
|
|
||||||
import { resetLayer, resetLayerData } from "@/util/layers";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
id: "c", // This is assigned automatically, both to the layer and all upgrades, etc. Shown here so you know about it
|
|
||||||
name: "Candies", // This is optional, only used in a few places, If absent it just uses the layer id.
|
|
||||||
symbol: "C", // This appears on the layer's node. Default is the id with the first letter capitalized
|
|
||||||
position: 0, // Horizontal position within a row. By default it uses the layer id and sorts in alphabetical order
|
|
||||||
startData() {
|
|
||||||
return {
|
|
||||||
unlocked: true,
|
|
||||||
points: new Decimal(0),
|
|
||||||
best: new Decimal(0),
|
|
||||||
total: new Decimal(0),
|
|
||||||
beep: false,
|
|
||||||
thingy: "pointy",
|
|
||||||
otherThingy: 10,
|
|
||||||
spentOnBuyables: new Decimal(0)
|
|
||||||
};
|
|
||||||
},
|
|
||||||
minWidth: 800,
|
|
||||||
color: "#4BDC13",
|
|
||||||
requires: new Decimal(10), // Can be a function that takes requirement increases into account
|
|
||||||
resource: "lollipops", // Name of prestige currency
|
|
||||||
baseResource: "points", // Name of resource prestige is based on
|
|
||||||
baseAmount() {
|
|
||||||
return player.points;
|
|
||||||
}, // Get the current amount of baseResource
|
|
||||||
type: "normal", // normal: cost to gain currency depends on amount gained. static: cost depends on how much you already have
|
|
||||||
exponent: 0.5, // Prestige currency exponent
|
|
||||||
base: 5, // Only needed for static layers, base of the formula (b^(x^exp))
|
|
||||||
roundUpCost: false, // True if the cost needs to be rounded up (use when baseResource is static?)
|
|
||||||
|
|
||||||
// For normal layers, gain beyond [softcap] points is put to the [softcapPower]th power
|
|
||||||
softcap: new Decimal(1e100),
|
|
||||||
softcapPower: new Decimal(0.5),
|
|
||||||
canBuyMax() {}, // Only needed for static layers with buy max
|
|
||||||
gainMult() {
|
|
||||||
// Calculate the multiplier for main currency from bonuses
|
|
||||||
let mult = new Decimal(1);
|
|
||||||
/*
|
|
||||||
if (hasUpgrade(this.layer, 166)) mult = mult.times(2); // These upgrades don't exist
|
|
||||||
if (hasUpgrade(this.layer, 120))
|
|
||||||
mult = mult.times(upgradeEffect(this.layer, 120) as DecimalSource);
|
|
||||||
*/
|
|
||||||
return mult;
|
|
||||||
},
|
|
||||||
gainExp() {
|
|
||||||
// Calculate the exponent on main currency from bonuses
|
|
||||||
return new Decimal(1);
|
|
||||||
},
|
|
||||||
row: 0, // Row the layer is in on the tree (0 is the first row)
|
|
||||||
effect() {
|
|
||||||
return {
|
|
||||||
// Formulas for any boosts inherent to resources in the layer. Can return a single value instead of an object if there is just one effect
|
|
||||||
waffleBoost: Decimal.pow(player.layers[this.layer].points, 0.2),
|
|
||||||
icecreamCap: player.layers[this.layer].points.times(10)
|
|
||||||
};
|
|
||||||
},
|
|
||||||
effectDisplay() {
|
|
||||||
// Optional text to describe the effects
|
|
||||||
const eff = this.effect as { waffleBoost: Decimal; icecreamCap: Decimal };
|
|
||||||
const waffleBoost = eff.waffleBoost.times(
|
|
||||||
(buyableEffect(this.layer, 11) as { first: Decimal, second: Decimal }).first
|
|
||||||
);
|
|
||||||
return (
|
|
||||||
"which are boosting waffles by " +
|
|
||||||
format(waffleBoost) +
|
|
||||||
" and increasing the Ice Cream cap by " +
|
|
||||||
format(eff.icecreamCap)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
infoboxes: {
|
|
||||||
data: {
|
|
||||||
coolInfo: {
|
|
||||||
title: "Lore",
|
|
||||||
titleStyle: { color: "#FE0000" },
|
|
||||||
body: "DEEP LORE!",
|
|
||||||
bodyStyle: { "background-color": "#0000EE" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
milestones: {
|
|
||||||
data: {
|
|
||||||
0: {
|
|
||||||
requirementDisplay: "3 Lollipops",
|
|
||||||
done() {
|
|
||||||
return (player.layers[this.layer].best as Decimal).gte(3);
|
|
||||||
}, // Used to determine when to give the milestone
|
|
||||||
effectDisplay: "Unlock the next milestone"
|
|
||||||
},
|
|
||||||
1: {
|
|
||||||
requirementDisplay: "4 Lollipops",
|
|
||||||
unlocked() {
|
|
||||||
return hasMilestone(this.layer, 0);
|
|
||||||
},
|
|
||||||
done() {
|
|
||||||
return (player.layers[this.layer].best as Decimal).gte(4);
|
|
||||||
},
|
|
||||||
effectDisplay: "You can toggle beep and boop (which do nothing)",
|
|
||||||
optionsDisplay: `
|
|
||||||
<div style="display: flex; justify-content: center">
|
|
||||||
<Toggle :value="player.layers.c.beep" @change="value => player.layers.c.beep = value" />
|
|
||||||
<Toggle :value="player.layers.f.boop" @change="value => player.layers.f.boop = value" />
|
|
||||||
</div>
|
|
||||||
`,
|
|
||||||
style() {
|
|
||||||
if (hasMilestone(this.layer, this.id))
|
|
||||||
return {
|
|
||||||
backgroundColor: "#1111DD"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
challenges: {
|
|
||||||
data: {
|
|
||||||
11: {
|
|
||||||
name: "Fun",
|
|
||||||
completionLimit: 3,
|
|
||||||
challengeDescription() {
|
|
||||||
return (
|
|
||||||
"Makes the game 0% harder<br>" +
|
|
||||||
challengeCompletions(this.layer, this.id) +
|
|
||||||
"/" +
|
|
||||||
this.completionLimit +
|
|
||||||
" completions"
|
|
||||||
);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return (player.layers[this.layer].best as Decimal).gt(0);
|
|
||||||
},
|
|
||||||
goalDescription: "Have 20 points I guess",
|
|
||||||
canComplete() {
|
|
||||||
return player.points.gte(20);
|
|
||||||
},
|
|
||||||
effect() {
|
|
||||||
const ret = player.layers[this.layer].points.add(1).tetrate(0.02);
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
rewardDisplay() {
|
|
||||||
return format(this.effect as Decimal) + "x";
|
|
||||||
},
|
|
||||||
countsAs: [12, 21], // Use this for if a challenge includes the effects of other challenges. Being in this challenge "counts as" being in these.
|
|
||||||
rewardDescription: "Says hi",
|
|
||||||
onComplete() {
|
|
||||||
console.log("hiii");
|
|
||||||
}, // Called when you successfully complete the challenge
|
|
||||||
onEnter() {
|
|
||||||
console.log("So challenging");
|
|
||||||
},
|
|
||||||
onExit() {
|
|
||||||
console.log("Sweet freedom!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
upgrades: {
|
|
||||||
data: {
|
|
||||||
11: {
|
|
||||||
title: "Generator of Genericness",
|
|
||||||
description: "Gain 1 Point every second.",
|
|
||||||
cost: new Decimal(1),
|
|
||||||
unlocked() {
|
|
||||||
return player.layers[this.layer].unlocked;
|
|
||||||
} // The upgrade is only visible when this is true
|
|
||||||
},
|
|
||||||
12: {
|
|
||||||
description:
|
|
||||||
"Point generation is faster based on your unspent Lollipops.",
|
|
||||||
cost: new Decimal(1),
|
|
||||||
unlocked() {
|
|
||||||
return hasUpgrade(this.layer, 11);
|
|
||||||
},
|
|
||||||
effect() {
|
|
||||||
// Calculate bonuses from the upgrade. Can return a single value or an object with multiple values
|
|
||||||
let ret = player.layers[this.layer].points
|
|
||||||
.add(1)
|
|
||||||
.pow(
|
|
||||||
player.layers[this.layer].upgrades!.includes(24)
|
|
||||||
? 1.1
|
|
||||||
: player.layers[this.layer].upgrades!.includes(14)
|
|
||||||
? 0.75
|
|
||||||
: 0.5
|
|
||||||
);
|
|
||||||
if (ret.gte("1e20000000")) ret = ret.sqrt().times("1e10000000");
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
effectDisplay() {
|
|
||||||
return format(this.effect as Decimal) + "x";
|
|
||||||
} // Add formatting to the effect
|
|
||||||
},
|
|
||||||
13: {
|
|
||||||
unlocked() {
|
|
||||||
return hasUpgrade(this.layer, 12);
|
|
||||||
},
|
|
||||||
onPurchase() {
|
|
||||||
// This function triggers when the upgrade is purchased
|
|
||||||
player.layers[this.layer].unlockOrder = 0;
|
|
||||||
},
|
|
||||||
style() {
|
|
||||||
if (hasUpgrade(this.layer, this.id))
|
|
||||||
return {
|
|
||||||
"background-color": "#1111dd"
|
|
||||||
};
|
|
||||||
else if (!this.canAfford) {
|
|
||||||
return {
|
|
||||||
"background-color": "#dd1111"
|
|
||||||
};
|
|
||||||
} // Otherwise use the default
|
|
||||||
},
|
|
||||||
canAfford() {
|
|
||||||
return player.points.lte(7);
|
|
||||||
},
|
|
||||||
pay() {
|
|
||||||
player.points = player.points.add(7);
|
|
||||||
},
|
|
||||||
fullDisplay:
|
|
||||||
"Only buyable with less than 7 points, and gives you 7 more. Unlocks a secret subtab."
|
|
||||||
},
|
|
||||||
22: {
|
|
||||||
title: "This upgrade doesn't exist",
|
|
||||||
description: "Or does it?.",
|
|
||||||
currencyLocation() {
|
|
||||||
return player.layers[this.layer].buyables;
|
|
||||||
}, // The object in player data that the currency is contained in
|
|
||||||
currencyDisplayName: "exhancers", // Use if using a nonstandard currency
|
|
||||||
currencyInternalName: 11, // Use if using a nonstandard currency
|
|
||||||
|
|
||||||
cost: new Decimal(3),
|
|
||||||
unlocked() {
|
|
||||||
return player.layers[this.layer].unlocked;
|
|
||||||
} // The upgrade is only visible when this is true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
buyables: {
|
|
||||||
showBRespecButton: true,
|
|
||||||
respec() {
|
|
||||||
// Optional, reset things and give back your currency. Having this function makes a respec button appear
|
|
||||||
player.layers[this.layer].points = player.layers[this.layer].points.add(
|
|
||||||
player.layers[this.layer].spentOnBuyables as Decimal
|
|
||||||
); // A built-in thing to keep track of this but only keeps a single value
|
|
||||||
this.reset();
|
|
||||||
resetLayer(this.layer, true); // Force a reset
|
|
||||||
},
|
|
||||||
respecButtonDisplay: "Respec Thingies", // Text on Respec button, optional
|
|
||||||
respecWarningDisplay:
|
|
||||||
"Are you sure? Respeccing these doesn't accomplish much.",
|
|
||||||
data: {
|
|
||||||
11: {
|
|
||||||
title: "Exhancers", // Optional, displayed at the top in a larger font
|
|
||||||
cost() {
|
|
||||||
// cost for buying xth buyable, can be an object if there are multiple currencies
|
|
||||||
let x = this.amount;
|
|
||||||
if (x.gte(25)) x = x.pow(2).div(25);
|
|
||||||
const cost = Decimal.pow(2, x.pow(1.5));
|
|
||||||
return cost.floor();
|
|
||||||
},
|
|
||||||
effect() {
|
|
||||||
// Effects of owning x of the items, x is a decimal
|
|
||||||
const x = this.amount;
|
|
||||||
const eff = {} as { first?: Decimal; second?: Decimal };
|
|
||||||
if (x.gte(0)) eff.first = Decimal.pow(25, x.pow(1.1));
|
|
||||||
else eff.first = Decimal.pow(1 / 25, x.times(-1).pow(1.1));
|
|
||||||
|
|
||||||
if (x.gte(0)) eff.second = x.pow(0.8);
|
|
||||||
else
|
|
||||||
eff.second = x
|
|
||||||
.times(-1)
|
|
||||||
.pow(0.8)
|
|
||||||
.times(-1);
|
|
||||||
return eff;
|
|
||||||
},
|
|
||||||
display() {
|
|
||||||
// Everything else displayed in the buyable button after the title
|
|
||||||
return (
|
|
||||||
"Cost: " +
|
|
||||||
format(this.cost!) +
|
|
||||||
" lollipops\n\
|
|
||||||
Amount: " +
|
|
||||||
player.layers[this.layer].buyables![this.id] +
|
|
||||||
"/4\n\
|
|
||||||
Adds + " +
|
|
||||||
format((this.effect as { first: Decimal; second: Decimal }).first) +
|
|
||||||
" things and multiplies stuff by " +
|
|
||||||
format((this.effect as { first: Decimal; second: Decimal }).second)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return player.layers[this.layer].unlocked;
|
|
||||||
},
|
|
||||||
canAfford() {
|
|
||||||
return player.layers[this.layer].points.gte(this.cost!);
|
|
||||||
},
|
|
||||||
buy() {
|
|
||||||
const cost = this.cost!;
|
|
||||||
player.layers[this.layer].points = player.layers[
|
|
||||||
this.layer
|
|
||||||
].points.sub(cost);
|
|
||||||
player.layers[this.layer].buyables![this.id] = player.layers[
|
|
||||||
this.layer
|
|
||||||
].buyables![this.id].add(1);
|
|
||||||
player.layers[this.layer].spentOnBuyables = (player.layers[
|
|
||||||
this.layer
|
|
||||||
].spentOnBuyables as Decimal).add(cost); // This is a built-in system that you can use for respeccing but it only works with a single Decimal value
|
|
||||||
},
|
|
||||||
buyMax() {}, // You'll have to handle this yourself if you want
|
|
||||||
style: { height: "222px" },
|
|
||||||
purchaseLimit: new Decimal(4),
|
|
||||||
sellOne() {
|
|
||||||
const amount = getBuyableAmount(this.layer, this.id)!;
|
|
||||||
if (amount.lte(0)) return; // Only sell one if there is at least one
|
|
||||||
setBuyableAmount(this.layer, this.id, amount.sub(1));
|
|
||||||
player.layers[this.layer].points = player.layers[
|
|
||||||
this.layer
|
|
||||||
].points.add(this.cost!);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onReset(resettingLayer: string) {
|
|
||||||
// Triggers when this layer is being reset, along with the layer doing the resetting. Not triggered by lower layers resetting, but is by layers on the same row.
|
|
||||||
if (
|
|
||||||
layers[resettingLayer].row != undefined &&
|
|
||||||
this.row != undefined &&
|
|
||||||
layers[resettingLayer].row! > this.row!
|
|
||||||
)
|
|
||||||
resetLayerData(this.layer, ["points"]); // This is actually the default behavior
|
|
||||||
},
|
|
||||||
automate() {}, // Do any automation inherent to this layer if appropriate
|
|
||||||
resetsNothing() {
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
onPrestige() {
|
|
||||||
return;
|
|
||||||
}, // Useful for if you gain secondary resources or have other interesting things happen to this layer when you reset it. You gain the currency after this function ends.
|
|
||||||
|
|
||||||
hotkeys: [
|
|
||||||
{
|
|
||||||
key: "c",
|
|
||||||
description: "reset for lollipops or whatever",
|
|
||||||
press() {
|
|
||||||
if (layers[this.layer].canReset) resetLayer(this.layer);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "ctrl+c",
|
|
||||||
description: "respec things",
|
|
||||||
press() {
|
|
||||||
layers[this.layer].buyables!.respec!();
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return hasUpgrade("c", "22");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
increaseUnlockOrder: [], // Array of layer names to have their order increased when this one is first unlocked
|
|
||||||
|
|
||||||
microtabs: {
|
|
||||||
stuff: {
|
|
||||||
data: {
|
|
||||||
first: {
|
|
||||||
display: `
|
|
||||||
<upgrades />
|
|
||||||
<div>confirmed</div>`
|
|
||||||
},
|
|
||||||
second: {
|
|
||||||
embedLayer: "f"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
otherStuff: {
|
|
||||||
// There could be another set of microtabs here
|
|
||||||
data: {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
bars: {
|
|
||||||
data: {
|
|
||||||
longBoi: {
|
|
||||||
fillStyle: { "background-color": "#FFFFFF" },
|
|
||||||
baseStyle: { "background-color": "#696969" },
|
|
||||||
textStyle: { color: "#04e050" },
|
|
||||||
|
|
||||||
borderStyle() {
|
|
||||||
return {};
|
|
||||||
},
|
|
||||||
direction: Direction.Right,
|
|
||||||
width: 300,
|
|
||||||
height: 30,
|
|
||||||
progress() {
|
|
||||||
return player.points
|
|
||||||
.add(1)
|
|
||||||
.log(10)
|
|
||||||
.div(10)
|
|
||||||
.toNumber();
|
|
||||||
},
|
|
||||||
display() {
|
|
||||||
return format(player.points) + " / 1e10 points";
|
|
||||||
},
|
|
||||||
unlocked: true
|
|
||||||
},
|
|
||||||
tallBoi: {
|
|
||||||
fillStyle: { "background-color": "#4BEC13" },
|
|
||||||
baseStyle: { "background-color": "#000000" },
|
|
||||||
textStyle: { "text-shadow": "0px 0px 2px #000000" },
|
|
||||||
|
|
||||||
borderStyle() {
|
|
||||||
return { "border-width": "7px" };
|
|
||||||
},
|
|
||||||
direction: Direction.Up,
|
|
||||||
width: 50,
|
|
||||||
height: 200,
|
|
||||||
progress() {
|
|
||||||
return player.points.div(100);
|
|
||||||
},
|
|
||||||
display() {
|
|
||||||
return formatWhole(player.points.div(1).min(100)) + "%";
|
|
||||||
},
|
|
||||||
unlocked: true
|
|
||||||
},
|
|
||||||
flatBoi: {
|
|
||||||
fillStyle: { "background-color": "#FE0102" },
|
|
||||||
baseStyle: { "background-color": "#222222" },
|
|
||||||
textStyle: { "text-shadow": "0px 0px 2px #000000" },
|
|
||||||
|
|
||||||
borderStyle() {
|
|
||||||
return {};
|
|
||||||
},
|
|
||||||
direction: Direction.Up,
|
|
||||||
width: 100,
|
|
||||||
height: 30,
|
|
||||||
progress() {
|
|
||||||
return player.layers.c.points.div(50);
|
|
||||||
},
|
|
||||||
unlocked: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Optional, lets you format the tab yourself by listing components. You can create your own components in v.js.
|
|
||||||
subtabs: {
|
|
||||||
"main tab": {
|
|
||||||
buttonStyle() {
|
|
||||||
return { color: "orange" };
|
|
||||||
},
|
|
||||||
notify: true,
|
|
||||||
display: `
|
|
||||||
<main-display />
|
|
||||||
<sticky><prestige-button /></sticky>
|
|
||||||
<resource-display />
|
|
||||||
<spacer height="5px" />
|
|
||||||
<button onclick='console.log("yeet")'>'HI'</button>
|
|
||||||
<div>Name your points!</div>
|
|
||||||
<TextField :value="player.layers.c.thingy" @input="value => player.layers.c.thingy = value" :field="false" />
|
|
||||||
<sticky style="color: red; font-size: 32px; font-family: Comic Sans MS;">I have {{ format(player.points) }} {{ player.layers.c.thingy }} points!</sticky>
|
|
||||||
<hr />
|
|
||||||
<milestones />
|
|
||||||
<spacer />
|
|
||||||
<upgrades />
|
|
||||||
<challenges />`,
|
|
||||||
glowColor: "blue"
|
|
||||||
},
|
|
||||||
thingies: {
|
|
||||||
resetNotify: true,
|
|
||||||
style() {
|
|
||||||
return { "background-color": "#222222", "--background": "#222222" };
|
|
||||||
},
|
|
||||||
buttonStyle() {
|
|
||||||
return { "border-color": "orange" };
|
|
||||||
},
|
|
||||||
display: `
|
|
||||||
<buyables />
|
|
||||||
<spacer />
|
|
||||||
<row style="width: 600px; height: 350px; background-color: green; border-style: solid;">
|
|
||||||
<Toggle :value="player.layers.c.beep" @change="value => player.layers.c.beep = value" />
|
|
||||||
<spacer width="30px" height="10px" />
|
|
||||||
<div>Beep</div>
|
|
||||||
<spacer />
|
|
||||||
<vr height="200px"/>
|
|
||||||
<column>
|
|
||||||
<prestige-button style="width: 150px; height: 80px" />
|
|
||||||
<prestige-button style="width: 100px; height: 150px" />
|
|
||||||
</column>
|
|
||||||
</row>
|
|
||||||
<spacer />
|
|
||||||
<img src="https://unsoftcapped2.github.io/The-Modding-Tree-2/discord.png" />`
|
|
||||||
},
|
|
||||||
jail: {
|
|
||||||
display: `
|
|
||||||
<infobox id="coolInfo" />
|
|
||||||
<bar id="longBoi" />
|
|
||||||
<spacer />
|
|
||||||
<row>
|
|
||||||
<column style="background-color: #555555; padding: 15px">
|
|
||||||
<div style="color: teal">Sugar level:</div><spacer /><bar id="tallBoi" />
|
|
||||||
</column>
|
|
||||||
<spacer />
|
|
||||||
<column>
|
|
||||||
<div>idk</div>
|
|
||||||
<spacer width="0" height="50px" />
|
|
||||||
<bar id="flatBoi" />
|
|
||||||
</column>
|
|
||||||
</row>
|
|
||||||
<spacer />
|
|
||||||
<div>It's jail because "bars"! So funny! Ha ha!</div>
|
|
||||||
<tree :nodes="[['f', 'c'], ['g', 'spook', 'h']]" />`
|
|
||||||
},
|
|
||||||
illuminati: {
|
|
||||||
unlocked() {
|
|
||||||
return hasUpgrade("c", 13);
|
|
||||||
},
|
|
||||||
display: `
|
|
||||||
<h1> C O N F I R M E D </h1>
|
|
||||||
<spacer />
|
|
||||||
<microtab family="stuff" style="width: 660px; height: 370px; background-color: brown; --background: brown; border: solid white; margin: auto" />
|
|
||||||
<div>Adjust how many points H gives you!</div>
|
|
||||||
<Slider :value="player.layers.c.otherThingy" @change="value => player.c.otherThingy = value" :min="1" :max="30" />`
|
|
||||||
}
|
|
||||||
},
|
|
||||||
style() {
|
|
||||||
return {
|
|
||||||
//'background-color': '#3325CC'
|
|
||||||
};
|
|
||||||
},
|
|
||||||
nodeStyle() {
|
|
||||||
return {
|
|
||||||
// Style on the layer node
|
|
||||||
color: "#3325CC",
|
|
||||||
"text-decoration": "underline"
|
|
||||||
};
|
|
||||||
},
|
|
||||||
glowColor: "orange", // If the node is highlighted, it will be this color (default is red)
|
|
||||||
componentStyles: {
|
|
||||||
challenge() {
|
|
||||||
return { height: "200px" };
|
|
||||||
},
|
|
||||||
"prestige-button"() {
|
|
||||||
return { color: "#AA66AA" };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tooltip() {
|
|
||||||
// Optional, tooltip displays when the layer is unlocked
|
|
||||||
let tooltip = "{{ formatWhole(player.layers.c.points) }} {{ layers.c.resource }}";
|
|
||||||
if (player.layers[this.layer].buyables![11].gt(0))
|
|
||||||
tooltip +=
|
|
||||||
"<br><i><br><br><br>{{ formatWhole(player.layers.c.buyables![11]) }} Exhancers</i>";
|
|
||||||
return tooltip;
|
|
||||||
},
|
|
||||||
shouldNotify() {
|
|
||||||
// Optional, layer will be highlighted on the tree if true.
|
|
||||||
// Layer will automatically highlight if an upgrade is purchasable.
|
|
||||||
return player.layers.c.buyables![11] == new Decimal(1);
|
|
||||||
},
|
|
||||||
mark: "https://unsoftcapped2.github.io/The-Modding-Tree-2/discord.png",
|
|
||||||
resetDescription: "Melt your points into "
|
|
||||||
} as RawLayer;
|
|
|
@ -1,151 +0,0 @@
|
||||||
/* eslint-disable */
|
|
||||||
import { layers as tmp } from "@/game/layers";
|
|
||||||
import player from "@/game/player";
|
|
||||||
import { RawLayer } from "@/typings/layer";
|
|
||||||
import Decimal, { formatWhole } from "@/util/bignum";
|
|
||||||
import { getClickableState } from "@/util/features";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
id: "f",
|
|
||||||
infoboxes: {
|
|
||||||
data: {
|
|
||||||
coolInfo: {
|
|
||||||
title: "Lore",
|
|
||||||
titleStyle: { color: "#FE0000" },
|
|
||||||
body: "DEEP LORE!",
|
|
||||||
bodyStyle: { "background-color": "#0000EE" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
startData() {
|
|
||||||
return {
|
|
||||||
unlocked: false,
|
|
||||||
points: new Decimal(0),
|
|
||||||
boop: false,
|
|
||||||
clickables: { [11]: "Start" } // Optional default Clickable state
|
|
||||||
};
|
|
||||||
},
|
|
||||||
color: "#FE0102",
|
|
||||||
requires() {
|
|
||||||
return new Decimal(10);
|
|
||||||
},
|
|
||||||
resource: "farm points",
|
|
||||||
baseResource: "points",
|
|
||||||
baseAmount() {
|
|
||||||
return player.points;
|
|
||||||
},
|
|
||||||
type: "static",
|
|
||||||
exponent: 0.5,
|
|
||||||
base: 3,
|
|
||||||
roundUpCost: true,
|
|
||||||
canBuyMax() {
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
name: "Farms",
|
|
||||||
//directMult() {return new Decimal(player.c.otherThingy)},
|
|
||||||
|
|
||||||
row: 1,
|
|
||||||
branches: [
|
|
||||||
{
|
|
||||||
target: "c",
|
|
||||||
"stroke-width": "25px",
|
|
||||||
stroke: "blue",
|
|
||||||
style: "filter: blur(5px)"
|
|
||||||
}
|
|
||||||
], // When this layer appears, a branch will appear from this layer to any layers here. Each entry can be a pair consisting of a layer id and a color.
|
|
||||||
|
|
||||||
tooltipLocked() {
|
|
||||||
// Optional, tooltip displays when the layer is locked
|
|
||||||
return "This weird farmer dinosaur will only see you if you have at least {{layers.f.requires}} points. You only have {{ formatWhole(player.points) }}";
|
|
||||||
},
|
|
||||||
midsection:
|
|
||||||
'<div><br/><img src="https://images.beano.com/store/24ab3094eb95e5373bca1ccd6f330d4406db8d1f517fc4170b32e146f80d?auto=compress%2Cformat&dpr=1&w=390" /><div>Bork Bork!</div></div>',
|
|
||||||
// The following are only currently used for "custom" Prestige type:
|
|
||||||
prestigeButtonDisplay() {
|
|
||||||
//Is secretly HTML
|
|
||||||
if (!this.canBuyMax)
|
|
||||||
return (
|
|
||||||
"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(tmp[this.layer].nextAt) +
|
|
||||||
" points)"
|
|
||||||
);
|
|
||||||
if (this.canBuyMax)
|
|
||||||
return (
|
|
||||||
"Hi! I'm a <u>weird dinosaur</u> and I'll give you <b>" +
|
|
||||||
formatWhole(tmp[this.layer].resetGain) +
|
|
||||||
"</b> Farm Points in exchange for all of your points and lollipops! (You'll get another one at " +
|
|
||||||
formatWhole(tmp[this.layer].nextAt) +
|
|
||||||
" points)"
|
|
||||||
);
|
|
||||||
},
|
|
||||||
canReset() {
|
|
||||||
return Decimal.gte(tmp[this.layer].baseAmount!, tmp[this.layer].nextAt);
|
|
||||||
},
|
|
||||||
// This is also non minimal, a Clickable!
|
|
||||||
clickables: {
|
|
||||||
masterButtonClick() {
|
|
||||||
if (getClickableState(this.layer, 11) == "Borkened...")
|
|
||||||
player.layers[this.layer].clickables![11] = "Start";
|
|
||||||
},
|
|
||||||
masterButtonDisplay() {
|
|
||||||
return getClickableState(this.layer, 11) == "Borkened..."
|
|
||||||
? "Fix the clickable!"
|
|
||||||
: "Does nothing";
|
|
||||||
}, // Text on Respec button, optional
|
|
||||||
data: {
|
|
||||||
11: {
|
|
||||||
title: "Clicky clicky!", // Optional, displayed at the top in a larger font
|
|
||||||
display() {
|
|
||||||
// Everything else displayed in the buyable button after the title
|
|
||||||
const data = getClickableState(this.layer, this.id);
|
|
||||||
return "Current state:<br>" + data;
|
|
||||||
},
|
|
||||||
unlocked() {
|
|
||||||
return player.layers[this.layer].unlocked;
|
|
||||||
},
|
|
||||||
canClick() {
|
|
||||||
return getClickableState(this.layer, this.id) !== "Borkened...";
|
|
||||||
},
|
|
||||||
click() {
|
|
||||||
switch (getClickableState(this.layer, this.id)) {
|
|
||||||
case "Start":
|
|
||||||
player.layers[this.layer].clickables![this.id] = "A new state!";
|
|
||||||
break;
|
|
||||||
case "A new state!":
|
|
||||||
player.layers[this.layer].clickables![this.id] = "Keep going!";
|
|
||||||
break;
|
|
||||||
case "Keep going!":
|
|
||||||
player.layers[this.layer].clickables![this.id] =
|
|
||||||
"Maybe that's a bit too far...";
|
|
||||||
break;
|
|
||||||
case "Maybe that's a bit too far...":
|
|
||||||
//makeParticles(coolParticle, 4)
|
|
||||||
player.layers[this.layer].clickables![this.id] = "Borkened...";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
player.layers[this.layer].clickables![this.id] = "Start";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hold() {
|
|
||||||
console.log("Clickkkkk...");
|
|
||||||
},
|
|
||||||
style() {
|
|
||||||
switch (getClickableState(this.layer, this.id)) {
|
|
||||||
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 {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} as RawLayer;
|
|
|
@ -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
11
src/data/layers/main.ts
Normal file
11
src/data/layers/main.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import { RawLayer } from "@/typings/layer";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
id: "main",
|
||||||
|
display: `
|
||||||
|
<div v-if="player.devSpeed === 0">Game Paused</div>
|
||||||
|
<div v-else-if="player.devSpeed && player.devSpeed !== 1">Dev Speed: {{ format(player.devSpeed) }}x</div>
|
||||||
|
<div>TODO: Board</div>
|
||||||
|
`,
|
||||||
|
minimizable: false
|
||||||
|
} as RawLayer;
|
156
src/data/mod.ts
156
src/data/mod.ts
|
@ -1,97 +1,13 @@
|
||||||
import { layers } from "@/game/layers";
|
|
||||||
import player from "@/game/player";
|
|
||||||
import { RawLayer } from "@/typings/layer";
|
import { RawLayer } from "@/typings/layer";
|
||||||
import { PlayerData } from "@/typings/player";
|
import { PlayerData } from "@/typings/player";
|
||||||
import Decimal from "@/util/bignum";
|
import Decimal from "@/util/bignum";
|
||||||
import {
|
|
||||||
getBuyableAmount,
|
|
||||||
hasMilestone,
|
|
||||||
hasUpgrade,
|
|
||||||
inChallenge,
|
|
||||||
upgradeEffect
|
|
||||||
} from "@/util/features";
|
|
||||||
import { computed } from "vue";
|
import { computed } from "vue";
|
||||||
import a from "./layers/aca/a";
|
import main from "./layers/main";
|
||||||
import c from "./layers/aca/c";
|
|
||||||
import f from "./layers/aca/f";
|
|
||||||
import demoLayer from "./layers/demo";
|
|
||||||
import demoInfinityLayer from "./layers/demo-infinity";
|
|
||||||
|
|
||||||
// Import initial layers
|
|
||||||
|
|
||||||
const g = {
|
|
||||||
id: "g",
|
|
||||||
symbol: "TH",
|
|
||||||
branches: ["c"],
|
|
||||||
color: "#6d3678",
|
|
||||||
shown: true,
|
|
||||||
canClick() {
|
|
||||||
return player.points.gte(10);
|
|
||||||
},
|
|
||||||
tooltip: "Thanos your points",
|
|
||||||
click() {
|
|
||||||
player.points = player.points.div(2);
|
|
||||||
console.log(this.layer);
|
|
||||||
}
|
|
||||||
} as RawLayer;
|
|
||||||
const h = {
|
|
||||||
id: "h",
|
|
||||||
branches: [
|
|
||||||
"g",
|
|
||||||
() => ({
|
|
||||||
target: "flatBoi",
|
|
||||||
featureType: "bar",
|
|
||||||
endOffset: {
|
|
||||||
x:
|
|
||||||
-50 +
|
|
||||||
100 *
|
|
||||||
(layers.c.bars!.data.flatBoi.progress instanceof Number
|
|
||||||
? (layers.c.bars!.data.flatBoi.progress as number)
|
|
||||||
: (layers.c.bars!.data.flatBoi.progress as Decimal).toNumber())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
],
|
|
||||||
tooltip() {
|
|
||||||
return "Restore your points to {{ player.c.otherThingy }}";
|
|
||||||
},
|
|
||||||
row: "side",
|
|
||||||
position: 3,
|
|
||||||
canClick() {
|
|
||||||
return player.points.lt(player.layers.c.otherThingy as Decimal);
|
|
||||||
},
|
|
||||||
click() {
|
|
||||||
player.points = new Decimal(player.layers.c.otherThingy as Decimal);
|
|
||||||
}
|
|
||||||
} as RawLayer;
|
|
||||||
const spook = {
|
|
||||||
id: "spook",
|
|
||||||
row: 1,
|
|
||||||
layerShown: "ghost"
|
|
||||||
} as RawLayer;
|
|
||||||
|
|
||||||
const main = {
|
|
||||||
id: "main",
|
|
||||||
display: `
|
|
||||||
<div v-if="player.devSpeed === 0">Game Paused</div>
|
|
||||||
<div v-else-if="player.devSpeed && player.devSpeed !== 1">Dev Speed: {{ format(player.devSpeed) }}x</div>
|
|
||||||
<div v-if="player.offTime != undefined">Offline Time: {{ formatTime(player.offTime.remain) }}</div>
|
|
||||||
<div>
|
|
||||||
<span v-if="player.points.lt('1e1000')">You have </span>
|
|
||||||
<h2>{{ format(player.points) }}</h2>
|
|
||||||
<span v-if="player.points.lt('1e1e6')"> points</span>
|
|
||||||
</div>
|
|
||||||
<div v-if="Decimal.gt(pointGain, 0)">
|
|
||||||
({{ player.oompsMag != 0 ? format(player.oomps) + " OOM" + (player.oompsMag < 0 ? "^OOM" : player.oompsMag > 1 ? "^" + player.oompsMag : "") + "s" : formatSmall(pointGain) }}/sec)
|
|
||||||
</div>
|
|
||||||
<spacer />
|
|
||||||
<tree :append="true" />`,
|
|
||||||
name: "Tree"
|
|
||||||
} as RawLayer;
|
|
||||||
|
|
||||||
export const getInitialLayers = (
|
export const getInitialLayers = (
|
||||||
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
||||||
playerData: Partial<PlayerData>
|
playerData: Partial<PlayerData>
|
||||||
): Array<RawLayer> => [main, f, c, a, g, h, spook, demoLayer, demoInfinityLayer];
|
): Array<RawLayer> => [main];
|
||||||
|
|
||||||
export function getStartingData(): Record<string, unknown> {
|
export function getStartingData(): Record<string, unknown> {
|
||||||
return {
|
return {
|
||||||
|
@ -104,73 +20,7 @@ export const hasWon = computed(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
export const pointGain = computed(() => {
|
export const pointGain = computed(() => {
|
||||||
if (!hasUpgrade("c", 11)) return new Decimal(0);
|
return new Decimal(0);
|
||||||
let gain = new Decimal(3.19);
|
|
||||||
if (hasUpgrade("c", 12)) gain = gain.times(upgradeEffect("c", 12) as Decimal);
|
|
||||||
if (hasMilestone("p", 0)) gain = gain.plus(0.01);
|
|
||||||
if (hasMilestone("p", 4)) {
|
|
||||||
if (hasUpgrade("p", 12)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 13)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 14)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 21)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 22)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 23)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 31)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 32)) gain = gain.plus(0.1);
|
|
||||||
if (hasUpgrade("p", 33)) gain = gain.plus(0.1);
|
|
||||||
}
|
|
||||||
if (hasUpgrade("p", 11))
|
|
||||||
gain = gain.plus(
|
|
||||||
hasUpgrade("p", 34)
|
|
||||||
? new Decimal(1).plus(layers.p.upgrades!.data[34].effect as Decimal)
|
|
||||||
: 1
|
|
||||||
);
|
|
||||||
if (hasUpgrade("p", 12))
|
|
||||||
gain = gain.times(
|
|
||||||
hasUpgrade("p", 34)
|
|
||||||
? new Decimal(1).plus(layers.p.upgrades!.data[34].effect as Decimal)
|
|
||||||
: 1
|
|
||||||
);
|
|
||||||
if (hasUpgrade("p", 13))
|
|
||||||
gain = gain.pow(
|
|
||||||
hasUpgrade("p", 34)
|
|
||||||
? new Decimal(1).plus(layers.p.upgrades!.data[34].effect as Decimal)
|
|
||||||
: 1
|
|
||||||
);
|
|
||||||
if (hasUpgrade("p", 14))
|
|
||||||
gain = gain.tetrate(
|
|
||||||
hasUpgrade("p", 34)
|
|
||||||
? new Decimal(1).plus(layers.p.upgrades!.data[34].effect as Decimal).toNumber()
|
|
||||||
: 1
|
|
||||||
);
|
|
||||||
|
|
||||||
if (hasUpgrade("p", 71)) gain = gain.plus(1.1);
|
|
||||||
if (hasUpgrade("p", 72)) gain = gain.times(1.1);
|
|
||||||
if (hasUpgrade("p", 73)) gain = gain.pow(1.1);
|
|
||||||
if (hasUpgrade("p", 74)) gain = gain.tetrate(1.1);
|
|
||||||
if (hasMilestone("p", 5) && !inChallenge("p", 22)) {
|
|
||||||
const asdf = hasUpgrade("p", 132)
|
|
||||||
? (player.layers.p.gp as Decimal).plus(1).pow(new Decimal(1).div(2))
|
|
||||||
: hasUpgrade("p", 101)
|
|
||||||
? (player.layers.p.gp as Decimal).plus(1).pow(new Decimal(1).div(3))
|
|
||||||
: hasUpgrade("p", 93)
|
|
||||||
? (player.layers.p.gp as Decimal).plus(1).pow(0.2)
|
|
||||||
: (player.layers.p.gp as Decimal).plus(1).log10();
|
|
||||||
gain = gain.plus(asdf);
|
|
||||||
if (hasUpgrade("p", 213)) gain = gain.mul(asdf.plus(1));
|
|
||||||
}
|
|
||||||
if (hasUpgrade("p", 104)) gain = gain.times(player.layers.p.points.plus(1).pow(0.5));
|
|
||||||
if (hasUpgrade("p", 142)) gain = gain.times(5);
|
|
||||||
if (player.layers.i.unlocked)
|
|
||||||
gain = gain.times(player.layers.i.points.plus(1).pow(hasUpgrade("p", 235) ? 6.942 : 1));
|
|
||||||
if (inChallenge("p", 11) || inChallenge("p", 21))
|
|
||||||
gain = new Decimal(10).pow(gain.log10().pow(0.75));
|
|
||||||
if (inChallenge("p", 12) || inChallenge("p", 21))
|
|
||||||
gain = gain.pow(new Decimal(1).sub(new Decimal(1).div(getBuyableAmount("p", 11)!.plus(1))));
|
|
||||||
if (hasUpgrade("p", 211)) gain = gain.times(getBuyableAmount("p", 21)!.plus(1));
|
|
||||||
if (hasMilestone("p", 13)) gain = gain.times(layers.p.buyables!.data[31].effect as Decimal);
|
|
||||||
if (hasMilestone("p", 13)) gain = gain.pow(layers.p.buyables!.data[42].effect as Decimal);
|
|
||||||
return gain;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"title": "The Modding Tree X",
|
"title": "Side Project",
|
||||||
"id": "tmt-x",
|
"id": "side-project",
|
||||||
"author": "thepaperpilot",
|
"author": "thepaperpilot",
|
||||||
"discordName": "The Paper Pilot Community",
|
"discordName": "The Paper Pilot Community",
|
||||||
"discordLink": "https://discord.gg/WzejVAx",
|
"discordLink": "https://discord.gg/WzejVAx",
|
||||||
|
@ -14,8 +14,8 @@
|
||||||
"useHeader": true,
|
"useHeader": true,
|
||||||
"banner": null,
|
"banner": null,
|
||||||
"logo": null,
|
"logo": null,
|
||||||
"initialTabs": [ "main", "c" ],
|
"initialTabs": [ "main" ],
|
||||||
|
|
||||||
"maxTickLength": 3600,
|
"maxTickLength": 3600,
|
||||||
"offlineLimit": 1
|
"offlineLimit": 0
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue