Set up webstorm and resolved a ton of its warnings

This commit is contained in:
thepaperpilot 2021-03-10 21:32:54 -06:00
parent f287032bd1
commit 366f4f6ebc
37 changed files with 1623 additions and 1291 deletions

View file

@ -1,9 +1,14 @@
// eslint-disable-next-line no-undef
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": "eslint:recommended",
"extends": [
"eslint:recommended",
'plugin:vue/recommended',
'@vue/standard'
],
"parserOptions": {
"ecmaVersion": 12
},

13
.idea/The-Modding-Tree.iml generated Normal file
View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="vue" level="application" />
</component>
</module>

21
.idea/codeStyles/Project.xml generated Normal file
View file

@ -0,0 +1,21 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="LINE_SEPARATOR" value="&#10;" />
<JSCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="FORCE_QUOTE_STYlE" value="true" />
</JSCodeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="INDENT_CASE_FROM_SWITCH" value="false" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
<option name="ALIGN_MULTILINE_FOR" value="false" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
<indentOptions>
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View file

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View file

@ -0,0 +1,24 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="7">
<item index="0" class="java.lang.String" itemvalue="nobr" />
<item index="1" class="java.lang.String" itemvalue="noembed" />
<item index="2" class="java.lang.String" itemvalue="comment" />
<item index="3" class="java.lang.String" itemvalue="noscript" />
<item index="4" class="java.lang.String" itemvalue="embed" />
<item index="5" class="java.lang.String" itemvalue="script" />
<item index="6" class="java.lang.String" itemvalue="fedropshadow" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
<inspection_tool class="JSUnresolvedVariable" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="JSValidateTypes" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
</profile>
</component>

7
.idea/jsLibraryMappings.xml generated Normal file
View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="PROJECT" libraries="{vue}" />
<includedPredefinedLibrary name="Node.js Core" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/The-Modding-Tree.iml" filepath="$PROJECT_DIR$/.idea/The-Modding-Tree.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

118
demo.html
View file

@ -1,118 +0,0 @@
<!DOCTYPE html>
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" type="text/css" href="popup.css" />
<link href="https://fonts.googleapis.com/css?family=Inconsolata" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script src="js/technical/break_eternity.js"></script>
<script src="js/technical/layerSupport.js"></script>
<script src="js/demo/demoTree.js"></script>
<script src="js/demo/demoLayers.js"></script>
<script src="js/demo/demoMod.js"></script>
<script src="js/technical/temp.js"></script>
<script src="js/game.js"></script>
<script src="js/utils.js"></script>
<script src="js/technical/systemComponents.js"></script>
<script src="js/components.js"></script>
<script src="js/technical/canvas.js"></script>
<script src="js/utils/NumberFormating.js"></script>
<script src="js/utils/options.js"></script>
<script src="js/utils/save.js"></script>
<script src="js/utils/themes.js"></script>
</head>
<body onload="load()">
<div id="app">
<canvas id="treeCanvas" class="canvas" v-if="!(gameEnded && !player.keepGoing)"></canvas>
<div v-if="false" id="loadingSection" class="fullWidth">
<h1>Loading... (If this takes too long it means there was a serious error!)←</h1>
</div>
<div class="vl" v-if="player.navTab!= 'none' &&player.tab!='none'&&!(gameEnded && !player.keepGoing)"></div>
<div v-if="(gameEnded && !player.keepGoing)" class="fullWidth">
<br>
<h2>{{modInfo.name}} {{VERSION.withoutName}}</h2><br><br>
<h3 v-html="modInfo.winText"></h3><br>
<h3>Please check the Discord to see if there are new content updates!</h3><br><br>
<div v-if="!player.timePlayedReset">It took you {{formatTime(player.timePlayed)}} to beat the game.</div>
<br>
<button class="longUpg can" onclick="hardReset(true)">Play Again</button>&nbsp;&nbsp;&nbsp;&nbsp;<button
class="longUpg can" onclick="keepGoing()">Keep Going</button>
<br><br><br>
<span v-if="modInfo.discordLink"><a class="link" v-bind:href="modInfo.discordLink"
target="_blank">{{modInfo.discordName}}</a><br></span>
<a class="link" href="https://discord.gg/F3xveHV" target="_blank"
v-bind:style="modInfo.discordLink ? {'font-size': '16px'} : {}">The Modding Tree Discord</a><br>
<a class="link" href="http://discord.gg/wwQfgPa" target="_blank" v-bind:style="{'font-size': '16px'}">Main
Prestige Tree server</a><br>
<br><br>
</div>
<div id="treeOverlay" v-if="!(gameEnded && !player.keepGoing)" class="treeOverlay" onscroll="resizeCanvas()"
v-bind:class="{ fullWidth: (player.tab == 'none' || player.navTab == 'none'), col: (player.tab !== 'none' && player.navTab !== 'none'), left: (player.tab !== 'none' && player.navTab !== 'none')}">
<div id="version" onclick="showTab('changelog-tab')" class="overlayThing" style="margin-right: 13px">
{{VERSION.withoutName}}</div>
<button
v-if="player.navTab == 'none' && (tmp[player.tab].row == 'side' || tmp[player.tab].row == 'otherside')"
class="other-back overlayThing" onclick="goBack()">←</button>
<img id="optionWheel" class="overlayThing" v-if="player.tab!='options-tab'" src="options_wheel.png"
onclick="showTab('options-tab')"></img>
<div id="info" v-if="player.tab!='info-tab'" class="overlayThing" onclick="showTab('info-tab')"><br>i</div>
<div id="discord" class="overlayThing">
<img onclick="window.open((modInfo.discordLink ? modInfo.discordLink : 'https://discord.gg/F3xveHV'),'mywindow')"
src="discord.png" target="_blank"></img>
<ul id="discord-links">
<li v-if="modInfo.discordLink"><a class="link" v-bind:href="modInfo.discordLink"
target="_blank">{{modInfo.discordName}}</a><br></li>
<li><a class="link" href="https://discord.gg/F3xveHV" target="_blank"
v-bind:style="modInfo.discordLink ? {'font-size': '16px'} : {}">The Modding Tree
Discord</a><br></li>
<li><a class="link" href="http://discord.gg/wwQfgPa" target="_blank"
v-bind:style="{'font-size': '16px'}">Main Prestige Tree server</a></li>
</ul>
</div>
<overlay-head v-if="!(gameEnded && !player.keepGoing)"></overlay-head>
<div class="sideLayers">
<div v-for="(node, index) in OTHER_LAYERS['side']">
<tree-node :layer='node' :abb='tmp[node].symbol' :size="'small'" :key="'side' + index"></tree-node>
</div>
</div>
</div>
<div v-if="!(gameEnded && !player.keepGoing)" id="treeTab" v-bind:style="{'z-index': (tmp.scrolled ? '1' : '5000')}" onscroll="resizeCanvas()"
v-bind:class="{ fullWidth: (player.tab == 'none' || player.navTab == 'none'), col: (player.tab !== 'none' && player.navTab !== 'none'), left: (player.tab !== 'none' && player.navTab !== 'none')}">
<br><br><br><br>
<overlay-head id="fakeHead" style="visibility: hidden;">
</overlay-head>
<layer-tab :layer="player.navTab == 'none' ? player.tab : player.navTab" :key="'left'"></layer-tab>
</div>
<!-- Popups -->
<div class="popup-container">
<transition-group name="fade">
<div v-for="popup,index in activePopups" class="popup" v-bind:class="popup.type"
v-bind:key="'p' + popup.id" v-on:click="() => {activePopups.splice(index, 1)}" v-bind:style="popup.color ? {'background-color': popup.color} : {}">
<h3>{{popup.title}}</h3><br>
<h2 v-html="popup.message"></h2>
</div>
</transition-group>
</div>
<div v-if="player.navTab !== 'none' && player.tab !== 'none' && !(gameEnded && !player.keepGoing)"
onscroll="resizeCanvas()"
v-bind:class="{ fullWidth: player.navTab == 'none', col: player.navTab != 'none', right: player.navTab != 'none', fast: true, tab: true}">
<div v-for="layer in LAYERS">
<div v-if="player.tab==layer">
<layer-tab :layer="layer" :back="'none'" :spacing="'50px'" :key="'left'"></layer-tab>
</div>
</div>
</div>
</div>
</body>

View file

@ -23,7 +23,7 @@
<script type="text/javascript" src="js/technical/systemComponents.js"></script>
<script type="text/javascript" src="js/components.js"></script>
<script type="text/javascript" src="js/technical/canvas.js"></script>
<script type="text/javascript" src="js/utils/NumberFormating.js"></script>
<script type="text/javascript" src="js/utils/NumberFormatting.js"></script>
<script type="text/javascript" src="js/utils/options.js"></script>
<script type="text/javascript" src="js/utils/save.js"></script>
<script type="text/javascript" src="js/utils/themes.js"></script>
@ -36,6 +36,8 @@
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<title>❚◀RONOS</title>
</head>
<body onload="load()">
@ -43,24 +45,25 @@
<canvas id="treeCanvas" class="canvas" v-if ="!(gameEnded && !player.keepGoing)"></canvas>
<div class="nav">
<img src="images/banner.png" height="50px" />
<img src="images/banner.png" height="50px" alt="banner"/>
<div id="version" onclick="showTab('changelog-tab')" style="margin-right: 13px">{{VERSION.withoutName}}</div>
<div style="flex-grow:1"></div>
<div id="discord">
<img onclick="window.open((modInfo.discordLink ? modInfo.discordLink : 'https://discord.gg/F3xveHV'),'mywindow')" src="discord.png" target="_blank"></img>
<img onclick="window.open((modInfo.discordLink ? modInfo.discordLink : 'https://discord.gg/F3xveHV'),'mywindow')"
src="discord.png" alt="discord"/>
<ul id="discord-links">
<li v-if="modInfo.discordLink"><a class="link" v-bind:href="modInfo.discordLink" target="_blank">{{modInfo.discordName}}</a><br></li>
<li><a class="link" href="https://discord.gg/F3xveHV" target="_blank" v-bind:style="modInfo.discordLink ? {'font-size': '16px'} : {}">The Modding Tree Discord</a><br></li>
<li><a class="link" href="http://discord.gg/wwQfgPa" target="_blank" v-bind:style="{'font-size': '16px'}">Main Prestige Tree server</a></li>
</ul>
</div>
<div id="info" v-if="player.tab!='info'" onclick="showTab('info-tab')"><br>i</div>
<img id="optionWheel" v-if="player.tab!='options'" src="options_wheel.png" onclick="showTab('options-tab')"></img>
<div id="info" v-if="player.tab!=='info'" onclick="showTab('info-tab')"><br>i</div>
<img id="optionWheel" v-if="player.tab!=='options'" src="options_wheel.png" onclick="showTab('options-tab')" alt="options"/>
</div>
<div v-if="false" id="loadingSection" class="fullWidth">
<h1>Loading...<br>(If this takes too long it means there was a serious error!)</h1>
</div>
<div class="vl" v-if="player.navTab!= 'none' &&player.tab!='none'&&!(gameEnded && !player.keepGoing)"></div>
<div class="vl" v-if="player.navTab!== 'none' &&player.tab!=='none'&&!(gameEnded && !player.keepGoing)"></div>
<div v-if="(gameEnded && !player.keepGoing)" class="fullWidth">
<br>
<h2>{{modInfo.name}} {{VERSION.withoutName}}</h2><br><br>
@ -81,8 +84,8 @@
</div>
<div id="treeOverlay" v-if="!(gameEnded && !player.keepGoing)" class="treeOverlay" onscroll="resizeCanvas()"
v-bind:class="{ fullWidth: (player.tab == 'none' || player.navTab == 'none'), col: (player.tab !== 'none' && player.navTab !== 'none'), left: (player.tab !== 'none' && player.navTab !== 'none')}">
<button v-if= "player.navTab == 'none' && (tmp[player.tab].row == 'side' || tmp[player.tab].row == 'otherside')" class="other-back overlayThing" onclick="goBack()"></button>
v-bind:class="{ fullWidth: (player.tab === 'none' || player.navTab === 'none'), col: (player.tab !== 'none' && player.navTab !== 'none'), left: (player.tab !== 'none' && player.navTab !== 'none')}">
<button v-if= "player.navTab === 'none' && (tmp[player.tab].row === 'side' || tmp[player.tab].row === 'otherside')" class="other-back overlayThing" onclick="goBack()"></button>
<overlay-head v-if="!(gameEnded && !player.keepGoing)"></overlay-head>
<div class="sideLayers">
<div v-for="(node, index) in OTHER_LAYERS['side']">
@ -92,19 +95,19 @@
</div>
<div v-if="!(gameEnded && !player.keepGoing)" id="treeTab" v-bind:style="{'z-index': (tmp.scrolled ? '1' : '5000')}" onscroll="resizeCanvas()"
v-bind:class="{ fullWidth: (player.tab == 'none' || player.navTab == 'none'), col: (player.tab !== 'none' && player.navTab !== 'none'), left: (player.tab !== 'none' && player.navTab !== 'none')}">
v-bind:class="{ fullWidth: (player.tab === 'none' || player.navTab === 'none'), col: (player.tab !== 'none' && player.navTab !== 'none'), left: (player.tab !== 'none' && player.navTab !== 'none')}">
<br>
<overlay-head id="fakeHead" style="visibility: hidden;">
</overlay-head>
<layer-tab :layer="player.navTab == 'none' ? player.tab : player.navTab" :key="'left'"></layer-tab>
<layer-tab :layer="player.navTab === 'none' ? player.tab : player.navTab" :key="'left'"></layer-tab>
</div>
<!-- Popups -->
<div class="popup-container">
<transition-group name="fade">
<div v-for="popup,index in activePopups" class="popup" v-bind:class="popup.type"
<div v-for="(popup, index) in activePopups" class="popup" v-bind:class="popup.type"
v-bind:key="'p' + popup.id" v-on:click="() => {activePopups.splice(index, 1)}" v-bind:style="popup.color ? {'background-color': popup.color} : {}">
<h3>{{popup.title}}</h3><br>
<h2 v-html="popup.message"></h2>
@ -113,9 +116,9 @@
</div>
<div v-if="player.navTab !== 'none' && player.tab !== 'none' && !(gameEnded && !player.keepGoing)" onscroll="resizeCanvas()"
v-bind:class="{ fullWidth: player.navTab == 'none', col: player.navTab != 'none', right: player.navTab != 'none', fast: true, tab: true}">
v-bind:class="{ fullWidth: player.navTab === 'none', col: player.navTab !== 'none', right: player.navTab !== 'none', fast: true, tab: true}">
<div v-for="layer in LAYERS" >
<div v-if="player.tab==layer" >
<div v-if="player.tab===layer" >
<layer-tab :layer="layer" :back="'none'" :spacing="'50px'" :key="'left'"></layer-tab>
</div>
</div>

View file

@ -1,515 +0,0 @@
var testTree = [["f", "c"],
["g", "spook", "h"]]
addLayer("c", {
layer: "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),
buyables: {}, // You don't actually have to initialize this one
beep: false,
}},
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
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))
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: (true == false ? 0 : Decimal.pow(player[this.layer].points, 0.2)),
icecreamCap: (player[this.layer].points * 10)
}},
effectDescription() { // Optional text to describe the effects
eff = this.effect();
eff.waffleBoost = eff.waffleBoost.times(buyableEffect(this.layer, 11).first)
return "which are boosting waffles by "+format(eff.waffleBoost)+" and increasing the Ice Cream cap by "+format(eff.icecreamCap)
},
infoboxes:{
coolInfo: {
title: "Lore",
titleStyle: {'color': '#FE0000'},
body: "DEEP LORE!",
bodyStyle: {'background-color': "#0000EE"}
}
},
milestones: {
0: {requirementDescription: "3 Lollipops",
done() {return player[this.layer].best.gte(3)}, // Used to determine when to give the milestone
effectDescription: "Unlock the next milestone",
},
1: {requirementDescription: "4 Lollipops",
unlocked() {return hasMilestone(this.layer, 0)},
done() {return player[this.layer].best.gte(4)},
effectDescription: "You can toggle beep and boop (which do nothing)",
toggles: [
["c", "beep"], // Each toggle is defined by a layer and the data toggled for that layer
["f", "boop"]],
style() {
if(hasMilestone(this.layer, this.id)) return {
'background-color': '#1111DD'
}},
},
},
challenges: {
rows: 2,
cols: 12,
11: {
name: "Fun",
completionLimit: 3,
challengeDescription() {return "Makes the game 0% harder<br>"+challengeCompletions(this.layer, this.id) + "/" + this.completionLimit + " completions"},
unlocked() { return player[this.layer].best.gt(0) },
goalDescription: 'Have 20 points I guess',
canComplete() {
return player.points.gte(20)
},
rewardEffect() {
let ret = player[this.layer].points.add(1).tetrate(0.02)
return ret;
},
rewardDisplay() { return format(this.rewardEffect())+"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 complete the challenge
},
},
upgrades: {
rows: 2,
cols: 3,
11: {
title: "Generator of Genericness",
description: "Gain 1 Point every second.",
cost: new Decimal(1),
unlocked() { return player[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[this.layer].points.add(1).pow(player[this.layer].upgrades.includes(24)?1.1:(player[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())+"x" }, // Add formatting to the effect
},
13: {
unlocked() { return (hasUpgrade(this.layer, 12))},
onPurchase() { // This function triggers when the upgrade is purchased
player[this.layer].unlockOrder = 0
},
style() {
if (hasUpgrade(this.layer, this.id)) return {
'background-color': '#1111dd'
}
else if (!canAffordUpgrade(this.layer, this.id)) {
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[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[this.layer].unlocked }, // The upgrade is only visible when this is true
},
},
buyables: {
rows: 1,
cols: 12,
showRespec: true,
respec() { // Optional, reset things and give back your currency. Having this function makes a respec button appear
player[this.layer].points = player[this.layer].points.add(player[this.layer].spentOnBuyables) // A built-in thing to keep track of this but only keeps a single value
resetBuyables(this.layer)
doReset(this.layer, true) // Force a reset
},
respecText: "Respec Thingies", // Text on Respec button, optional
11: {
title: "Exhancers", // Optional, displayed at the top in a larger font
cost(x=player[this.layer].buyables[this.id]) { // cost for buying xth buyable, can be an object if there are multiple currencies
if (x.gte(25)) x = x.pow(2).div(25)
let cost = Decimal.pow(2, x.pow(1.5))
return cost.floor()
},
effect(x=player[this.layer].buyables[this.id]) { // Effects of owning x of the items, x is a decimal
let eff = {}
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
let data = tmp[this.layer].buyables[this.id]
return "Cost: " + format(data.cost) + " lollipops\n\
Amount: " + player[this.layer].buyables[this.id] + "\n\
Adds + " + format(data.effect.first) + " things and multiplies stuff by " + format(data.effect.second)
},
unlocked() { return player[this.layer].unlocked },
canAfford() {
return player[this.layer].points.gte(tmp[this.layer].buyables[this.id].cost)},
buy() {
cost = tmp[this.layer].buyables[this.id].cost
player[this.layer].points = player[this.layer].points.sub(cost)
player[this.layer].buyables[this.id] = player[this.layer].buyables[this.id].add(1)
player[this.layer].spentOnBuyables = player[this.layer].spentOnBuyables.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'},
sellOne() {
let 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[this.layer].points = player[this.layer].points.add(this.cost)
},
},
},
doReset(resettingLayer){ // 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 > this.row) layerDataReset(this.layer, ["points"]) // This is actually the default behavior
},
layerShown() {return true}, // Condition for when layer appears on the tree
automate() {
}, // Do any automation inherent to this layer if appropriate
resetsNothing() {return false},
onPrestige(gain) {
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: "C: reset for lollipops or whatever", onPress(){if (canReset(this.layer)) doReset(this.layer)}, unlocked() {return player.points.gte(10)}},
{key: "ctrl+c", description: "Ctrl+c: respec things", onPress(){if (player[this.layer].unlocked) respecBuyables(this.layer)}},
],
increaseUnlockOrder: [], // Array of layer names to have their order increased when this one is first unlocked
microtabs: {
stuff: {
first: {
content: ["upgrades", ["display-text", function() {return "confirmed"}]]
},
second: {
content: [["upgrade", 11],
["row", [["upgrade", 11], "blank", "blank", ["upgrade", 11],]],
["display-text", function() {return "double confirmed"}]]
},
},
otherStuff: {
// There could be another set of microtabs here
}
},
bars: {
longBoi: {
fillStyle: {'background-color' : "#FFFFFF"},
baseStyle: {'background-color' : "#696969"},
textStyle: {'color': '#04e050'},
borderStyle() {return {}},
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: 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: UP,
width: 100,
height: 30,
progress() {
return player.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.
tabFormat: {
"main tab": {
buttonStyle() {return {'color': 'orange'}},
shouldNotify: true,
content:
["main-display",
"prestige-button", "resource-display",
["blank", "5px"], // Height
["raw-html", function() {return "<button onclick='console.log(`yeet`)'>'HI'</button>"}],
["display-text",
function() {return 'I have ' + format(player.points) + ' pointy points!'},
{"color": "red", "font-size": "32px", "font-family": "Comic Sans MS"}],
"h-line", "milestones", "blank", "upgrades", "challenges"],
},
thingies: {
style() {return {'background-color': '#222222'}},
buttonStyle() {return {'border-color': 'orange'}},
content:[
["buyables", ""], "blank",
["row", [
["toggle", ["c", "beep"]], ["blank", ["30px", "10px"]], // Width, height
["display-text", function() {return "Beep"}], "blank", ["v-line", "200px"],
["column", [
["prestige-button", "", {'width': '150px', 'height': '80px'}],
["prestige-button", "", {'width': '100px', 'height': '150px'}],
]],
], {'width': '600px', 'height': '350px', 'background-color': 'green', 'border-style': 'solid'}],
"blank",
["display-image", "discord.png"],],
},
jail: {
content: [
["infobox", "coolInfo"],
["bar", "longBoi"], "blank",
["row", [
["column", [
["display-text", "Sugar level:", {'color': 'teal'}], "blank", ["bar", "tallBoi"]],
{'background-color': '#555555', 'padding': '15px'}],
"blank",
["column", [
["display-text", "idk"],
["blank", ['0', '50px']], ["bar", "flatBoi"]
]],
]],
"blank", ["display-text", "It's jail because \"bars\"! So funny! Ha ha!"],["tree", testTree],
],
},
illuminati: {
unlocked() {return (hasUpgrade("c", 13))},
content:[
["raw-html", function() {return "<h1> C O N F I R M E D </h1>"}], "blank",
["microtabs", "stuff", {'width': '600px', 'height': '350px', 'background-color': 'brown', 'border-style': 'solid'}]
]
}
},
style() {return {
//'background-color': '#3325CC'
}},
nodeStyle() {return { // Style on the layer node
'color': '#3325CC',
'text-decoration': 'underline'
}},
componentStyles: {
"challenge"() {return {'height': '200px'}},
"prestige-button"() {return {'color': '#AA66AA'}},
},
tooltip() { // Optional, tooltip displays when the layer is unlocked
let tooltip = formatWhole(player[this.layer].points) + " " + this.resource
if (player[this.layer].buyables[11].gt(0)) tooltip += "\n" + formatWhole(player[this.layer].buyables[11]) + " Exhancers"
return tooltip
},
shouldNotify() { // Optional, layer will be highlighted on the tree if true.
// Layer will automatically highlight if an upgrade is purchasable.
return (player.c.buyables[11] == 1)
},
resetDescription: "Melt your points into ",
})
// This layer is mostly minimal but it uses a custom prestige type and a clickable
addLayer("f", {
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 hasAchievement('a', 13)},
row: 1,
layerShown() {return true},
branches: ["c"], // 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 " + this.requires() + " points. You only have " + formatWhole(player.points))
},
midsection: [
"blank", ['display-image', 'https://images.beano.com/store/24ab3094eb95e5373bca1ccd6f330d4406db8d1f517fc4170b32e146f80d?auto=compress%2Cformat&dpr=1&w=390'],
["display-text", "Bork bork!"]
],
// The following are only currently used for "custom" Prestige type:
prestigeButtonText() { //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[layer].nextAtDisp) + " points)"
},
getResetGain() {
return getResetGain(this.layer, useType = "static")
},
getNextAt(canMax=false) { //
return getNextAt(this.layer, canMax, useType = "static")
},
canReset() {
return tmp[this.layer].baseAmount.gte(tmp[this.layer].nextAt)
},
// This is also non minimal, a Clickable!
clickables: {
rows: 1,
cols: 1,
masterButtonPress() { // Optional, reset things and give back your currency. Having this function makes a respec button appear
if (getClickableState(this.layer, 11) == "Borkened...")
player[this.layer].clickables[11] = "Start"
},
masterButtonText() {return (getClickableState(this.layer, 11) == "Borkened...") ? "Fix the clickable!" : "Does nothing"}, // Text on Respec button, optional
11: {
title: "Clicky clicky!", // Optional, displayed at the top in a larger font
display() { // Everything else displayed in the buyable button after the title
let data = getClickableState(this.layer, this.id)
return "Current state:<br>" + data
},
unlocked() { return player[this.layer].unlocked },
canClick() {
return getClickableState(this.layer, this.id) !== "Borkened..."},
onClick() {
switch(getClickableState(this.layer, this.id)){
case "Start":
player[this.layer].clickables[this.id] = "A new state!"
break;
case "A new state!":
player[this.layer].clickables[this.id] = "Keep going!"
break;
case "Keep going!":
player[this.layer].clickables[this.id] = "Maybe that's a bit too far..."
break;
case "Maybe that's a bit too far...":
player[this.layer].clickables[this.id] = "Borkened..."
break;
default:
player[this.layer].clickables[this.id] = "Start"
break;
}
},
style() {
switch(getClickableState(this.layer, this.id)){
case "Start":
return {'background-color': 'green'}
break;
case "A new state!":
return {'background-color': 'yellow'}
break;
case "Keep going!":
return {'background-color': 'orange'}
break;
case "Maybe that's a bit too far...":
return {'background-color': 'red'}
break;
default:
return {}
break;
}},
},
},
},
)
// A side layer with achievements, with no prestige
addLayer("a", {
startData() { return {
unlocked: true,
points: new Decimal(0),
}},
color: "yellow",
resource: "achievement power",
row: "side",
tooltip() { // Optional, tooltip displays when the layer is locked
return ("Achievements")
},
achievementPopups: true,
achievements: {
rows: 2,
cols: 3,
11: {
image: "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
textStyle: {'color': '#04e050'},
},
13: {
name: "EIEIO",
done() {return player.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!")}
},
},
},
)

View file

@ -1,77 +0,0 @@
let modInfo = {
name: "The Modding Tree",
id: "modbase",
pointsName: "points",
discordName: "",
discordLink: "",
initialStartPoints: new Decimal (10), // Used for hard resets and new players
offlineLimit: 1, // In hours
}
// Set your version in num and name
let VERSION = {
num: "2.π",
name: "Incrementally Updated",
}
let changelog = `<h1>Changelog:</h1><br>
<h3>v0.0</h3><br>
- Added things.<br>
- Added stuff.`
let winText = `Congratulations! You have reached the end and beaten this game, but for now...`
// If you add new functions anywhere inside of a layer, and those functions have an effect when called, add them here.
// (The ones here are examples, all official functions are already taken care of)
var doNotCallTheseFunctionsEveryTick = ["doReset", "buy", "onPurchase", "blowUpEverything"]
function getStartPoints(){
return new Decimal(modInfo.initialStartPoints)
}
// Determines if it should show points/sec
function canGenPoints(){
return hasUpgrade("c", 11)
}
// Calculate points/sec!
function getPointGen() {
if(!canGenPoints())
return new Decimal(0)
let gain = new Decimal(1)
if (hasUpgrade("c", 12)) gain = gain.times(upgradeEffect("c", 12))
return gain
}
// You can add non-layer related variables that should to into "player" and be saved here, along with default values
function addedPlayerData() { return {
weather: "Yes",
happiness: new Decimal(72),
}}
// Display extra things at the top of the page
var displayThings = [
function() {if (player.points.eq(69)) return "Tee hee!"},
function() {if (player.f.points.gt(1)) return `You have ${player.f.points} farm points. (Which do nothing.)`},
function() {if (inChallenge("c", 11)) return "The game is currently <h1>0%</h1> harder."},
]
// Determines when the game "ends"
function isEndgame() {
return player.points.gte(new Decimal("e280000000"))
}
// Less important things beyond this point!
// You can change this if you have things that can be messed up by long tick lengths
function maxTickLength() {
return(3600) // Default is 1 hour which is just arbitrarily large
}
// Use this if you need to undo inflation from an older version. If the version is older than the version that fixed the issue,
// you can cap their current resources with this.
function fixOldSave(oldVersion){
}

View file

@ -1,49 +0,0 @@
// treeLayout will override the default tree's layout if used
var layoutInfo = {
startTab: "c",
showTree: true,
//treeLayout: ""
}
// A "ghost" layer which offsets f in the tree
addNode("spook", {
row: 1,
layerShown: "ghost",
},
)
// A "ghost" layer which offsets f in the tree
addNode("g", {
symbol: "TH",
branches: ["c"],
color: '#6d3678',
layerShown: true,
canClick() {return player.points.gte(10)},
tooltip: "Thanos your points",
tooltipLocked: "Thanos your points",
onClick() {player.points = player.points.div(2)
console.log(this.layer)}
},
)
// A "ghost" layer which offsets f in the tree
addNode("h", {
branches: ["g"],
layerShown: true,
tooltip: "Restore your points to 10",
tooltipLocked: "Restore your points to 10",
row: "side",
canClick() {return player.points.lt(10)},
onClick() {player.points = new Decimal(10)}
},
)
addLayer("tree-tab", {
tabFormat: [["tree", function() {return (layoutInfo.treeLayout ? layoutInfo.treeLayout : TREE_LAYERS)}]]
})

View file

@ -204,11 +204,6 @@ addLayer("distill", {
updateInstrument("bainMarie", 6, diff);
updateInstrument("vapours", 8, diff);
}
let jobLevel = new Decimal(getJobLevel(this.layer));
if (jobLevel.neq(player[this.layer].lastLevel)) {
doPopup("none", `Level ${jobLevel}`, "Level Up!", 3, layers[this.layer].color);
player[this.layer].lastLevel = jobLevel;
}
},
onAddPoints(gain) {
let xpGain = gain;
@ -216,6 +211,7 @@ addLayer("distill", {
xpGain = xpGain.times(layers.generators.clickables[this.layer].effect());
}
player[this.layer].xp = player[this.layer].xp.add(xpGain);
checkJobXP(this.layer);
},
milestones: {
0: {

View file

@ -108,11 +108,6 @@ addLayer("flowers", {
}
player[this.layer].realTime += diff;
}
let jobLevel = new Decimal(getJobLevel(this.layer));
if (jobLevel.neq(player[this.layer].lastLevel) && player[this.layer].lastLevel.lte(100)) {
doPopup("none", `Level ${formatWhole(jobLevel)}`, "Level Up!", 3, layers[this.layer].color);
player[this.layer].lastLevel = jobLevel;
}
},
onAddPoints(gain) {
let xpGain = gain;
@ -124,6 +119,7 @@ addLayer("flowers", {
xpGain = xpGain.times(layers.generators.clickables[this.layer].effect());
}
player[this.layer].xp = player[this.layer].xp.add(xpGain);
checkJobXP(this.layer);
},
milestones: {
0: {

View file

@ -53,7 +53,7 @@ function getBatteryCapBuyable(id, title) {
height: "150px"
},
display() {
return `Mutliply battery cap by ${formatWhole(buyableEffect(this.layer, 13))}x.<br/><br/>Currently: ${formatWhole(this.effect())}<br/><br/>Cost: ${formatWhole(this.cost())} charge`;
return `Multiply battery cap by ${formatWhole(buyableEffect(this.layer, 13))}x.<br/><br/>Currently: ${formatWhole(this.effect())}<br/><br/>Cost: ${formatWhole(this.cost())} charge`;
},
cost(x) {
const amount = x || getBuyableAmount(this.layer, this.id);
@ -204,11 +204,6 @@ addLayer("generators", {
}
});
}
let jobLevel = new Decimal(getJobLevel(this.layer));
if (jobLevel.neq(player[this.layer].lastLevel) && player[this.layer].lastLevel.lte(100)) {
doPopup("none", `Level ${formatWhole(jobLevel)}`, "Level Up!", 3, layers[this.layer].color);
player[this.layer].lastLevel = jobLevel;
}
},
onAddPoints(gain) {
let xpGain = gain;
@ -216,6 +211,7 @@ addLayer("generators", {
xpGain = xpGain.times(layers.generators.clickables[this.layer].effect());
}
player[this.layer].xp = player[this.layer].xp.add(xpGain);
checkJobXP(this.layer);
},
milestones: {
0: {
@ -517,8 +513,8 @@ let animateElectricity = () => {
const numPoints = Math.max(3, Math.floor(numberOfPoints * height / maxHeight));
let coords = new Array(numPoints).fill(1).map((_,i) => {
let first = i == 0;
let last = i == numPoints - 1;
let first = i === 0;
let last = i === numPoints - 1;
let y = (height - margin * 2) / (numPoints - 1) * i + margin;
let x = (first || last) ? width / 2 : (width - amplitude) / 2 + Math.random() * amplitude;

View file

@ -147,7 +147,7 @@ addLayer("sands", {
tabFormat: {
"Main": {
content: () => {
const percentChipped = new Decimal(1).sub(player.sands.shrunkAmount.div(nextStoneCost())).times(10000);
new Decimal(1).sub(player.sands.shrunkAmount.div(nextStoneCost())).times(10000);
return player.tab !== "sands" ? null : [
"main-display",
"blank",
@ -321,11 +321,6 @@ addLayer("sands", {
}
}
}
let jobLevel = new Decimal(getJobLevel(this.layer));
if (jobLevel.neq(player[this.layer].lastLevel) && player[this.layer].lastLevel.lte(100)) {
doPopup("none", `Level ${formatWhole(jobLevel)}`, "Level Up!", 3, layers[this.layer].color);
player[this.layer].lastLevel = jobLevel;
}
},
onAddPoints(gain) {
let xpGain = gain;
@ -336,6 +331,7 @@ addLayer("sands", {
xpGain = xpGain.times(Decimal.pow(buyableEffect("sands", "glass"), 2));
}
player[this.layer].xp = player[this.layer].xp.add(xpGain);
checkJobXP(this.layer);
},
milestones: {
0: {

View file

@ -18,16 +18,18 @@ const cards = {
}
}
}),
gainInsight: createCard("And it shall be called... the Earth.", level => level == 0 ? "Gain a key insight." : `Gain ${formatWhole(level.add(1))} key insights.`, level => {
gainInsight: createCard("And it shall be called... the Earth.", level => level === 0 ? "Gain a key insight." : `Gain ${formatWhole(level.add(1))} key insights.`, level => {
player.study.insights = player.study.insights.add(level).add(1);
player.study.xp = player.study.xp.add(level.add(1).times(10));
checkJobXP(this.layer);
}),
gainBigInsight: createCard("Yes! I shall design this computer for you.", level => `Gain ${new Decimal(player.study.cards.length).times(level.add(1)).sqrt().floor()} key insights.<br/>(based on number of cards in the deck)`, level => {
const amount = new Decimal(player.study.cards.length).times(level.add(1)).sqrt().floor();
player.study.insights = player.study.insights.add(amount);
player.study.xp = player.study.xp.add(amount.times(10));
checkJobXP(this.layer);
}),
playTwice: createCard("Oh no, not again.", level => level == 0 ? "Play the next card twice." : `Play the next card twice, with the effect boosted by ${level.div(4)} levels.`, null, (nextCard, level) => {
playTwice: createCard("Oh no, not again.", level => level === 0 ? "Play the next card twice." : `Play the next card twice, with the effect boosted by ${level.div(4)} levels.`, null, (nextCard, level) => {
if (nextCard in cards && cards[nextCard].onDraw) {
cards[nextCard].onDraw(cardLevel(nextCard).add(level.div(4)));
cards[nextCard].onDraw(cardLevel(nextCard).add(level.div(4)), false);
@ -58,7 +60,10 @@ const cards = {
return text;
}, () => player.study.sellDiscount = player.study.sellDiscount.add(1)),
soldOut: createCard("Out of Stock!"),
gainXp: createCard("A billion times over ... and no one learns anything.", level => `Gain xp equal to ${level == 0 ? "" : `${format(level.div(4).add(1))}x times `}your number of properties.`, level => player.study.xp = player.study.xp.add(player.study.points.times(level.div(4).add(1))))
gainXp: createCard("A billion times over ... and no one learns anything.", level => `Gain xp equal to ${level === 0 ? "" : `${format(level.div(4).add(1))}x times `}your number of properties.`, level => {
player.study.xp = player.study.xp.add(player.study.points.times(level.div(4).add(1)));
checkJobXP(this.layer);
})
};
const shopCards = [
@ -85,11 +90,12 @@ const cardFormat = (card, id = "", className = "", onclick = "", overrideLevel =
return card == null ? null : ["display-text", `
<div id="${id}" class="card ${className}" style="width: ${width}; height: ${height};" onclick="${onclick}">
<span style="border-bottom: 1px solid white; margin: 0; max-height: calc(50% - 30px); padding-bottom: 10px;">
<!--suppress HtmlUnknownTag -->
<h3>${isFunction(cards[card].title) ? cards[card].title(overrideLevel || cardLevel(card)) : cards[card].title}</h3>
</span>
<span style="flex-basis: 0%;"><span>${isFunction(cards[card].description) ? cards[card].description(overrideLevel || cardLevel(card)) : cards[card].description}</span></span>
<span style="flex-basis: 0;"><span>${isFunction(cards[card].description) ? cards[card].description(overrideLevel || cardLevel(card)) : cards[card].description}</span></span>
<span style="flex-shrink: 1"></span>
<img src="images/Time2wait.svg"/>
<img src="images/Time2wait.svg" alt="hourglass"/>
</div>`];
};
@ -118,6 +124,7 @@ function getCardUpgradeBuyable(id) {
};
}
// noinspection JSUnusedGlobalSymbols
function purchaseCard(index) {
const { card, price } = player.study.shop[index];
if (card && player.study.insights.gte(price)) {
@ -127,6 +134,7 @@ function purchaseCard(index) {
}
}
// noinspection JSUnusedGlobalSymbols
function toggleSelectCard(index) {
if (player.study.selected === index) {
player.study.selected = -1;
@ -202,6 +210,7 @@ addLayer("study", {
tabFormat: {
"Main": {
content: () => player.tab !== "study" ? null : [
<!--suppress HtmlUnknownTag -->
["display-text", `<span>You have <h2 style="color: ${studyColor}; text-shadow: ${studyColor} 0 0 10px">${formatWhole(player.study.points)}</h2> properties studied,<br/>and <h2 style="color: darkcyan; text-shadow: darkcyan 0 0 10px">${formatWhole(player.study.insights)}</h2> key insights</span>`],
"blank",
["display-text", (() => {
@ -232,6 +241,7 @@ addLayer("study", {
},
"Buy Cards": {
content: () => player.tab !== "study" ? null : [
<!--suppress HtmlUnknownTag -->
["display-text", `<span>You have <h2 style="color: darkcyan; text-shadow: darkcyan 0 0 10px">${formatWhole(player.study.insights)}</h2> key insights</span>`],
"blank",
["display-text", `Cards refresh in ${new Decimal(getRefreshPeriod() - player.study.refreshProgress).clampMax(getRefreshPeriod() - 0.01).toFixed(2)} seconds`],
@ -247,6 +257,7 @@ addLayer("study", {
},
"Destroy Cards": {
content: () => player.tab !== "study" ? null : [
<!--suppress HtmlUnknownTag -->
["sticky", [0, ["display-text", `<span>You have <h2 style="color: ${studyColor}; text-shadow: ${studyColor} 0 0 10px">${formatWhole(player.study.points)}</h2> properties studied`]]],
"blank",
["sticky", ["50px", ["clickable", "sell"]]],
@ -257,6 +268,7 @@ addLayer("study", {
},
"Upgrade Cards": {
content: () => player.tab !== "study" ? null : [
<!--suppress HtmlUnknownTag -->
["sticky", [0, ["display-text", `<span>You have <h2 style="color: darkcyan; text-shadow: darkcyan 0 0 10px">${formatWhole(player.study.insights)}</h2> key insights`]]],
"blank",
hasMilestone("study", 4) ? ["column", [
@ -322,11 +334,6 @@ addLayer("study", {
}
}
}
let jobLevel = new Decimal(getJobLevel(this.layer));
if (jobLevel.neq(player[this.layer].lastLevel)) {
doPopup("none", `Level ${jobLevel}`, "Level Up!", 3, layers[this.layer].color);
player[this.layer].lastLevel = jobLevel;
}
},
onAddPoints(gain) {
let xpGain = gain;
@ -334,6 +341,7 @@ addLayer("study", {
xpGain = xpGain.times(layers.generators.clickables[this.layer].effect());
}
player[this.layer].xp = player[this.layer].xp.add(xpGain);
checkJobXP(this.layer);
},
milestones: {
0: {

View file

@ -1,8 +1,7 @@
/* eslint-disable no-unused-vars */
// https://color.adobe.com/create/color-wheel
// Colors
const logoBackgroundColor = "#1a75bb";
const logoHighlightColor = "#000080";
const backgroundColor = "#2a323d";
const flowersColor = "#F1EBD9";
const distillColor = "#8AFFC1";

View file

@ -1,4 +1,4 @@
var app;
let app;
function loadVue() {
// data = a function returning the content (actually HTML)
@ -46,15 +46,19 @@ function loadVue() {
}
},
template: `
<div class="upgTable instant">
<div class="upgRow">
<div v-for="(item, index) in data">
<div v-if="!Array.isArray(item)" v-bind:is="item" :layer= "layer" v-bind:style="tmp[layer].componentStyles[item]" :key="key + '-' + index"></div>
<div v-else-if="item.length==3" v-bind:style="[tmp[layer].componentStyles[item[0]], (item[2] ? item[2] : {})]" v-bind:is="item[0]" :layer= "layer" :data= "item[1]" :key="key + '-' + index"></div>
<div v-else-if="item.length==2" v-bind:is="item[0]" :layer= "layer" :data= "item[1]" v-bind:style="tmp[layer].componentStyles[item[0]]" :key="key + '-' + index"></div>
</div>
</div>
</div>
<div class="upgTable instant">
<div class="upgRow">
<div v-for="(item, index) in data">
<div v-if="!Array.isArray(item)" v-bind:is="item" :layer="layer"
v-bind:style="tmp[layer].componentStyles[item]" :key="key + '-' + index"></div>
<div v-else-if="item.length===3"
v-bind:style="[tmp[layer].componentStyles[item[0]], (item[2] ? item[2] : {})]" v-bind:is="item[0]"
:layer="layer" :data="item[1]" :key="key + '-' + index"></div>
<div v-else-if="item.length===2" v-bind:is="item[0]" :layer="layer" :data="item[1]"
v-bind:style="tmp[layer].componentStyles[item[0]]" :key="key + '-' + index"></div>
</div>
</div>
</div>
`
});
@ -67,15 +71,19 @@ function loadVue() {
}
},
template: `
<div class="upgTable instant">
<div class="upgCol">
<template v-for="(item, index) in data">
<div v-if="!Array.isArray(item)" v-bind:is="item" :layer= "layer" v-bind:style="tmp[layer].componentStyles[item]" :key="key + '-' + index"></div>
<div v-else-if="item.length==3" v-bind:style="[tmp[layer].componentStyles[item[0]], (item[2] ? item[2] : {})]" v-bind:is="item[0]" :layer= "layer" :data= "item[1]" :key="key + '-' + index"></div>
<div v-else-if="item.length==2" v-bind:is="item[0]" :layer= "layer" :data= "item[1]" v-bind:style="tmp[layer].componentStyles[item[0]]" :key="key + '-' + index"></div>
</template>
</div>
</div>
<div class="upgTable instant">
<div class="upgCol">
<template v-for="(item, index) in data">
<div v-if="!Array.isArray(item)" v-bind:is="item" :layer="layer"
v-bind:style="tmp[layer].componentStyles[item]" :key="key + '-' + index"></div>
<div v-else-if="item.length===3"
v-bind:style="[tmp[layer].componentStyles[item[0]], (item[2] ? item[2] : {})]" v-bind:is="item[0]"
:layer="layer" :data="item[1]" :key="key + '-' + index"></div>
<div v-else-if="item.length===2" v-bind:is="item[0]" :layer="layer" :data="item[1]"
v-bind:style="tmp[layer].componentStyles[item[0]]" :key="key + '-' + index"></div>
</template>
</div>
</div>
`
});
@ -165,7 +173,10 @@ function loadVue() {
v-bind:style="[((!hasUpgrade(layer, data) && canAffordUpgrade(layer, data)) ? {'background-color': tmp[layer].color} : {}), tmp[layer].upgrades[data].style]">
<span v-if="tmp[layer].upgrades[data].fullDisplay" v-html="tmp[layer].upgrades[data].fullDisplay"></span>
<span v-else>
<span v-if= "tmp[layer].upgrades[data].title"><h3 v-html="tmp[layer].upgrades[data].title"></h3><br></span>
<span v-if= "tmp[layer].upgrades[data].title">
<!--suppress HtmlUnknownTag -->
<h3 v-html="tmp[layer].upgrades[data].title"></h3><br>
</span>
<span v-html="tmp[layer].upgrades[data].description"></span>
<span v-if="tmp[layer].upgrades[data].effectDisplay"><br>Currently: <span v-html="tmp[layer].upgrades[data].effectDisplay"></span></span>
<span v-if="tmp[layer].upgrades[data].cost"><br><br>Cost: {{ formatWhole(tmp[layer].upgrades[data].cost) }} {{(tmp[layer].upgrades[data].currencyDisplayName ? tmp[layer].upgrades[data].currencyDisplayName : tmp[layer].resource)}}</span>
@ -179,9 +190,9 @@ function loadVue() {
template: `
<div v-if="tmp[layer].milestones">
<table>
<tr v-for="id in Object.keys(tmp[layer].milestones)"><div v-if="tmp[layer].milestones[id]!== undefined && tmp[layer].milestones[id].unlocked && milestoneShown(layer, id)"
<tr v-for="id in Object.keys(tmp[layer].milestones)" v-if="tmp[layer].milestones[id]!== undefined && tmp[layer].milestones[id].unlocked && milestoneShown(layer, id)">
<milestone :layer = "layer" :data = "id" v-bind:style="tmp[layer].componentStyles.milestone"></milestone>
</tr></div>
</tr>
</table>
<br>
</div>
@ -193,9 +204,9 @@ function loadVue() {
template: `
<div v-if="tmp[layer].milestones">
<table>
<tr v-for="id in data"><div v-if="tmp[layer].milestones[id]!== undefined && tmp[layer].milestones[id].unlocked && milestoneShown(layer, id)"
<tr v-for="id in data" v-if="tmp[layer].milestones[id]!== undefined && tmp[layer].milestones[id].unlocked && milestoneShown(layer, id)">
<milestone :layer = "layer" :data = "id" v-bind:style="tmp[layer].componentStyles.milestone"></milestone>
</tr></div>
</tr>
</table>
<br>
</div>
@ -210,7 +221,7 @@ function loadVue() {
<h3 v-html="tmp[layer].milestones[data].title"></h3><br>
<b v-html="tmp[layer].milestones[data].requirementDescription"></b><br>
<span v-html="tmp[layer].milestones[data].effectDescription"></span><br>
<span v-if="(tmp[layer].milestones[data].toggles)&&(hasMilestone(layer, data))" v-for="toggle in tmp[layer].milestones[data].toggles"><toggle :layer= "layer" :data= "toggle" v-bind:style="tmp[layer].componentStyles.toggle"></toggle>&nbsp;</span></td></tr>
<span v-if="(tmp[layer].milestones[data].toggles)&&(hasMilestone(layer, data))" v-for="toggle in tmp[layer].milestones[data].toggles"><toggle :layer= "layer" :data= "toggle" v-bind:style="tmp[layer].componentStyles.toggle" />&nbsp;</span></td>
`
});
@ -259,57 +270,84 @@ function loadVue() {
Vue.component("buyables", {
props: ["layer", "data"],
template: `
<div v-if="tmp[layer].buyables" class="upgTable">
<respec-button v-if="tmp[layer].buyables.respec && !(tmp[layer].buyables.showRespec !== undefined && tmp[layer].buyables.showRespec == false)" :layer = "layer" v-bind:style="[{'margin-bottom': '12px'}, tmp[layer].componentStyles['respec-button']]"></respec-button>
<div v-for="row in tmp[layer].buyables.rows" class="upgRow">
<div v-for="col in tmp[layer].buyables.cols"><div v-if="tmp[layer].buyables[row*10+col]!== undefined && tmp[layer].buyables[row*10+col].unlocked" class="upgAlign" v-bind:style="{'margin-left': '7px', 'margin-right': '7px', 'height': (data ? data : 'inherit'),}">
<buyable :layer = "layer" :data = "row*10+col" :size = "data"></buyable>
</div></div>
<br>
</div>
</div>
`
<div v-if="tmp[layer].buyables" class="upgTable">
<respec-button
v-if="tmp[layer].buyables.respec && !(tmp[layer].buyables.showRespec !== undefined && tmp[layer].buyables.showRespec === false)"
:layer="layer"
v-bind:style="[{'margin-bottom': '12px'}, tmp[layer].componentStyles['respec-button']]"></respec-button>
<div v-for="row in tmp[layer].buyables.rows" class="upgRow">
<div v-for="col in tmp[layer].buyables.cols">
<div v-if="tmp[layer].buyables[row*10+col]!== undefined && tmp[layer].buyables[row*10+col].unlocked"
class="upgAlign"
v-bind:style="{'margin-left': '7px', 'margin-right': '7px', 'height': (data ? data : 'inherit'),}">
<buyable :layer="layer" :data="row*10+col" :size="data"></buyable>
</div>
</div>
<br>
</div>
</div>
`
});
// data = id of buyable
Vue.component("buyable", {
props: ["layer", "data", "size"],
template: `
<div v-if="tmp[layer].buyables && tmp[layer].buyables[data]!== undefined && tmp[layer].buyables[data].unlocked" style="display: grid">
<button v-bind:class="{ buyable: true, can: tmp[layer].buyables[data].canAfford, locked: !tmp[layer].buyables[data].canAfford}"
v-bind:style="[tmp[layer].buyables[data].canAfford ? {'background-color': tmp[layer].color} : {}, size ? {'height': size, 'width': size} : {}, tmp[layer].componentStyles.buyable, tmp[layer].buyables[data].style]"
v-on:click="buyBuyable(layer, data)">
<span v-if= "tmp[layer].buyables[data].title"><h2 v-html="tmp[layer].buyables[data].title"></h2><br></span>
<span v-bind:style="{'white-space': 'pre-line'}" v-html="tmp[layer].buyables[data].display"></span>
</button>
<br v-if="(tmp[layer].buyables[data].sellOne !== undefined && !(tmp[layer].buyables[data].canSellOne !== undefined && tmp[layer].buyables[data].canSellOne == false)) || (tmp[layer].buyables[data].sellAll && !(tmp[layer].buyables[data].canSellAll !== undefined && tmp[layer].buyables[data].canSellAll == false))">
<sell-one :layer="layer" :data="data" v-bind:style="tmp[layer].componentStyles['sell-one']" v-if="(tmp[layer].buyables[data].sellOne)&& !(tmp[layer].buyables[data].canSellOne !== undefined && tmp[layer].buyables[data].canSellOne == false)"></sell-one>
<sell-all :layer="layer" :data="data" v-bind:style="tmp[layer].componentStyles['sell-all']" v-if="(tmp[layer].buyables[data].sellAll)&& !(tmp[layer].buyables[data].canSellAll !== undefined && tmp[layer].buyables[data].canSellAll == false)"></sell-all>
</div>
<div
v-if="tmp[layer].buyables && tmp[layer].buyables[data]!== undefined && tmp[layer].buyables[data].unlocked"
style="display: grid">
<button
v-bind:class="{ buyable: true, can: tmp[layer].buyables[data].canAfford, locked: !tmp[layer].buyables[data].canAfford}"
v-bind:style="[tmp[layer].buyables[data].canAfford ? {'background-color': tmp[layer].color} : {}, size ? {'height': size, 'width': size} : {}, tmp[layer].componentStyles.buyable, tmp[layer].buyables[data].style]"
v-on:click="buyBuyable(layer, data)">
<span v-if="tmp[layer].buyables[data].title">
<!--suppress HtmlUnknownTag -->
<h2 v-html="tmp[layer].buyables[data].title"></h2><br>
</span>
<span v-bind:style="{'white-space': 'pre-line'}" v-html="tmp[layer].buyables[data].display"></span>
</button>
<br v-if="(tmp[layer].buyables[data].sellOne !== undefined && !(tmp[layer].buyables[data].canSellOne !== undefined && tmp[layer].buyables[data].canSellOne === false)) || (tmp[layer].buyables[data].sellAll && !(tmp[layer].buyables[data].canSellAll !== undefined && tmp[layer].buyables[data].canSellAll === false))">
<sell-one :layer="layer" :data="data" v-bind:style="tmp[layer].componentStyles['sell-one']"
v-if="(tmp[layer].buyables[data].sellOne)&& !(tmp[layer].buyables[data].canSellOne !== undefined && tmp[layer].buyables[data].canSellOne === false)"></sell-one>
<sell-all :layer="layer" :data="data" v-bind:style="tmp[layer].componentStyles['sell-all']"
v-if="(tmp[layer].buyables[data].sellAll)&& !(tmp[layer].buyables[data].canSellAll !== undefined && tmp[layer].buyables[data].canSellAll === false)"></sell-all>
</div>
`
});
Vue.component("respec-button", {
props: ["layer", "data"],
template: `
<button v-if="tmp[layer].buyables && tmp[layer].buyables.respec && !(tmp[layer].buyables.showRespec !== undefined && tmp[layer].buyables.showRespec == false)" v-on:click="respecBuyables(layer)" v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{tmp[layer].buyables.respecText ? tmp[layer].buyables.respecText : "Respec"}}</button>
`
<button
v-if="tmp[layer].buyables && tmp[layer].buyables.respec && !(tmp[layer].buyables.showRespec !== undefined && tmp[layer].buyables.showRespec === false)"
v-on:click="respecBuyables(layer)"
v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{ tmp[layer].buyables.respecText ? tmp[layer].buyables.respecText : "Respec" }}
</button>
`
});
// data = button size, in px
Vue.component("clickables", {
props: ["layer", "data"],
template: `
<div v-if="tmp[layer].clickables" class="upgTable">
<master-button v-if="tmp[layer].clickables.masterButtonPress && !(tmp[layer].clickables.showMasterButton !== undefined && tmp[layer].clickables.showMasterButton == false)" :layer = "layer" v-bind:style="[{'margin-bottom': '12px'}, tmp[layer].componentStyles['master-button']]"></master-button>
<div v-for="row in tmp[layer].clickables.rows" class="upgRow">
<div v-for="col in tmp[layer].clickables.cols"><div v-if="tmp[layer].clickables[row*10+col]!== undefined && tmp[layer].clickables[row*10+col].unlocked" class="upgAlign" v-bind:style="{'margin-left': '7px', 'margin-right': '7px', 'height': (data ? data : 'inherit'),}">
<clickable :layer = "layer" :data = "row*10+col" :size = "data" v-bind:style="tmp[layer].componentStyles.clickable"></clickable>
</div></div>
<br>
</div>
</div>
`
<div v-if="tmp[layer].clickables" class="upgTable">
<master-button
v-if="tmp[layer].clickables.masterButtonPress && !(tmp[layer].clickables.showMasterButton !== undefined && tmp[layer].clickables.showMasterButton === false)"
:layer="layer"
v-bind:style="[{'margin-bottom': '12px'}, tmp[layer].componentStyles['master-button']]"></master-button>
<div v-for="row in tmp[layer].clickables.rows" class="upgRow">
<div v-for="col in tmp[layer].clickables.cols">
<div v-if="tmp[layer].clickables[row*10+col]!== undefined && tmp[layer].clickables[row*10+col].unlocked"
class="upgAlign"
v-bind:style="{'margin-left': '7px', 'margin-right': '7px', 'height': (data ? data : 'inherit'),}">
<clickable :layer="layer" :data="row*10+col" :size="data"
v-bind:style="tmp[layer].componentStyles.clickable"></clickable>
</div>
</div>
<br>
</div>
</div>
`
});
// data = id of clickable
@ -321,7 +359,10 @@ function loadVue() {
v-bind:class="{ upg: true, can: tmp[layer].clickables[data].canClick !== false, locked: tmp[layer].clickables[data].canClick === false, ...tmp[layer].clickables[data].class}"
v-bind:style="[tmp[layer].clickables[data].canClick !== false ? {'background-color': tmp[layer].color} : {}, size ? {'height': size, 'width': size} : {}, tmp[layer].clickables[data].style]"
v-on="handlers">
<span v-if= "tmp[layer].clickables[data].title"><h2 v-html="tmp[layer].clickables[data].title"></h2><br></span>
<span v-if= "tmp[layer].clickables[data].title">
<!--suppress HtmlUnknownTag -->
<h2 v-html="tmp[layer].clickables[data].title"></h2><br>
</span>
<span v-bind:style="{'white-space': 'pre-line'}" v-html="tmp[layer].clickables[data].display"></span>
</button>
`,
@ -334,7 +375,7 @@ function loadVue() {
touchend: layers[layer].clickables[data].touchend,
mouseleave: layers[layer].clickables[data].touchend
};
for (cb in handlers) {
for (let cb in handlers) {
if (handlers[cb] == null) {
delete handlers[cb];
}
@ -346,9 +387,12 @@ function loadVue() {
Vue.component("master-button", {
props: ["layer", "data"],
template: `
<button v-if="tmp[layer].clickables && tmp[layer].clickables.masterButtonPress && !(tmp[layer].clickables.showMasterButton !== undefined && tmp[layer].clickables.showMasterButton == false)"
v-on:click="run(tmp[layer].clickables.masterButtonPress, tmp[layer].clickables)" v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{tmp[layer].clickables.masterButtonText ? tmp[layer].clickables.masterButtonText : "Click me!"}}</button>
`
<button
v-if="tmp[layer].clickables && tmp[layer].clickables.masterButtonPress && !(tmp[layer].clickables.showMasterButton !== undefined && tmp[layer].clickables.showMasterButton === false)"
v-on:click="run(tmp[layer].clickables.masterButtonPress, tmp[layer].clickables)"
v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{ tmp[layer].clickables.masterButtonText ? tmp[layer].clickables.masterButtonText : "Click me!" }}
</button>
`
});
// data = button size, in px
@ -364,9 +408,9 @@ function loadVue() {
<div class="upgTable instant">
<tab-buttons :layer="layer" :data="tmp[layer].microtabs[data]" :name="data" v-bind:style="tmp[layer].componentStyles['tab-buttons']"></tab-buttons>
</div>
<layer-tab v-if="tmp[layer].microtabs[data][player.subtabs[layer][data]].embedLayer" :layer="tmp[layer].microtabs[data][player.subtabs[layer][data]].embedLayer" :embedded="true"></layer-tab>
<layer-tab v-if="tmp[layer].microtabs[data][currentTab].embedLayer" :layer="tmp[layer].microtabs[data][currentTab].embedLayer" :embedded="true"></layer-tab>
<column v-else v-bind:style="tmp[layer].microtabs[data][player.subtabs[layer][data]].style" :layer="layer" :data="tmp[layer].microtabs[data][player.subtabs[layer][data]].content"></column>
<column v-else v-bind:style="tmp[layer].microtabs[data][currentTab].style" :layer="layer" :data="tmp[layer].microtabs[data][currentTab].content"></column>
</div>
`
});
@ -406,15 +450,22 @@ function loadVue() {
Vue.component("achievement", {
props: ["layer", "data"],
template: `
<div v-if="tmp[layer].achievements && tmp[layer].achievements[data]!== undefined && tmp[layer].achievements[data].unlocked" v-bind:class="{ [layer]: true, achievement: true, locked: !hasAchievement(layer, data), bought: hasAchievement(layer, data)}"
v-bind:tooltip="
(tmp[layer].achievements[data].tooltip == '') ? false : hasAchievement(layer, data) ? (tmp[layer].achievements[data].doneTooltip ? tmp[layer].achievements[data].doneTooltip : (tmp[layer].achievements[data].tooltip ? tmp[layer].achievements[data].tooltip : 'You did it!'))
<div
v-if="tmp[layer].achievements && tmp[layer].achievements[data]!== undefined && tmp[layer].achievements[data].unlocked"
v-bind:class="{ [layer]: true, achievement: true, locked: !hasAchievement(layer, data), bought: hasAchievement(layer, data)}"
v-bind:tooltip="
(tmp[layer].achievements[data].tooltip === '') ? false : hasAchievement(layer, data) ? (tmp[layer].achievements[data].doneTooltip ? tmp[layer].achievements[data].doneTooltip : (tmp[layer].achievements[data].tooltip ? tmp[layer].achievements[data].tooltip : 'You did it!'))
: (tmp[layer].achievements[data].goalTooltip ? tmp[layer].achievements[data].goalTooltip : (tmp[layer].achievements[data].tooltip ? tmp[layer].achievements[data].tooltip : 'LOCKED'))
"
v-bind:style="tmp[layer].achievements[data].computedStyle">
<span v-if= "tmp[layer].achievements[data].name"><br><h3 v-bind:style="tmp[layer].achievements[data].textStyle" v-html="tmp[layer].achievements[data].name"></h3><br></span>
</div>
v-bind:style="tmp[layer].achievements[data].computedStyle">
<span v-if="tmp[layer].achievements[data].name">
<br>
<!--suppress HtmlUnknownTag -->
<h3 v-bind:style="tmp[layer].achievements[data].textStyle"
v-html="tmp[layer].achievements[data].name"></h3>
<br>
</span>
</div>
`
});
@ -427,13 +478,19 @@ function loadVue() {
}
},
template: `<div>
<span class="upgRow" v-for="(row, r) in data"><table>
<span v-for="(node, id) in row" style = "{width: 0px}">
<tree-node :layer='node' :abb='tmp[node].symbol' :key="key + '-' + r + '-' + id"></tree-node>
<span class="upgRow" v-for="(row, r) in data">
<!--suppress HtmlUnknownTag -->
<table>
<span v-for="(node, id) in row" style = "{width: 0}">
<tree-node :layer='node' :abb='tmp[node].symbol' :key="key + '-' + r + '-' + id"></tree-node>
</span>
<tr>
<!--suppress HtmlUnknownTag -->
<table><button class="treeNode hidden"></button></table>
</tr>
</table>
</span>
<tr><table><button class="treeNode hidden"></button></table></tr>
</span></div>
</div>
`
});
@ -441,16 +498,22 @@ function loadVue() {
Vue.component("sell-one", {
props: ["layer", "data"],
template: `
<button v-if="tmp[layer].buyables && tmp[layer].buyables[data].sellOne && !(tmp[layer].buyables[data].canSellOne !== undefined && tmp[layer].buyables[data].canSellOne == false)" v-on:click="run(tmp[layer].buyables[data].sellOne, tmp[layer].buyables[data])"
v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{tmp[layer].buyables.sellOneText ? tmp[layer].buyables.sellOneText : "Sell One"}}</button>
`
<button
v-if="tmp[layer].buyables && tmp[layer].buyables[data].sellOne && !(tmp[layer].buyables[data].canSellOne !== undefined && tmp[layer].buyables[data].canSellOne === false)"
v-on:click="run(tmp[layer].buyables[data].sellOne, tmp[layer].buyables[data])"
v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{ tmp[layer].buyables.sellOneText ? tmp[layer].buyables.sellOneText : "Sell One" }}
</button>
`
});
Vue.component("sell-all", {
props: ["layer", "data"],
template: `
<button v-if="tmp[layer].buyables && tmp[layer].buyables[data].sellAll && !(tmp[layer].buyables[data].canSellAll !== undefined && tmp[layer].buyables[data].canSellAll == false)" v-on:click="run(tmp[layer].buyables[data].sellAll, tmp[layer].buyables[data])"
v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{tmp[layer].buyables.sellAllText ? tmp[layer].buyables.sellAllText : "Sell All"}}</button>
`
<button
v-if="tmp[layer].buyables && tmp[layer].buyables[data].sellAll && !(tmp[layer].buyables[data].canSellAll !== undefined && tmp[layer].buyables[data].canSellAll === false)"
v-on:click="run(tmp[layer].buyables[data].sellAll, tmp[layer].buyables[data])"
v-bind:class="{ longUpg: true, can: player[layer].unlocked, locked: !player[layer].unlocked }">{{ tmp[layer].buyables.sellAllText ? tmp[layer].buyables.sellAllText : "Sell All" }}
</button>
`
});
// SYSTEM COMPONENTS

View file

@ -1,7 +1,7 @@
var player;
var needCanvasUpdate = true;
var gameEnded = false;
var scrolled = false;
let player;
let needCanvasUpdate = true;
let gameEnded = false;
// Don't change this
const TMT_VERSION = {
@ -17,19 +17,19 @@ function getResetGain(layer, useType = null) {
return layers[layer].getResetGain();
}
}
if(tmp[layer].type == "none") {
if(tmp[layer].type === "none") {
return new Decimal (0);
}
if (tmp[layer].gainExp.eq(0)) {
return new Decimal(0);
}
if (type=="static") {
if (type==="static") {
if ((!tmp[layer].canBuyMax) || tmp[layer].baseAmount.lt(tmp[layer].requires)) {
return new Decimal(1);
}
let gain = tmp[layer].baseAmount.div(tmp[layer].requires).div(tmp[layer].gainMult).max(1).log(tmp[layer].base).times(tmp[layer].gainExp).pow(Decimal.pow(tmp[layer].exponent, -1));
return gain.floor().sub(player[layer].points).add(1).max(1);
} else if (type=="normal"){
} else if (type==="normal"){
if (tmp[layer].baseAmount.lt(tmp[layer].requires)) {
return new Decimal(0);
}
@ -38,7 +38,7 @@ function getResetGain(layer, useType = null) {
gain = gain.pow(tmp[layer].softcapPower).times(tmp[layer].softcap.pow(decimalOne.sub(tmp[layer].softcapPower)));
}
return gain.floor().max(0);
} else if (type=="custom"){
} else if (type==="custom"){
return layers[layer].getResetGain();
} else {
return new Decimal(0);
@ -54,7 +54,7 @@ function getNextAt(layer, canMax=false, useType = null) {
}
}
if(tmp[layer].type == "none") {
if(tmp[layer].type === "none") {
return new Decimal (Infinity);
}
@ -65,7 +65,7 @@ function getNextAt(layer, canMax=false, useType = null) {
return new Decimal(Infinity);
}
if (type=="static") {
if (type==="static") {
if (!tmp[layer].canBuyMax) {
canMax = false;
}
@ -76,7 +76,7 @@ function getNextAt(layer, canMax=false, useType = null) {
cost = cost.ceil();
}
return cost;
} else if (type=="normal"){
} else if (type==="normal"){
let next = tmp[layer].resetGain.add(1);
if (next.gte(tmp[layer].softcap)) {
next = next.div(tmp[layer].softcap.pow(decimalOne.sub(tmp[layer].softcapPower))).pow(decimalOne.div(tmp[layer].softcapPower));
@ -86,7 +86,7 @@ function getNextAt(layer, canMax=false, useType = null) {
next = next.ceil();
}
return next;
} else if (type=="custom"){
} else if (type==="custom"){
return layers[layer].getNextAt(canMax);
} else {
return new Decimal(0);
@ -103,10 +103,10 @@ function softcap(value, cap, power = 0.5) {
// Return true if the layer should be highlighted. By default checks for upgrades only.
function shouldNotify(layer){
if (player.tab == layer || player.navTab == layer) {
if (player.tab === layer || player.navTab === layer) {
return false;
}
for (id in tmp[layer].upgrades){
for (let id in tmp[layer].upgrades){
if (!isNaN(id)){
if (canAffordUpgrade(layer, id) && !hasUpgrade(layer, id) && tmp[layer].upgrades[id].unlocked){
return true;
@ -118,15 +118,15 @@ function shouldNotify(layer){
}
if (isPlainObject(tmp[layer].tabFormat)) {
for (subtab in tmp[layer].tabFormat){
for (let subtab in tmp[layer].tabFormat){
if (subtabShouldNotify(layer, "mainTabs", subtab)) {
return true;
}
}
}
for (family in tmp[layer].microtabs) {
for (subtab in tmp[layer].microtabs[family]){
for (let family in tmp[layer].microtabs) {
for (let subtab in tmp[layer].microtabs[family]){
if (subtabShouldNotify(layer, family, subtab)) {
return true;
}
@ -140,9 +140,9 @@ function shouldNotify(layer){
function canReset(layer) {
if (layers[layer].canReset!== undefined) {
return run(layers[layer].canReset, layers[layer]);
} else if(tmp[layer].type == "normal") {
} else if(tmp[layer].type === "normal") {
return tmp[layer].baseAmount.gte(tmp[layer].requires);
} else if(tmp[layer].type== "static") {
} else if(tmp[layer].type=== "static") {
return tmp[layer].baseAmount.gte(tmp[layer].nextAt);
} else {
return false;
@ -150,7 +150,7 @@ function canReset(layer) {
}
function rowReset(row, layer) {
for (lr in ROW_LAYERS[row]){
for (let lr in ROW_LAYERS[row]){
if(layers[lr].doReset) {
player[lr].activeChallenge = null; // Exit challenges on any row reset on an equal or higher row
@ -165,7 +165,7 @@ function rowReset(row, layer) {
function layerDataReset(layer, keep = []) {
let storedData = {unlocked: player[layer].unlocked}; // Always keep unlocked
for (thing in keep) {
for (let thing in keep) {
if (player[layer][keep[thing]] !== undefined) {
storedData[keep[thing]] = player[layer][keep[thing]];
}
@ -184,7 +184,7 @@ function layerDataReset(layer, keep = []) {
if (layers[layer].clickables && !player[layer].clickables) {
player[layer].clickables = getStartClickables(layer);
}
for (thing in storedData) {
for (let thing in storedData) {
player[layer][thing] =storedData[thing];
}
}
@ -214,10 +214,10 @@ function generatePoints(layer, diff) {
addPoints(layer, tmp[layer].resetGain.times(diff));
}
var prevOnReset;
let prevOnReset;
function doReset(layer, force=false) {
if (tmp[layer].type == "none") {
if (tmp[layer].type === "none") {
return;
}
let row = tmp[layer].row;
@ -226,13 +226,13 @@ function doReset(layer, force=false) {
return;
}
let gain = tmp[layer].resetGain;
if (tmp[layer].type=="static") {
if (tmp[layer].type==="static") {
if (tmp[layer].baseAmount.lt(tmp[layer].nextAt)) {
return;
}
gain =(tmp[layer].canBuyMax ? gain : 1);
}
if (tmp[layer].type=="custom") {
if (tmp[layer].type==="custom") {
if (!tmp[layer].canReset) {
return;
}
@ -251,8 +251,8 @@ function doReset(layer, force=false) {
needCanvasUpdate = true;
if (tmp[layer].increaseUnlockOrder){
lrs = tmp[layer].increaseUnlockOrder;
for (lr in lrs) {
let lrs = tmp[layer].increaseUnlockOrder;
for (let lr in lrs) {
if (!player[lrs[lr]].unlocked) {
player[lrs[lr]].unlockOrder++;
}
@ -268,14 +268,14 @@ function doReset(layer, force=false) {
}
for (layerResetting in layers) {
if (row >= layers[layerResetting].row && (!force || layerResetting != layer)) {
for (let layerResetting in layers) {
if (row >= layers[layerResetting].row && (!force || layerResetting !== layer)) {
completeChallenge(layerResetting);
}
}
prevOnReset = {...player}; //Deep Copy
player.points = (row == 0 ? new Decimal(0) : getStartPoints());
player.points = (row === 0 ? new Decimal(0) : getStartPoints());
for (let x = row; x >= 0; x--) {
rowReset(x, layer);
@ -289,32 +289,12 @@ function doReset(layer, force=false) {
updateTemp();
}
function resetRow(row) {
if (prompt("Are you sure you want to reset this row? It is highly recommended that you wait until the end of your current run before doing this! Type \"I WANT TO RESET THIS\" to confirm")!="I WANT TO RESET THIS") {
return;
}
let pre_layers = ROW_LAYERS[row-1];
let layers = ROW_LAYERS[row];
let post_layers = ROW_LAYERS[row+1];
rowReset(row+1, post_layers[0]);
doReset(pre_layers[0], true);
for (let layer in layers) {
player[layer].unlocked = false;
if (player[layer].unlockOrder) {
player[layer].unlockOrder = 0;
}
}
player.points = getStartPoints();
updateTemp();
resizeCanvas();
}
function startChallenge(layer, x) {
let enter = false;
if (!player[layer].unlocked) {
return;
}
if (player[layer].activeChallenge == x) {
if (player[layer].activeChallenge === x) {
completeChallenge(layer, x);
player[layer].activeChallenge = null;
} else {
@ -329,7 +309,7 @@ function startChallenge(layer, x) {
}
function canCompleteChallenge(layer, x) {
if (x != player[layer].activeChallenge) {
if (x !== player[layer].activeChallenge) {
return;
}
let challenge = tmp[layer].challenges[x];
@ -353,8 +333,8 @@ function canCompleteChallenge(layer, x) {
}
function completeChallenge(layer, x) {
var x = player[layer].activeChallenge;
function completeChallenge(layer) {
let x = player[layer].activeChallenge;
if (!x) {
return;
}
@ -384,7 +364,7 @@ function autobuyUpgrades(layer){
if (!tmp[layer].upgrades) {
return;
}
for (id in tmp[layer].upgrades) {
for (let id in tmp[layer].upgrades) {
if (isPlainObject(tmp[layer].upgrades[id]) && (layers[layer].upgrades[id].canAfford === undefined || layers[layer].upgrades[id].canAfford() === true)) {
buyUpg(layer, id);
}
@ -413,8 +393,8 @@ function gameLoop(diff) {
addTime(diff);
player.points = player.points.add(tmp.pointGen.times(diff)).max(0);
for (x = 0; x <= maxRow; x++){
for (item in TREE_LAYERS[x]) {
for (let x = 0; x <= maxRow; x++){
for (let item in TREE_LAYERS[x]) {
let layer = TREE_LAYERS[x][item];
player[layer].resetTime += diff;
if (tmp[layer].passiveGeneration) {
@ -426,8 +406,8 @@ function gameLoop(diff) {
}
}
for (row in OTHER_LAYERS){
for (item in OTHER_LAYERS[row]) {
for (let row in OTHER_LAYERS){
for (let item in OTHER_LAYERS[row]) {
let layer = OTHER_LAYERS[row][item];
player[layer].resetTime += diff;
if (tmp[layer].passiveGeneration) {
@ -439,8 +419,8 @@ function gameLoop(diff) {
}
}
for (x = maxRow; x >= 0; x--){
for (item in TREE_LAYERS[x]) {
for (let x = maxRow; x >= 0; x--){
for (let item in TREE_LAYERS[x]) {
let layer = TREE_LAYERS[x][item];
if (tmp[layer].autoPrestige && tmp[layer].canReset) {
doReset(layer);
@ -454,8 +434,8 @@ function gameLoop(diff) {
}
}
for (row in OTHER_LAYERS){
for (item in OTHER_LAYERS[row]) {
for (let row in OTHER_LAYERS){
for (let item in OTHER_LAYERS[row]) {
let layer = OTHER_LAYERS[row][item];
if (tmp[layer].autoPrestige && tmp[layer].canReset) {
doReset(layer);
@ -470,7 +450,7 @@ function gameLoop(diff) {
}
}
for (layer in layers){
for (let layer in layers){
if (layers[layer].milestones) {
updateMilestones(layer);
}
@ -490,16 +470,16 @@ function hardReset() {
window.location.reload();
}
var ticking = false;
let ticking = false;
var interval = setInterval(function() {
if (player===undefined||tmp===undefined) {
const interval = setInterval(function () {
if (player === undefined || tmp === undefined) {
return;
}
if (ticking) {
return;
}
if (gameEnded&&!player.keepGoing) {
if (gameEnded && !player.keepGoing) {
return;
}
ticking = true;
@ -522,7 +502,7 @@ var interval = setInterval(function() {
diff *= player.devSpeed;
}
player.time = now;
if (needCanvasUpdate){
if (needCanvasUpdate) {
resizeCanvas();
needCanvasUpdate = false;
}

View file

@ -53,7 +53,7 @@ let winText = "Congratulations! You have reached the end and beaten this game, b
// If you add new functions anywhere inside of a layer, and those functions have an effect when called, add them here.
// (The ones here are examples, all official functions are already taken care of)
var doNotCallTheseFunctionsEveryTick = ["onAddPoints", "touchstart", "touchend"];
const doNotCallTheseFunctionsEveryTick = ["onAddPoints", "touchstart", "touchend"];
function getStartPoints(){
return new Decimal(modInfo.initialStartPoints);
@ -85,8 +85,7 @@ function addedPlayerData() {
}
// Display extra things at the top of the page
var displayThings = [
];
const displayThings = [];
// Determines when the game "ends"
function isEndgame() {

View file

@ -1054,7 +1054,7 @@
if (newparts.length === 2)
{
this.sign = 1;
if (newparts[0].charAt(0) == "-")
if (newparts[0].charAt(0) === "-")
{
this.sign = -1;
}
@ -1467,7 +1467,7 @@
var b;
//Which number is bigger in terms of its multiplicative distance from 1?
if ((this.layer > decimal.layer) || (this.layer == decimal.layer && Math.abs(this.mag) > Math.abs(decimal.mag)))
if ((this.layer > decimal.layer) || (this.layer === decimal.layer && Math.abs(this.mag) > Math.abs(decimal.mag)))
{
a = this;
b = decimal;
@ -2400,7 +2400,7 @@
//Other sroots are possible to calculate probably through guess and check methods, this one is easy though.
// https://en.wikipedia.org/wiki/Tetration#Super-root
Decimal.prototype.ssqrt = function() {
if (this.sign == 1 && this.layer >= 3)
if (this.sign === 1 && this.layer >= 3)
{
return FC_NN(this.sign, this.layer-1, this.mag)
}

View file

@ -1,28 +1,34 @@
var canvas;
var ctx;
let canvas;
let ctx;
window.addEventListener("resize", (_=>resizeCanvas()));
function retrieveCanvasData() {
let treeCanv = document.getElementById("treeCanvas")
let treeTab = document.getElementById("treeTab")
if (treeCanv===undefined||treeCanv===null) return false;
if (treeTab===undefined||treeTab===null) return false;
let treeCanv = document.getElementById("treeCanvas");
let treeTab = document.getElementById("treeTab");
if (treeCanv===undefined||treeCanv===null) {
return false;
}
if (treeTab===undefined||treeTab===null) {
return false;
}
canvas = treeCanv;
ctx = canvas.getContext("2d");
return true;
}
function resizeCanvas() {
if (!retrieveCanvasData()) return
if (!retrieveCanvasData()) {
return;
}
canvas.width = 0;
canvas.height = 0;
canvas.height = 0;
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
drawTree();
drawTree();
}
var colors = {
const colors = {
default: {
1: "#ffffff",
2: "#bfbfbf",
@ -33,47 +39,50 @@ var colors = {
2: "#8fa7bf",
3: "#5f6f7f",
},
}
var colors_theme
};
let colors_theme;
function drawTree() {
if (!retrieveCanvasData()) return;
if (!retrieveCanvasData()) {
return;
}
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (layer in layers){
if (tmp[layer].layerShown == true && tmp[layer].branches){
for (branch in tmp[layer].branches)
{
drawTreeBranch(layer, tmp[layer].branches[branch])
}
for (let layer in layers){
if (tmp[layer].layerShown === true && tmp[layer].branches){
for (let branch in tmp[layer].branches) {
drawTreeBranch(layer, tmp[layer].branches[branch]);
}
}
}
}
function drawTreeBranch(num1, data) { // taken from Antimatter Dimensions & adjusted slightly
let num2 = data
let color_id = 1
let num2 = data;
let color_id = 1;
if (Array.isArray(data)){
num2 = data[0]
color_id = data[1]
num2 = data[0];
color_id = data[1];
}
if(typeof(color_id) == "number")
color_id = colors_theme[color_id]
if(typeof(color_id) == "number") {
color_id = colors_theme[color_id];
}
if (document.getElementById(num1) == null || document.getElementById(num2) == null)
return
if (document.getElementById(num1) == null || document.getElementById(num2) == null) {
return;
}
let start = document.getElementById(num1).getBoundingClientRect();
let end = document.getElementById(num2).getBoundingClientRect();
let x1 = start.left + (start.width / 2) + document.body.scrollLeft;
let y1 = start.top + (start.height / 2) + document.body.scrollTop - 50;
let x2 = end.left + (end.width / 2) + document.body.scrollLeft;
let y2 = end.top + (end.height / 2) + document.body.scrollTop - 50;
ctx.lineWidth = 15;
ctx.beginPath();
ctx.strokeStyle = color_id
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
let end = document.getElementById(num2).getBoundingClientRect();
let x1 = start.left + (start.width / 2) + document.body.scrollLeft;
let y1 = start.top + (start.height / 2) + document.body.scrollTop - 50;
let x2 = end.left + (end.width / 2) + document.body.scrollLeft;
let y2 = end.top + (end.height / 2) + document.body.scrollTop - 50;
ctx.lineWidth = 15;
ctx.beginPath();
ctx.strokeStyle = color_id;
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
}

View file

@ -1,4 +1,4 @@
var layers = {}
const layers = {};
const decimalZero = new Decimal(0)
const decimalOne = new Decimal(1)
@ -8,19 +8,19 @@ function layerShown(layer){
return tmp[layer].layerShown;
}
var LAYERS = Object.keys(layers);
let LAYERS = Object.keys(layers);
var hotkeys = {};
let hotkeys = {};
var maxRow = 0;
let maxRow = 0;
function updateHotkeys()
{
hotkeys = {};
for (layer in layers){
hk = layers[layer].hotkeys
for (let layer in layers){
let hk = layers[layer].hotkeys
if (hk){
for (id in hk){
for (let id in hk){
hotkeys[hk[id].key] = hk[id]
hotkeys[hk[id].key].layer = layer
hotkeys[hk[id].key].id = id
@ -31,30 +31,30 @@ function updateHotkeys()
}
}
var ROW_LAYERS = {}
var TREE_LAYERS = {}
var OTHER_LAYERS = {}
let ROW_LAYERS = {};
let TREE_LAYERS = {};
let OTHER_LAYERS = {};
function updateLayers(){
LAYERS = Object.keys(layers);
ROW_LAYERS = {}
TREE_LAYERS = {}
OTHER_LAYERS = {}
for (layer in layers){
for (let layer in layers){
setupLayer(layer)
}
for (row in OTHER_LAYERS) {
for (let row in OTHER_LAYERS) {
OTHER_LAYERS[row].sort((a, b) => (a.position > b.position) ? 1 : -1)
for (layer in OTHER_LAYERS[row])
for (let layer in OTHER_LAYERS[row])
OTHER_LAYERS[row][layer] = OTHER_LAYERS[row][layer].layer
}
for (row in TREE_LAYERS) {
for (let row in TREE_LAYERS) {
TREE_LAYERS[row].sort((a, b) => (a.position > b.position) ? 1 : -1)
for (layer in TREE_LAYERS[row])
for (let layer in TREE_LAYERS[row])
TREE_LAYERS[row][layer] = TREE_LAYERS[row][layer].layer
}
let treeLayers2 = []
for (x = 0; x < maxRow + 1; x++) {
for (let x = 0; x < maxRow + 1; x++) {
if (TREE_LAYERS[x]) treeLayers2.push(TREE_LAYERS[x])
}
TREE_LAYERS = treeLayers2
@ -64,7 +64,7 @@ function updateLayers(){
function setupLayer(layer){
layers[layer].layer = layer
if (layers[layer].upgrades){
for (thing in layers[layer].upgrades){
for (let thing in layers[layer].upgrades){
if (!isNaN(thing)){
layers[layer].upgrades[thing].id = thing
layers[layer].upgrades[thing].layer = layer
@ -74,7 +74,7 @@ function setupLayer(layer){
}
}
if (layers[layer].milestones){
for (thing in layers[layer].milestones){
for (let thing in layers[layer].milestones){
if (!isNaN(thing)){
layers[layer].milestones[thing].id = thing
layers[layer].milestones[thing].layer = layer
@ -84,7 +84,7 @@ function setupLayer(layer){
}
}
if (layers[layer].achievements){
for (thing in layers[layer].achievements){
for (let thing in layers[layer].achievements){
if (!isNaN(thing)){
layers[layer].achievements[thing].id = thing
layers[layer].achievements[thing].layer = layer
@ -94,7 +94,7 @@ function setupLayer(layer){
}
}
if (layers[layer].challenges){
for (thing in layers[layer].challenges){
for (let thing in layers[layer].challenges){
if (!isNaN(thing)){
layers[layer].challenges[thing].id = thing
layers[layer].challenges[thing].layer = layer
@ -108,7 +108,7 @@ function setupLayer(layer){
}
if (layers[layer].buyables){
layers[layer].buyables.layer = layer
for (thing in layers[layer].buyables){
for (let thing in layers[layer].buyables){
if (!isNaN(thing)){
layers[layer].buyables[thing].id = thing
layers[layer].buyables[thing].layer = layer
@ -120,7 +120,7 @@ function setupLayer(layer){
if (layers[layer].clickables){
layers[layer].clickables.layer = layer
for (thing in layers[layer].clickables){
for (let thing in layers[layer].clickables){
if (!isNaN(thing)){
layers[layer].clickables[thing].id = thing
layers[layer].clickables[thing].layer = layer
@ -132,7 +132,7 @@ function setupLayer(layer){
if (layers[layer].bars){
layers[layer].bars.layer = layer
for (thing in layers[layer].bars){
for (let thing in layers[layer].bars){
layers[layer].bars[thing].id = thing
layers[layer].bars[thing].layer = layer
if (layers[layer].bars[thing].unlocked === undefined)
@ -141,16 +141,16 @@ function setupLayer(layer){
}
if (layers[layer].infoboxes){
for (thing in layers[layer].infoboxes){
for (let thing in layers[layer].infoboxes){
layers[layer].infoboxes[thing].id = thing
layers[layer].infoboxes[thing].layer = layer
if (layers[layer].infoboxes[thing].unlocked === undefined)
layers[layer].infoboxes[thing].unlocked = true
}
}
if (layers[layer].startData) {
data = layers[layer].startData()
let data = layers[layer].startData()
if (data.best !== undefined && data.showBest === undefined) layers[layer].showBest = true
if (data.total !== undefined && data.showTotal === undefined) layers[layer].showTotal = true
}
@ -193,14 +193,14 @@ function addLayer(layerName, layerData, tabLayers = null){ // Call this to add l
if (tabLayers !== null)
{
let format = {}
for (id in tabLayers) {
layer = tabLayers[id]
for (let id in tabLayers) {
let layer = tabLayers[id]
format[(layers[layer].name ? layers[layer].name : layer)] = {
embedLayer: layer,
buttonStyle() {
if (!tmp[this.embedLayer].nodeStyle) return {'border-color': tmp[this.embedLayer].color}
else {
style = tmp[this.embedLayer].nodeStyle
let style = tmp[this.embedLayer].nodeStyle
if (style['border-color'] === undefined) style['border-color'] = tmp[this.embedLayer].color
return style
}
@ -217,21 +217,6 @@ function addNode(layerName, layerData){ // Does the same thing, but for non-laye
layers[layerName].isLayer = false
}
// If data is a function, return the result of calling it. Otherwise, return the data.
function readData(data, args=null){
if ((!!data && data.constructor && data.call && data.apply))
return data(args);
else
return data;
}
function someLayerUnlocked(row){
for (layer in ROW_LAYERS[row])
if (player[layer].unlocked)
return true
return false
}
// This isn't worth making a .ts file over
const UP = 0

View file

@ -1,27 +1,31 @@
var systemComponents = {
// noinspection SpellCheckingInspection
const systemComponents = {
"tab-buttons": {
props: ["layer", "data", "name"],
template: `
<div class="upgRow">
<div v-for="tab in Object.keys(data)">
<button v-if="data[tab].unlocked == undefined || data[tab].unlocked" v-bind:class="{tabButton: true, notify: subtabShouldNotify(layer, name, tab), resetNotify: subtabResetNotify(layer, name, tab)}" v-bind:style="[{'border-color': tmp[layer].color}, tmp[layer].componentStyles['tab-button'], data[tab].buttonStyle]"
v-on:click="function(){player.subtabs[layer][name] = tab; needCanvasUpdate = true;}">{{tab}}</button>
</div>
</div>
<div class="upgRow">
<div v-for="tab in Object.keys(data)">
<button v-if="data[tab].unlocked === undefined || data[tab].unlocked"
v-bind:class="{tabButton: true, notify: subtabShouldNotify(layer, name, tab), resetNotify: subtabResetNotify(layer, name, tab)}"
v-bind:style="[{'border-color': tmp[layer].color}, tmp[layer].componentStyles['tab-button'], data[tab].buttonStyle]"
v-on:click="function(){player.subtabs[layer][name] = tab; needCanvasUpdate = true;}">{{ tab }}
</button>
</div>
</div>
`
},
"tree-node": {
props: ["layer", "abb", "size"],
template: `
<button v-if="nodeShown(layer)"
v-bind:id="layer"
v-on:click="function() {
<button v-if="nodeShown(layer)"
v-bind:id="layer"
v-on:click="function() {
if(tmp[layer].isLayer) {showTab(layer)}
else {run(layers[layer].onClick, layers[layer])}
}"
v-bind:tooltip="(tmp[layer].tooltip == '') ? false : (tmp[layer].isLayer) ? (
v-bind:tooltip="(tmp[layer].tooltip === '') ? false : (tmp[layer].isLayer) ? (
player[layer].unlocked ? (tmp[layer].tooltip ? tmp[layer].tooltip : formatWhole(player[layer].points) + ' ' + tmp[layer].resource)
: (tmp[layer].tooltipLocked ? tmp[layer].tooltipLocked : 'Reach ' + formatWhole(tmp[layer].requires) + ' ' + tmp[layer].baseResource + ' to unlock (You have ' + formatWhole(tmp[layer].baseAmount) + ' ' + tmp[layer].baseResource + ')')
)
@ -30,61 +34,75 @@ var systemComponents = {
: (tmp[layer].tooltipLocked ? tmp[layer].tooltipLocked : 'I am a button!')
)
"
v-bind:class="{
v-bind:class="{
treeNode: tmp[layer].isLayer,
treeButton: !tmp[layer].isLayer,
smallNode: size == 'small',
smallNode: size === 'small',
[layer]: true,
ghost: tmp[layer].layerShown == 'ghost',
ghost: tmp[layer].layerShown === 'ghost',
hidden: !tmp[layer].layerShown,
locked: tmp[layer].isLayer ? !(player[layer].unlocked || tmp[layer].canReset) : !(tmp[layer].canClick),
notify: tmp[layer].notify,
resetNotify: tmp[layer].prestigeNotify,
can: ((player[layer].unlocked || tmp[layer].isLayer) && tmp[layer].isLayer) || (!tmp[layer].isLayer && tmp[layer].canClick),
}"
v-bind:style="tmp[layer].computedNodeStyle">
{{(abb !== '' && tmp[layer].image === undefined) ? abb : '&nbsp;'}}
</button>
v-bind:style="tmp[layer].computedNodeStyle">
{{ (abb !== '' && tmp[layer].image === undefined) ? abb : '&nbsp;' }}
</button>
`
},
"layer-tab": {
props: ["layer", "back", "spacing", "embedded"],
template: `<div v-bind:style="[tmp[layer].style ? tmp[layer].style : {}, (tmp[layer].tabFormat && !Array.isArray(tmp[layer].tabFormat)) ? tmp[layer].tabFormat[player.subtabs[layer].mainTabs].style : {}]">
<div v-if="back" style="position: fixed; z-index: 100;"><button v-bind:class="back == 'big' ? 'other-back' : 'back'" v-on:click="goBack()"></button></div>
<div v-if="!tmp[layer].tabFormat">
<div v-if="spacing" v-bind:style="{'height': spacing}" :key="this.$vnode.key + '-spacing'"></div>
<info-box v-if="tmp[layer].infoboxes" :layer="layer" :data="Object.keys(tmp[layer].infoboxes)[0]":key="this.$vnode.key + '-info'"></info-box>
<main-display v-bind:style="tmp[layer].componentStyles['main-display']" :layer="layer"></main-display>
<div v-if="tmp[layer].type !== 'none'">
<prestige-button v-bind:style="tmp[layer].componentStyles['prestige-button']" :layer="layer"></prestige-button>
</div>
<resource-display v-bind:style="tmp[layer].componentStyles['resource-display']" :layer="layer"></resource-display>
<milestones v-bind:style="tmp[layer].componentStyles.milestones" :layer="layer"></milestones>
<div v-if="Array.isArray(tmp[layer].midsection)">
<column :layer="layer" :data="tmp[layer].midsection" :key="this.$vnode.key + '-mid'"></column>
</div>
<clickables v-bind:style="tmp[layer].componentStyles['clickables']" :layer="layer"></clickables>
<buyables v-bind:style="tmp[layer].componentStyles.buyables" :layer="layer"></buyables>
<upgrades v-bind:style="tmp[layer].componentStyles['upgrades']" :layer="layer"></upgrades>
<challenges v-bind:style="tmp[layer].componentStyles['challenges']" :layer="layer"></challenges>
<achievements v-bind:style="tmp[layer].componentStyles.achievements" :layer="layer"></achievements>
<br><br>
</div>
<div v-if="tmp[layer].tabFormat">
<div v-if="Array.isArray(tmp[layer].tabFormat)"><div v-if="spacing" v-bind:style="{'height': spacing}"></div>
<column :layer="layer" :data="tmp[layer].tabFormat" :key="this.$vnode.key + '-col'"></column>
</div>
<div v-else>
<div class="upgTable" v-bind:style="{'padding-top': (embedded ? '0' : '25px'), 'margin-top': (embedded ? '-10px' : '0'), 'margin-bottom': '24px'}">
<tab-buttons v-bind:style="tmp[layer].componentStyles['tab-buttons']" :layer="layer" :data="tmp[layer].tabFormat" :name="'mainTabs'"></tab-buttons>
</div>
<layer-tab v-if="tmp[layer].tabFormat[player.subtabs[layer].mainTabs].embedLayer" :layer="tmp[layer].tabFormat[player.subtabs[layer].mainTabs].embedLayer" :embedded="true" :key="this.$vnode.key + '-' + layer"></layer-tab>
<column v-else :layer="layer" :data="tmp[layer].tabFormat[player.subtabs[layer].mainTabs].content" :key="this.$vnode.key + '-col'"></column>
</div>
</div></div>
`
template: `
<div
v-bind:style="[tmp[layer].style ? tmp[layer].style : {}, (tmp[layer].tabFormat && !Array.isArray(tmp[layer].tabFormat)) ? tmp[layer].tabFormat[player.subtabs[layer].mainTabs].style : {}]">
<div v-if="back" style="position: fixed; z-index: 100;">
<button v-bind:class="back === 'big' ? 'other-back' : 'back'" v-on:click="goBack()"></button>
</div>
<div v-if="!tmp[layer].tabFormat">
<div v-if="spacing" v-bind:style="{'height': spacing}" :key="this.$vnode.key + '-spacing'"></div>
<infobox v-if="tmp[layer].infoboxes" :layer="layer" :data="Object.keys(tmp[layer].infoboxes)[0]"
:key="this.$vnode.key + '-info'"></infobox>
<main-display v-bind:style="tmp[layer].componentStyles['main-display']" :layer="layer"></main-display>
<div v-if="tmp[layer].type !== 'none'">
<prestige-button v-bind:style="tmp[layer].componentStyles['prestige-button']"
:layer="layer"></prestige-button>
</div>
<resource-display v-bind:style="tmp[layer].componentStyles['resource-display']"
:layer="layer"></resource-display>
<milestones v-bind:style="tmp[layer].componentStyles.milestones" :layer="layer"></milestones>
<div v-if="Array.isArray(tmp[layer].midsection)">
<column :layer="layer" :data="tmp[layer].midsection" :key="this.$vnode.key + '-mid'"></column>
</div>
<clickables v-bind:style="tmp[layer].componentStyles['clickables']" :layer="layer"></clickables>
<buyables v-bind:style="tmp[layer].componentStyles.buyables" :layer="layer"></buyables>
<upgrades v-bind:style="tmp[layer].componentStyles['upgrades']" :layer="layer"></upgrades>
<challenges v-bind:style="tmp[layer].componentStyles['challenges']" :layer="layer"></challenges>
<achievements v-bind:style="tmp[layer].componentStyles.achievements" :layer="layer"></achievements>
<br><br>
</div>
<div v-if="tmp[layer].tabFormat">
<div v-if="Array.isArray(tmp[layer].tabFormat)">
<div v-if="spacing" v-bind:style="{'height': spacing}"></div>
<column :layer="layer" :data="tmp[layer].tabFormat" :key="this.$vnode.key + '-col'"></column>
</div>
<div v-else>
<div class="upgTable"
v-bind:style="{'padding-top': (embedded ? '0' : '25px'), 'margin-top': (embedded ? '-10px' : '0'), 'margin-bottom': '24px'}">
<tab-buttons v-bind:style="tmp[layer].componentStyles['tab-buttons']" :layer="layer"
:data="tmp[layer].tabFormat" :name="'mainTabs'"></tab-buttons>
</div>
<layer-tab v-if="tmp[layer].tabFormat[player.subtabs[layer].mainTabs].embedLayer"
:layer="tmp[layer].tabFormat[player.subtabs[layer].mainTabs].embedLayer" :embedded="true"
:key="this.$vnode.key + '-' + layer"></layer-tab>
<column v-else :layer="layer" :data="tmp[layer].tabFormat[player.subtabs[layer].mainTabs].content"
:key="this.$vnode.key + '-col'"></column>
</div>
</div>
</div>
`
},
"overlay-head": {

View file

@ -1,22 +1,23 @@
var tmp = {}
var temp = tmp // Proxy for tmp
var funcs = {}
var NaNalert = false;
let tmp = {};
let temp = tmp; // Proxy for tmp
let funcs = {};
// noinspection SpellCheckingInspection
let NaNalert = false;
// Tmp will not call these
var activeFunctions = [
const activeFunctions = [
"startData", "onPrestige", "doReset", "update", "automate",
"buy", "buyMax", "respec", "onComplete", "onPurchase", "onPress", "onClick", "masterButtonPress",
"sellOne", "sellAll", "pay",
]
];
var noCall = doNotCallTheseFunctionsEveryTick
for (item in noCall) {
const noCall = doNotCallTheseFunctionsEveryTick;
for (let item in noCall) {
activeFunctions.push(noCall[item])
}
// Add the names of classes to traverse
var traversableClasses = []
const traversableClasses = [];
function setupTemp() {
tmp = {}
@ -26,7 +27,7 @@ function setupTemp() {
funcs = {}
setupTempData(layers, tmp, funcs)
for (layer in layers){
for (let layer in layers){
tmp[layer].resetGain = {}
tmp[layer].nextAt = {}
tmp[layer].nextAtDisp = {}
@ -41,7 +42,7 @@ function setupTemp() {
}
function setupTempData(layerData, tmpData, funcsData) {
for (item in layerData){
for (let item in layerData){
if (layerData[item] == null) {
tmpData[item] = null
}
@ -61,11 +62,13 @@ function setupTempData(layerData, tmpData, funcsData) {
tmpData[item] = new layerData[item].constructor()
funcsData[item] = new layerData[item].constructor()
}
else if (isFunction(layerData[item]) && !activeFunctions.includes(item)){
funcsData[item] = layerData[item]
tmpData[item] = new Decimal(1) // The safest thing to put probably?
} else {
tmpData[item] = layerData[item]
else { // noinspection JSUnfilteredForInLoop
if (isFunction(layerData[item]) && !activeFunctions.includes(item)){
funcsData[item] = layerData[item]
tmpData[item] = new Decimal(1) // The safest thing to put probably?
} else {
tmpData[item] = layerData[item]
}
}
}
}
@ -76,7 +79,7 @@ function updateTemp() {
updateTempData(layers, tmp, funcs)
for (layer in layers){
for (let layer in layers){
tmp[layer].resetGain = getResetGain(layer)
tmp[layer].nextAt = getNextAt(layer)
tmp[layer].nextAtDisp = getNextAt(layer, true)
@ -93,7 +96,7 @@ function updateTemp() {
tmp.pointGen = getPointGen()
tmp.displayThings = []
for (thing in displayThings){
for (let thing in displayThings){
let text = displayThings[thing]
if (isFunction(text)) text = text()
tmp.displayThings.push(text)
@ -103,7 +106,7 @@ function updateTemp() {
function updateTempData(layerData, tmpData, funcsData) {
for (item in funcsData){
for (let item in funcsData){
if (Array.isArray(layerData[item])) {
updateTempData(layerData[item], tmpData[item], funcsData[item])
}
@ -137,13 +140,13 @@ function updateChallengeTemp(layer)
}
function updateChallengeDisplay(layer) {
for (id in player[layer].challenges) {
for (let id in player[layer].challenges) {
let style = "locked"
if (player[layer].activeChallenge == id && canCompleteChallenge(layer, id)) style = "canComplete"
if (player[layer].activeChallenge === id && canCompleteChallenge(layer, id)) style = "canComplete"
else if (hasChallenge(layer, id)) style = "done"
tmp[layer].challenges[id].defaultStyle = style
tmp[layer].challenges[id].buttonText = (player[layer].activeChallenge==(id)?(canCompleteChallenge(layer, id)?"Finish":"Exit Early"):(hasChallenge(layer, id)?"Completed":"Start"))
tmp[layer].challenges[id].buttonText = (player[layer].activeChallenge===(id)?(canCompleteChallenge(layer, id)?"Finish":"Exit Early"):(hasChallenge(layer, id)?"Completed":"Start"))
}
}
@ -172,8 +175,8 @@ function constructNodeStyle(layer){
function constructAchievementStyles(layer){
for (id in tmp[layer].achievements) {
ach = tmp[layer].achievements[id]
for (let id in tmp[layer].achievements) {
let ach = tmp[layer].achievements[id]
if (isPlainObject(ach)) {
let style = []
if (ach.image){
@ -189,7 +192,7 @@ function constructAchievementStyles(layer){
function constructBarStyles(layer){
if (layers[layer].bars === undefined)
return
for (id in layers[layer].bars){
for (let id in layers[layer].bars){
if (id !== "layer") {
let bar = tmp[layer].bars[id]
if (bar.progress instanceof Decimal)
@ -202,16 +205,16 @@ function constructBarStyles(layer){
if (dir !== undefined)
{
bar.fillDims['clip-path'] = 'inset(0% 50% 0% 0%)'
if(dir == UP){
if(dir === UP){
bar.fillDims['clip-path'] = 'inset(' + bar.progress + '% 0% 0% 0%)'
}
else if(dir == DOWN){
else if(dir === DOWN){
bar.fillDims['clip-path'] = 'inset(0% 0% ' + bar.progress + '% 0%)'
}
else if(dir == RIGHT){
else if(dir === RIGHT){
bar.fillDims['clip-path'] = 'inset(0% ' + bar.progress + '% 0% 0%)'
}
else if(dir == LEFT){
else if(dir === LEFT){
bar.fillDims['clip-path'] = 'inset(0% 0% 0% ' + bar.progress + '%)'
}
@ -224,7 +227,7 @@ function constructBarStyles(layer){
function setupBarStyles(layer){
if (layers[layer].bars === undefined)
return
for (id in layers[layer].bars){
for (let id in layers[layer].bars){
let bar = tmp[layer].bars[id]
bar.dims = {}
bar.fillDims = {}

View file

@ -1,4 +1,4 @@
var layoutInfo = {
const layoutInfo = {
startTab: "none",
showTree: true,
treeLayout: ""
@ -9,6 +9,7 @@ Vue.component("job", {
template: `
<span class="upgRow" v-bind:style="{ opacity: 0, animation: 'showJob .5s ' + layers[data].showJobDelay + 's forwards', marginBottom: '20px' }" v-if="tmp[data].layerShown">
<tree-node :layer='data' :abb='tmp[data].symbol' style="background-size: cover; background-position: center;" v-bind:class="data === 'flowers' && player[data].xp.lte(1) && player[data].resetTime > 20 ? 'tutorial' : ''"></tree-node>
<!--suppress HtmlUnknownTag -->
<div class="job-details" v-bind:style="[player.tab === data ? { '--shadowColor': layers[data].color } : {}, player[data].timeLoopActive ? { '--innerShadowColor': layers[data].color } : {}, {'textAlign': 'left'}]">
<h2>{{layers[data].jobName}}</h2>
<span>Lv. {{formatWhole(getJobLevel(data))}}</span>
@ -28,6 +29,14 @@ function getJobLevel(job) {
return softcap(player[job].xp.clampMin(1).log10().floor().add(1), new Decimal(25)).floor();
}
function checkJobXP(job) {
let jobLevel = new Decimal(getJobLevel(job));
if (jobLevel.neq(player[job].lastLevel)) {
doPopup("none", `Level ${jobLevel}`, "Level Up!", 3, layers[job].color);
player[job].lastLevel = jobLevel;
}
}
function getJobProgressBar(job) {
return {
direction: RIGHT,

View file

@ -155,7 +155,7 @@ function buyUpg(layer, id) {
}
}
player[layer].upgrades.push(id);
if (upg.onPurchase != undefined) {
if (upg.onPurchase !== undefined) {
run(upg.onPurchase, upg);
}
}
@ -215,7 +215,7 @@ function inChallenge(layer, id) {
return false;
}
id = toNumber(id);
if (challenge == id) {
if (challenge === id) {
return true;
}
@ -226,7 +226,8 @@ function inChallenge(layer, id) {
// ************ Misc ************
var onTreeTab = true;
const onTreeTab = true;
function showTab(name) {
if (LAYERS.includes(name) && !layerunlocked(name)) {
return;
@ -234,9 +235,9 @@ function showTab(name) {
if (player.tab === name && isPlainObject(tmp[name].tabFormat)) {
player.subtabs[name].mainTabs = Object.keys(layers[name].tabFormat)[0];
}
var toTreeTab = name == "none";
player.tab = name;
if (player.navTab == "none" && (tmp[name].row !== "side") && (tmp[name].row !== "otherside")) {
if (player.navTab === "none" && (tmp[name].row !== "side") && (tmp[name].row !== "otherside")) {
player.lastSafeTab = name;
}
delete player.notify[name];
@ -249,7 +250,7 @@ function showNavTab(name) {
return;
}
var toTreeTab = name == "tree";
player.navTab = name;
player.notify[name] = false;
needCanvasUpdate = true;
@ -281,9 +282,9 @@ function prestigeNotify(layer) {
return layers[layer].prestigeNotify();
} else if (tmp[layer].autoPrestige || tmp[layer].passiveGeneration) {
return false;
} else if (tmp[layer].type == "static") {
} else if (tmp[layer].type === "static") {
return tmp[layer].canReset;
} else if (tmp[layer].type == "normal") {
} else if (tmp[layer].type === "normal") {
return (tmp[layer].canReset && (tmp[layer].resetGain.gte(player[layer].points.div(10))));
} else {
return false;
@ -291,15 +292,15 @@ function prestigeNotify(layer) {
}
function notifyLayer(name) {
if (player.tab == name || !layerunlocked(name)) {
if (player.tab === name || !layerunlocked(name)) {
return;
}
player.notify[name] = 1;
}
function subtabShouldNotify(layer, family, id) {
let subtab = {};
if (family == "mainTabs") {
let subtab;
if (family === "mainTabs") {
subtab = tmp[layer].tabFormat[id];
} else {
subtab = tmp[layer].microtabs[family][id];
@ -313,8 +314,8 @@ function subtabShouldNotify(layer, family, id) {
}
function subtabResetNotify(layer, family, id) {
let subtab = {};
if (family == "mainTabs") {
let subtab;
if (family === "mainTabs") {
subtab = tmp[layer].tabFormat[id];
} else {
subtab = tmp[layer].microtabs[family][id];
@ -327,19 +328,13 @@ function subtabResetNotify(layer, family, id) {
}
function nodeShown(layer) {
if (layerShown(layer)) {
return true;
}
switch (layer) {
case "idk":
return player.idk.unlocked;
break;
}
return false;
return layerShown(layer);
}
// noinspection SpellCheckingInspection
function layerunlocked(layer) {
if (tmp[layer] && tmp[layer].type == "none") {
if (tmp[layer] && tmp[layer].type === "none") {
return (player[layer].unlocked);
}
return LAYERS.includes(layer) && (player[layer].unlocked || (tmp[layer].canReset && tmp[layer].layerShown));
@ -361,7 +356,7 @@ function toNumber(x) {
}
function updateMilestones(layer) {
for (id in layers[layer].milestones) {
for (let id in layers[layer].milestones) {
if (!(hasMilestone(layer, id)) && layers[layer].milestones[id].done()) {
player[layer].milestones.push(id);
if (isFunction(layers[layer].milestones[id].onComplete)) {
@ -375,7 +370,7 @@ function updateMilestones(layer) {
}
function updateAchievements(layer) {
for (id in layers[layer].achievements) {
for (let id in layers[layer].achievements) {
if (isPlainObject(layers[layer].achievements[id]) && !(hasAchievement(layer, id)) && layers[layer].achievements[id].done()) {
player[layer].achievements.push(id);
if (layers[layer].achievements[id].onComplete) {
@ -400,7 +395,7 @@ function addTime(diff, layer) {
if (time + 0 !== time) {
console.log("Memory leak detected. Trying to fix...");
time = toNumber(time);
if (isNaN(time) || time == 0) {
if (isNaN(time) || time === 0) {
console.log("Couldn't fix! Resetting...");
time = layer ? player.timePlayed : 0;
if (!layer) {
@ -417,6 +412,7 @@ function addTime(diff, layer) {
}
}
let onFocused;
document.onkeydown = function (e) {
if (player === undefined) {
return;
@ -424,7 +420,7 @@ document.onkeydown = function (e) {
if (gameEnded && !player.keepGoing) {
return;
}
let shiftDown = e.shiftKey;
let ctrlDown = e.ctrlKey;
let key = e.key;
if (ctrlDown) {
@ -443,7 +439,8 @@ document.onkeydown = function (e) {
}
};
var onFocused = false;
onFocused = false;
function focused(x) {
onFocused = x;
}
@ -451,12 +448,12 @@ function focused(x) {
function prestigeButtonText(layer) {
if (layers[layer].prestigeButtonText !== undefined) {
return layers[layer].prestigeButtonText();
} else if (tmp[layer].type == "normal") {
} else if (tmp[layer].type === "normal") {
return `${player[layer].points.lt(1e3) ? (tmp[layer].resetDescription !== undefined ? tmp[layer].resetDescription : "Reset for ") : ""}+<b>${formatWhole(tmp[layer].resetGain)}</b> ${tmp[layer].resource} ${tmp[layer].resetGain.lt(100) && player[layer].points.lt(1e3) ? `<br><br>Next at ${(tmp[layer].roundUpCost ? formatWhole(tmp[layer].nextAt) : format(tmp[layer].nextAt))} ${tmp[layer].baseResource}` : ""}`;
} else if (tmp[layer].type == "static") {
} else if (tmp[layer].type === "static") {
return `${tmp[layer].resetDescription !== undefined ? tmp[layer].resetDescription : "Reset for "}+<b>${formatWhole(tmp[layer].resetGain)}</b> ${tmp[layer].resource}<br><br>${player[layer].points.lt(30) ? (tmp[layer].baseAmount.gte(tmp[layer].nextAt) && (tmp[layer].canBuyMax !== undefined) && tmp[layer].canBuyMax ? "Next:" : "Req:") : ""} ${formatWhole(tmp[layer].baseAmount)} / ${(tmp[layer].roundUpCost ? formatWhole(tmp[layer].nextAtDisp) : format(tmp[layer].nextAtDisp))} ${tmp[layer].baseResource}
`;
} else if (tmp[layer].type == "none") {
} else if (tmp[layer].type === "none") {
return "";
} else {
return "You need prestige button text";
@ -476,11 +473,12 @@ document.title = modInfo.name;
// Variables that must be defined to display popups
var activePopups = [];
var popupID = 0;
const activePopups = [];
let popupID = 0;
// Function to show popups
function doPopup(type = "none", text = "This is a test popup.", title = "", timer = 3, color = "") {
let popupTitle, popupType
switch (type) {
case "achievement":
popupTitle = "Achievement Unlocked!";
@ -495,20 +493,17 @@ function doPopup(type = "none", text = "This is a test popup.", title = "", time
popupType = "default-popup";
break;
}
if (title != "") {
if (title !== "") {
popupTitle = title;
}
popupMessage = text;
popupTimer = timer;
activePopups.push({ "time": popupTimer, "type": popupType, "title": popupTitle, "message": (popupMessage + "\n"), "id": popupID, "color": color });
activePopups.push({ "time": timer, "type": popupType, "title": popupTitle, "message": (text + "\n"), "id": popupID, "color": color });
popupID++;
}
//Function to reduce time on active popups
function adjustPopupTime(diff) {
for (popup in activePopups) {
for (let popup in activePopups) {
activePopups[popup].time -= diff;
if (activePopups[popup]["time"] < 0) {
activePopups.splice(popup, 1); // Remove popup when time hits 0

View file

@ -2,7 +2,7 @@
function exponentialFormat(num, precision, mantissa = true) {
let e = num.log10().floor();
let m = num.div(Decimal.pow(10, e));
if(m.toStringWithDecimalPlaces(precision) == 10) {
if(m.toStringWithDecimalPlaces(precision) === 10) {
m = new Decimal(1);
e = e.add(1);
}
@ -23,9 +23,9 @@ function commaFormat(num, precision) {
}
if (precision === null || precision === undefined) {
if (num.layer > 1) {
firstPart = new Decimal(num);
let firstPart = new Decimal(num);
firstPart.mag = Math.floor(num.mag);
secondPart = new Decimal(num);
let secondPart = new Decimal(num);
secondPart.layer = 0;
secondPart.mag = num.mag - firstPart.mag;
return firstPart.floor().toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") + secondPart.toStringWithDecimalPlaces(2).substr(1);
@ -48,18 +48,6 @@ function regularFormat(num, precision) {
return num.toStringWithDecimalPlaces(precision);
}
function fixValue(x, y = 0) {
return x || new Decimal(y);
}
function sumValues(x) {
x = Object.values(x);
if (!x[0]) {
return new Decimal(0);
}
return x.reduce((a, b) => Decimal.add(a, b));
}
function format(decimal, precision=2,) {
decimal = new Decimal(decimal);
if (isNaN(decimal.sign)||isNaN(decimal.layer)||isNaN(decimal.mag)) {
@ -69,11 +57,11 @@ function format(decimal, precision=2,) {
if (decimal.sign<0) {
return "-"+format(decimal.neg(), precision);
}
if (decimal.mag == Number.POSITIVE_INFINITY) {
if (decimal.mag === Number.POSITIVE_INFINITY) {
return "Infinity";
}
if (decimal.gte("eeee1000")) {
var slog = decimal.slog();
const slog = decimal.slog();
if (slog.gte(1e6)) {
return "F" + format(slog.floor());
} else {
@ -117,11 +105,3 @@ function formatTime(s) {
}
}
function toPlaces(x, precision, maxAccepted) {
x = new Decimal(x);
let result = x.toStringWithDecimalPlaces(precision);
if (new Decimal(result).gte(maxAccepted)) {
result = new Decimal(maxAccepted-Math.pow(0.1, precision)).toStringWithDecimalPlaces(precision);
}
return result;
}

View file

@ -1,15 +1,17 @@
let styleCooldown = 0;
// ************ Options ************
function toggleOpt(name) {
if (name == "oldStyle" && styleCooldown > 0)
if (name === "oldStyle" && styleCooldown > 0)
return;
player[name] = !player[name];
if (name == "hqTree")
if (name === "hqTree")
changeTreeQuality();
if (name == "oldStyle")
if (name === "oldStyle")
updateStyle();
}
var styleCooldown = 0;
function updateStyle() {
styleCooldown = 1;
let css = document.getElementById("styleStuff");
@ -17,7 +19,7 @@ function updateStyle() {
needCanvasUpdate = true;
}
function changeTreeQuality() {
var on = player.hqTree;
const on = player.hqTree;
document.body.style.setProperty('--hqProperty1', on ? "2px solid" : "4px solid");
document.body.style.setProperty('--hqProperty2a', on ? "-4px -4px 4px rgba(0, 0, 0, 0.25) inset" : "-4px -4px 4px rgba(0, 0, 0, 0) inset");
document.body.style.setProperty('--hqProperty2b', on ? "0px 0px 20px var(--background)" : "");
@ -31,22 +33,18 @@ function adjustMSDisp() {
player.msDisplay = displays[(displays.indexOf(player.msDisplay) + 1) % 4];
}
function milestoneShown(layer, id) {
complete = player[layer].milestones.includes(id);
auto = layers[layer].milestones[id].toggles;
let complete = player[layer].milestones.includes(id);
let auto = layers[layer].milestones[id].toggles;
switch (player.msDisplay) {
case "always":
return true;
break;
case "automation":
return (auto) || !complete;
break;
case "incomplete":
return !complete;
break;
case "never":
return false;
break;
}
return false;
}

View file

@ -25,17 +25,17 @@ function startPlayerBase() {
};
}
function getStartPlayer() {
playerdata = startPlayerBase();
let playerdata = startPlayerBase();
if (addedPlayerData) {
extradata = addedPlayerData();
for (thing in extradata) {
let extradata = addedPlayerData();
for (let thing in extradata) {
playerdata[thing] = extradata[thing];
}
}
playerdata.infoboxes = {};
for (layer in layers) {
for (let layer in layers) {
playerdata[layer] = getStartLayerData(layer);
if (layers[layer].tabFormat && !Array.isArray(layers[layer].tabFormat)) {
@ -43,7 +43,7 @@ function getStartPlayer() {
playerdata.subtabs[layer].mainTabs = Object.keys(layers[layer].tabFormat)[0];
}
if (layers[layer].microtabs) {
if (playerdata.subtabs[layer] == undefined) {
if (playerdata.subtabs[layer] === undefined) {
playerdata.subtabs[layer] = {};
}
for (item in layers[layer].microtabs) {
@ -51,7 +51,7 @@ function getStartPlayer() {
}
}
if (layers[layer].infoboxes) {
if (playerdata.infoboxes[layer] == undefined) {
if (playerdata.infoboxes[layer] === undefined) {
playerdata.infoboxes[layer] = {};
}
for (item in layers[layer].infoboxes) {
@ -63,7 +63,7 @@ function getStartPlayer() {
return playerdata;
}
function getStartLayerData(layer) {
layerdata = {};
let layerdata = {};
if (layers[layer].startData) {
layerdata = layers[layer].startData();
}
@ -82,7 +82,7 @@ function getStartLayerData(layer) {
}
layerdata.buyables = getStartBuyables(layer);
if (layerdata.clickables == undefined) {
if (layerdata.clickables === undefined) {
layerdata.clickables = getStartClickables(layer);
}
layerdata.spentOnBuyables = new Decimal(0);
@ -95,7 +95,7 @@ function getStartLayerData(layer) {
function getStartBuyables(layer) {
let data = {};
if (layers[layer].buyables) {
for (id in layers[layer].buyables) {
for (let id in layers[layer].buyables) {
if (isPlainObject(layers[layer].buyables[id])) {
data[id] = new Decimal(0);
}
@ -106,7 +106,7 @@ function getStartBuyables(layer) {
function getStartClickables(layer) {
let data = {};
if (layers[layer].clickables) {
for (id in layers[layer].clickables) {
for (let id in layers[layer].clickables) {
if (isPlainObject(layers[layer].clickables[id])) {
data[id] = "";
}
@ -117,7 +117,7 @@ function getStartClickables(layer) {
function getStartChallenges(layer) {
let data = {};
if (layers[layer].challenges) {
for (id in layers[layer].challenges) {
for (let id in layers[layer].challenges) {
if (isPlainObject(layers[layer].challenges[id])) {
data[id] = 0;
}
@ -126,12 +126,12 @@ function getStartChallenges(layer) {
return data;
}
function fixSave() {
defaultData = getStartPlayer();
let defaultData = getStartPlayer();
fixData(defaultData, player);
setBuyableAmount("distill", "retort", (getBuyableAmount("distill", "retort") || new Decimal(0)).max(5));
player.sands.chipping = false;
for (layer in layers) {
for (let layer in layers) {
if (player[layer].best !== undefined) {
player[layer].best = new Decimal(player[layer].best);
}
@ -146,7 +146,7 @@ function fixSave() {
}
}
if (layers[layer].microtabs) {
for (item in layers[layer].microtabs) {
for (let item in layers[layer].microtabs) {
if (!Object.keys(layers[layer].microtabs[item]).includes(player.subtabs[layer][item])) {
player.subtabs[layer][item] = Object.keys(layers[layer].microtabs[item])[0];
}
@ -155,7 +155,7 @@ function fixSave() {
}
}
function fixData(defaultData, newData) {
for (item in defaultData) {
for (let item in defaultData) {
if (defaultData[item] == null) {
if (newData[item] === undefined) {
newData[item] = null;
@ -220,8 +220,9 @@ function setupModInfo() {
function fixNaNs() {
NaNcheck(player);
}
// noinspection SpellCheckingInspection
function NaNcheck(data) {
for (item in data) {
for (let item in data) {
if (data[item] == null) {
} else if (Array.isArray(data[item])) {
NaNcheck(data[item]);
@ -256,8 +257,8 @@ function importSave(imported = undefined, forced = false) {
imported = prompt("Paste your save here");
}
try {
tempPlr = Object.assign(getStartPlayer(), JSON.parse(atob(imported)));
if (tempPlr.versionType != modInfo.id && !forced && !confirm("This save appears to be for a different mod! Are you sure you want to import?")) // Wrong save (use "Forced" to force it to accept.)
let tempPlr = Object.assign(getStartPlayer(), JSON.parse(atob(imported)));
if (tempPlr.versionType !== modInfo.id && !forced && !confirm("This save appears to be for a different mod! Are you sure you want to import?")) // Wrong save (use "Forced" to force it to accept.)
{
return;
}
@ -268,7 +269,7 @@ function importSave(imported = undefined, forced = false) {
save();
window.location.reload();
} catch (e) {
return;
}
}
function versionCheck() {
@ -280,7 +281,7 @@ function versionCheck() {
}
if (setVersion) {
if (player.versionType == modInfo.id && VERSION.num > player.version) {
if (player.versionType === modInfo.id && VERSION.num > player.version) {
player.keepGoing = false;
if (fixOldSave) {
fixOldSave(player.version);
@ -291,7 +292,9 @@ function versionCheck() {
player.beta = VERSION.beta;
}
}
var saveInterval = setInterval(function () {
// noinspection JSUnusedGlobalSymbols
const saveInterval = setInterval(function () {
if (player === undefined) {
return;
}

View file

@ -6,7 +6,7 @@ const theme_names = {
aqua: "Aqua"
};
function changeTheme() {
let aqua = player.theme == "aqua";
let aqua = player.theme === "aqua";
colors_theme = colors[player.theme || "default"];
document.body.style.setProperty("--background", backgroundColor);
document.body.style.setProperty("--background_tooltip", aqua ? "rgba(0, 15, 31, 0.75)" : "rgba(0, 0, 0, 0.75)");
@ -17,15 +17,3 @@ function changeTheme() {
function getThemeName() {
return player.theme ? theme_names[player.theme] : "Default";
}
function switchTheme() {
if (player.theme === undefined) {
player.theme = themes[1];
} else {
player.theme = themes[Object.keys(themes)[player.theme] + 1];
if (!player.theme) {
delete player.theme;
}
}
changeTheme();
resizeCanvas();
}

View file

@ -828,7 +828,7 @@
"/D/projects/The-Modding-Tree/index.html",
"/D/projects/The-Modding-Tree/js/technical/systemComponents.js",
"/D/projects/The-Modding-Tree/js/utils/themes.js",
"/D/projects/The-Modding-Tree/js/utils/NumberFormating.js",
"/D/projects/The-Modding-Tree/js/utils/NumberFormatting.js",
"/D/projects/The-Modding-Tree/style.css",
"/D/projects/The-Modding-Tree/js/components.js",
"/D/projects/OptiSpeech 2/.git/COMMIT_EDITMSG",

941
package-lock.json generated Normal file
View file

@ -0,0 +1,941 @@
{
"name": "kronos",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@babel/code-frame": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
"@babel/highlight": "^7.10.4"
}
},
"@babel/helper-validator-identifier": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
"dev": true
},
"@babel/highlight": {
"version": "7.13.10",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
"integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.12.11",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
"dependencies": {
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
}
}
},
"@eslint/eslintrc": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
"integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.1.1",
"espree": "^7.3.0",
"globals": "^12.1.0",
"ignore": "^4.0.6",
"import-fresh": "^3.2.1",
"js-yaml": "^3.13.1",
"minimatch": "^3.0.4",
"strip-json-comments": "^3.1.1"
}
},
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-jsx": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
"ansi-colors": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
"dev": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
},
"astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
}
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"enquirer": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
"dev": true,
"requires": {
"ansi-colors": "^4.1.1"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"eslint": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.21.0.tgz",
"integrity": "sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
"@eslint/eslintrc": "^0.4.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
"eslint-scope": "^5.1.1",
"eslint-utils": "^2.1.0",
"eslint-visitor-keys": "^2.0.0",
"espree": "^7.3.1",
"esquery": "^1.4.0",
"esutils": "^2.0.2",
"file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
"globals": "^12.1.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash": "^4.17.20",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"progress": "^2.0.0",
"regexpp": "^3.1.0",
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
"table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
}
},
"eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
"eslint-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
}
}
},
"eslint-visitor-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
"dev": true
},
"espree": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
"acorn": "^7.4.0",
"acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^1.3.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
}
}
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
},
"dependencies": {
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
"estraverse": "^5.2.0"
},
"dependencies": {
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
},
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
"file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
"flat-cache": "^3.0.4"
}
},
"flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
}
},
"flatted": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
},
"globals": {
"version": "12.4.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
"integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
"dev": true,
"requires": {
"type-fest": "^0.8.1"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true
},
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
}
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
"requires": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
}
},
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"requires": {
"callsites": "^3.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
"progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
"regexpp": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
"dev": true
},
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true
},
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
},
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"semver": {
"version": "7.3.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
"integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
"shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
"is-fullwidth-code-point": "^3.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
}
}
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
"string-width": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
},
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"table": {
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"dev": true,
"requires": {
"ajv": "^7.0.2",
"lodash": "^4.17.20",
"slice-ansi": "^4.0.0",
"string-width": "^4.2.0"
},
"dependencies": {
"ajv": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
"integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
}
}
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1"
}
},
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true
},
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
}
},
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
}

View file

@ -1,5 +1,4 @@
.popup {
border: 4px solid;
border-radius: 7px;
width: 300px;
min-height: 60px;
@ -8,7 +7,7 @@
margin-top: 30px;
padding-top: 15px;
padding-bottom: 15px;
border-color: rgba(0, 0, 0, 0.25);
border: 4px solid rgba(0, 0, 0, 0.25);
}
@ -19,26 +18,32 @@
width: 300px;
}
/*noinspection CssUnusedSymbol*/
.achievement-popup {
background: #7182BC;
}
/*noinspection CssUnusedSymbol*/
.milestone-popup {
background: #D1C23C;
}
/*noinspection CssUnusedSymbol,CssUnusedSymbol*/
.fade-enter-active, .fade-leave-active {
transition: opacity .3s
}
/*noinspection CssUnusedSymbol*/
.fade-transition {
transition: opacity .3s
}
/*noinspection CssUnusedSymbol,CssUnusedSymbol*/
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
opacity: 0
}
/*noinspection CssUnusedSymbol*/
.redtext {
color: red;
}

124
style.css
View file

@ -54,6 +54,7 @@ td {
vertical-align: 0
}
/*noinspection CssUnusedSymbol*/
.bigUpgAlign {
vertical-align: 0
}
@ -63,7 +64,7 @@ h1, h2, h3, b, input {
}
/*noinspection CssUnresolvedCustomProperty,CssUnresolvedCustomProperty,CssUnresolvedCustomProperty,CssUnresolvedCustomProperty*/
.treeNode {
height: 100px;
width: 100px;
@ -78,6 +79,7 @@ h1, h2, h3, b, input {
}
/*noinspection CssUnresolvedCustomProperty,CssUnresolvedCustomProperty,CssUnresolvedCustomProperty,CssUnresolvedCustomProperty,CssUnusedSymbol*/
.treeButton {
height: 100px;
width: 100px;
@ -93,6 +95,7 @@ h1, h2, h3, b, input {
}
/*noinspection CssUnusedSymbol*/
.smallNode {
height: 60px;
width: 60px;
@ -100,6 +103,7 @@ h1, h2, h3, b, input {
}
/*noinspection CssUnusedSymbol*/
.locked {
background-color: #3a3e45;
color: white;
@ -116,17 +120,20 @@ h1, h2, h3, b, input {
}
/*noinspection CssUnresolvedCustomProperty,CssUnusedSymbol*/
.resetNotify {
box-shadow: var(--hqProperty2a), 0 0 8px #ffffff;
z-index: 3
}
/*noinspection CssUnresolvedCustomProperty*/
.treeNode.can:hover {
transform: scale(1.15, 1.15);
box-shadow: var(--hqProperty2a), 0 0 20px var(--points);
z-index: 4
}
/*noinspection CssUnresolvedCustomProperty,CssUnusedSymbol*/
.notify {
transform: scale(1.05, 1.05);
border-color: rgba(0, 0, 0, 0.125);
@ -134,11 +141,13 @@ h1, h2, h3, b, input {
z-index: 3
}
/*noinspection CssUnusedSymbol*/
.bought {
background-color: #5C8A58;
cursor: default;
}
/*noinspection CssUnusedSymbol*/
.back {
position: absolute;
top: 0;
@ -167,11 +176,13 @@ h1, h2, h3, b, input {
padding-bottom: 20px;
}
/*noinspection CssUnusedSymbol*/
.back:hover {
transform: scale(1.1, 1.1);
text-shadow: 0 0 7px var(--color);
}
/*noinspection CssUnusedSymbol*/
.barBase {
overflow: hidden;
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
@ -193,7 +204,6 @@ h1, h2, h3, b, input {
vertical-align: middle;
display: flex;
justify-content: center;
align-items: left;
position: absolute;
}
@ -203,13 +213,14 @@ h1, h2, h3, b, input {
position: absolute;
overflow: hidden;
margin-left: -0.5px;
transition-property: : clip-path;
transition-property: clip-path;
}
.overlayText {
z-index: 6;
}
/*noinspection CssUnusedSymbol*/
.tabButton {
background-color: transparent;
color: var(--color);
@ -219,10 +230,10 @@ h1, h2, h3, b, input {
margin: 5px;
border-radius: 10px;
border: 2px solid;
color: var(--color);
}
/*noinspection CssUnusedSymbol*/
.tabButton:hover {
transform: scale(1.1, 1.1);
text-shadow: 0 0 7px var(--color);
@ -232,30 +243,31 @@ h1, h2, h3, b, input {
height: 120px;
width: 180px;
border-radius: 25%;
border: 4px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 4px solid rgba(0, 0, 0, 0.125);
}
/*noinspection CssUnusedSymbol*/
.upg {
height: 150px;
width: 150px;
border-radius: 5px;
border: 2px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 2px solid rgba(0, 0, 0, 0.125);
font-size: 10px;
margin: 5px;
}
/*noinspection CssUnusedSymbol*/
.achievement {
height: 90px;
width: 90px;
border-radius: 25%;
border: 2px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 2px solid rgba(0, 0, 0, 0.125);
font-size: 10px;
color: white;
text-shadow: 0 0 2px #000000;
}
/*noinspection CssUnusedSymbol*/
.achievement:hover {
box-shadow: 0 0 10px var(--points);
z-index: 7;
@ -265,17 +277,16 @@ h1, h2, h3, b, input {
height: 200px;
width: 200px;
border-radius: 5px;
border: 2px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 2px solid rgba(0, 0, 0, 0.125);
font-size: 10px;
}
/*noinspection CssUnusedSymbol*/
.upgBig {
height: 200px;
width: 200px;
border-radius: 25%;
border: 2px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 2px solid rgba(0, 0, 0, 0.125);
}
.longUpg {
@ -283,8 +294,7 @@ h1, h2, h3, b, input {
width: 120px;
background: var(--points);
border-radius: 50%;
border: 2px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 2px solid rgba(0, 0, 0, 0.125);
font-size: 10px;
}
@ -292,8 +302,7 @@ h1, h2, h3, b, input {
height: 40px;
width: 40px;
border-radius: 5px;
border: 2px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 2px solid rgba(0, 0, 0, 0.125);
margin-top: 4px;
}
@ -328,9 +337,8 @@ a {
height: 100px;
width: 100px;
border-radius: 25%;
border: 4px solid;
background-color: var(--color);
border-color: rgba(0, 0, 0, 0.125);
border: 4px solid rgba(0, 0, 0, 0.125);
color: rgba(0, 0, 0, 0.5);
cursor: pointer;
}
@ -351,6 +359,7 @@ a {
z-index: -999;
}
/*noinspection CssUnusedSymbol*/
.milestone {
width: 100%;
min-width: 120px;
@ -358,12 +367,12 @@ a {
padding-right: 5px;
height: 75px;
background-color: #3a3e45;
border: 4px solid;
border-radius: 4px;
border-color: rgba(0, 0, 0, 0.125);
border: 4px solid rgba(0, 0, 0, 0.125);
color: rgba(0, 0, 0, 0.5);
}
/*noinspection CssUnusedSymbol*/
.milestoneDone {
width: 100%;
min-width: 120px;
@ -372,9 +381,8 @@ a {
height: 75px;
background-color: #5C8A58;
border: 4px solid;
border-radius: 4px;
border-color: rgba(0, 0, 0, 0.125);
border: 4px solid rgba(0, 0, 0, 0.125);
color: rgba(0, 0, 0, 0.5);
}
@ -383,16 +391,19 @@ a {
left: 0;
}
/*noinspection CssUnusedSymbol*/
.remove {
height: 24px;
width: 24px;
cursor: pointer;
}
/*noinspection CssUnusedSymbol*/
.remove:hover {
transform: scale(1.1, 1.1);
}
/*noinspection CssUnusedSymbol*/
.col {
min-width: 49.5%;
max-width: 49.5%;
@ -412,10 +423,12 @@ a {
transition-duration: 0s !important
}
/*noinspection CssUnusedSymbol*/
.fast {
transition:color none
transition:color 0s;
}
/*noinspection CssUnusedSymbol*/
.col.right {
top: 50px;
right: 0;
@ -424,11 +437,14 @@ a {
#app {
column-count: 2;
column-width: 50%;
min-height: calc(100% - 50px);
margin-top: 50px;
}
#app {
column-width: 50%;
}
.vl {
border-left: 6px solid var(--color);
height: 100%;
@ -451,10 +467,10 @@ ul {
list-style-type: none;
}
/*noinspection CssUnusedSymbol*/
.hChallenge {
background-color: #bf8f8f;
border: 4px solid;
border-color: rgba(0, 0, 0, 0.125);
border: 4px solid rgba(0, 0, 0, 0.125);
color: rgba(0, 0, 0, 0.5);
width: 300px;
height: 300px;
@ -462,10 +478,12 @@ ul {
border-radius: 33.33%;
}
/*noinspection CssUnusedSymbol*/
.hChallenge.done {
background-color: #77bf5f;
}
/*noinspection CssUnusedSymbol,CssUnusedSymbol*/
.hChallenge.canComplete {
background-color: #ffbf00;
}
@ -496,6 +514,7 @@ ul {
-webkit-transform:translate3d(0,0,0);
}
/*noinspection CssUnresolvedCustomProperty*/
[tooltip]:before {
position: absolute;
bottom: 100%;
@ -517,6 +536,7 @@ ul {
white-space: pre-wrap;
}
/*noinspection CssUnresolvedCustomProperty*/
[tooltip]:after {
position: absolute;
bottom: 100%;
@ -574,10 +594,12 @@ button > * {
pointer-events:none;
}
/*noinspection CssUnusedSymbol*/
.ghost {
visibility: hidden
}
/*noinspection CssUnresolvedCustomProperty,CssUnusedSymbol*/
.story {
width: 600px;
max-width: 95%;
@ -585,6 +607,7 @@ button > * {
color: var(--lore-color);
}
/*noinspection CssUnresolvedCustomProperty*/
.story-title {
text-align: left;
font-size: 24px;
@ -607,9 +630,8 @@ button > * {
.story-text {
padding: 8px;
border: solid 4px;
border-color: inherit;
max-height: 100%;
border: 4px solid;
max-height: 100%;
overflow-y: hidden;
transition-duration: 0s;
}
@ -681,8 +703,8 @@ button > * {
#info:hover {
transform: scale(1.2, 1.2);
text-shadow: 5px 0px 10px #02f2f2,
-3px 0px 12px #02f2f2;
text-shadow: 5px 0 10px #02f2f2,
-3px 0 12px #02f2f2;
}
#discord {
@ -699,8 +721,7 @@ button > * {
#discord-links {
position: fixed;
top: 0;
padding: 30px;
padding-top: 80px;
padding: 80px 30px 30px;
right: -280px;
width: 200px;
transition: right .25s ease;
@ -722,10 +743,11 @@ button > * {
#version:hover {
transform: scale(1.2, 1.2);
text-shadow: 5px 0px 10px var(--points),
-3px 0px 12px var(--points);
text-shadow: 5px 0 10px var(--points),
-3px 0 12px var(--points);
}
/*noinspection CssUnusedSymbol*/
.tutorial {
animation: shockwave 2s infinite;
}
@ -760,6 +782,7 @@ button > * {
}
@media only screen and (max-width: 1200px) {
/*noinspection CssUnusedSymbol*/
.col.right {
min-width: 100%;
background: var(--background);
@ -772,7 +795,7 @@ button > * {
display: flex;
flex-direction: column;
justify-content: space-evenly;
box-shadow: black 4px 4px 8px 0px;
box-shadow: black 4px 4px 8px 0;
border-radius: 10px;
position: relative;
margin: 10px auto;
@ -803,12 +826,14 @@ button > * {
max-height: 100%;
}
/*noinspection CssUnusedSymbol,CssUnusedSymbol*/
.selectedCard, .selectedCard:hover {
transform: scale(1.2);
box-shadow: black 0 0 16px 8px;
z-index: 2;
}
/*noinspection CssUnusedSymbol*/
.flipCard {
animation: flip 1s;
}
@ -823,6 +848,7 @@ button > * {
}
}
/*noinspection CssUnusedSymbol*/
.cursor {
cursor: pointer;
}
@ -845,6 +871,7 @@ button > * {
background: white;
}
/*noinspection CssUnresolvedCustomProperty,CssUnresolvedCustomProperty*/
.hourglass {
--polygonH: polygon(0% 0%,100% 0%,100% 5.55%,95% 5.55%,95% 28%,60% 46%,60% 54%,95% 72%,95% 94.45%,100% 94.45%,100% 100%,0% 100%,0% 94.45%,5% 94.45%,5% 72%,40% 54%,40% 46%,5% 28%,5% 5.55%,0% 5.55%);
animation-name: flipHourglass;
@ -867,6 +894,8 @@ button > * {
display: block;
position: absolute;
}
/*noinspection CssUnresolvedCustomProperty,CssUnresolvedCustomProperty,CssUnresolvedCustomProperty*/
.hourglass:before {
--polygonB1: polygon(0% 0%,100% 0%,100% 24%,50% 47%,50% 47%,50% 47%,50% 47%,50% 47%,50% 47%,50% 47%,50% 47%,0% 24%);
--polygonB2: polygon(0% 4%,100% 4%,100% 24%,55% 45%,55% 100%,55% 100%,55% 100%,45% 100%,45% 100%,45% 100%,45% 45%,0% 24%);
@ -887,16 +916,14 @@ button > * {
height: 8em;
z-index: 1;
}
/*noinspection CssUnresolvedCustomProperty,CssUnresolvedCustomProperty*/
.hourglass:after {
animation-name: glare;
animation-duration: var(--flip-duration);
animation-delay: 0s;
animation-play-state: var(--flip-state);
background:
linear-gradient(90deg,#0000 0.5em,#0003 0.5em 1.5em,#0000 1.5em 3.5em,#fff3 3.5em 4.5em,#fff0 4.5em 6.5em,#0003 6.5em 7.5em,#0000 7.5em) 0 0 / 100% 0.5em,
linear-gradient(90deg,#0000 0.75em,#0003 0.75em 1.25em,#0000 1.25em 3.75em,#fff3 3.75em 4.25em,#fff0 4.25em 6.75em,#0003 6.75em 7.25em,#0000 7.25em) 0 0.5em / 100% 8em,
linear-gradient(90deg,#0000 0.5em,#0003 0.5em 1.5em,#0000 1.5em 3.5em,#fff3 3.5em 4.5em,#fff0 4.5em 6.5em,#0003 6.5em 7.5em,#0000 7.5em) 0 100% / 100% 0.5em;
background-repeat: repeat-x;
background: linear-gradient(90deg, #0000 0.5em, #0003 0.5em 1.5em, #0000 1.5em 3.5em, #fff3 3.5em 4.5em, #fff0 4.5em 6.5em, #0003 6.5em 7.5em, #0000 7.5em) linear-gradient(90deg, #0000 0.75em, #0003 0.75em 1.25em, #0000 1.25em 3.75em, #fff3 3.75em 4.25em, #fff0 4.25em 6.75em, #0003 6.75em 7.25em, #0000 7.25em) linear-gradient(90deg, #0000 0.5em, #0003 0.5em 1.5em, #0000 1.5em 3.5em, #fff3 3.5em 4.5em, #fff0 4.5em 6.5em, #0003 6.5em 7.5em, #0000 7.5em) repeat-x 0 0 0 0.5em 0 100%;
top: 0;
left: -3em;
width: 200%;
@ -946,11 +973,14 @@ b, h3 {
text-shadow: 0 0 black;
}
/*noinspection CssUnusedSymbol*/
.gradient-border {
--border-width: 4px;
position: relative;
background-clip: content-box;
}
/*noinspection CssUnusedSymbol*/
.gradient-border::before {
position: absolute;
content: "";
@ -962,6 +992,8 @@ b, h3 {
bottom: 0;
border-radius: 5px;
}
/*noinspection CssUnusedSymbol*/
.gradient-border::after {
position: absolute;
content: "";
@ -970,9 +1002,8 @@ b, h3 {
z-index: -2;
width: calc(100% + var(--border-width) * 2);
height: calc(100% + var(--border-width) * 2);
background: linear-gradient(60deg, rgba(14,0,255,1) 0%, rgba(4,194,118,1) 16%, rgba(9,9,121,1) 35%, rgba(6,139,170,1) 59%, rgba(113,3,216,1) 81%, rgba(0,212,255,1) 100%);
background-size: 300% 300%;
background-position: 0 50%;
background: linear-gradient(60deg, rgba(14, 0, 255, 1) 0%, rgba(4, 194, 118, 1) 16%, rgba(9, 9, 121, 1) 35%, rgba(6, 139, 170, 1) 59%, rgba(113, 3, 216, 1) 81%, rgba(0, 212, 255, 1) 100%) 0 50%;
border-radius: 5px;
animation: moveGradient 8s alternate infinite;
}
@ -993,6 +1024,7 @@ b, h3 {
flex-flow: column;
}
/*noinspection CssUnresolvedCustomProperty*/
.instrument::before {
content: "";
position: absolute;
@ -1022,7 +1054,7 @@ b, h3 {
width: 100px;
border-bottom: solid 2px;
border-radius: 20px;
background: rgb(1, 1, 1, .25);
background: rgba(1, 1, 1, .25);
}
.battery path {