1
0
Fork 0
mirror of https://github.com/Acamaeda/The-Modding-Tree.git synced 2024-11-21 16:13:55 +00:00

Mostly centralized layer additions, and removed previously existing content.

This commit is contained in:
Acamaeda 2020-09-24 11:54:41 -04:00
parent f5bc5580c5
commit b55185d96c
11 changed files with 1867 additions and 4651 deletions

View file

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 Jacorb
Original Prestige Tree Copyright (c) 2020 Jacorb
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

File diff suppressed because it is too large Load diff

188
Old Code/archivedHTML.html Normal file
View file

@ -0,0 +1,188 @@
<div v-if="layer=='g'">
<table>
<tr v-if="milestoneShown(player.g.best.gte(8)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.g.best.lt(8)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.g.best.gte(8)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>8 Generators</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.g.best.gte(10))"><td v-bind:class="{ milestone: player.g.best.lt(10), milestoneDone: player.g.best.gte(10) }"><h3>10 Generators</h3><br>Gain 100% of Prestige Point gain every second</td></tr>
<tr v-if="milestoneShown(player.g.best.gte(15))"><td v-bind:class="{ milestone: player.g.best.lt(15), milestoneDone: player.g.best.gte(15) }"><h3>15 Generators</h3><br>You can buy max Generators</td></tr>
</table><br><br>
You have {{format(player.g.power)}} Generator Power, which multiplies Point gain by {{format(tmp.genPowEff)}}
</div>
<div v-if="layer=='e'">
<table>
<tr v-if="milestoneShown(player.e.best.gte(2))"><td v-bind:class="{ milestone: player.e.best.lt(2), milestoneDone: player.e.best.gte(2) }"><h3>2 enhance points</h3><br>Keep Booster/Generator milestones on reset</td></tr>
<tr v-if="milestoneShown(player.e.best.gte(10)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.e.best.lt(10)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.e.best.gte(10)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>10 enhance points</h3><br>Keep Prestige Upgrades on reset</td></tr>
</table><br><br>
<button v-bind:class="{ upgBig: true, can: player.e.points.gte(getEnhancerCost()), locked: player.e.points.lt(getEnhancerCost()), e: true }" onclick="buyEnhancer()">Buy an Enhancer<br>Cost: {{formatWhole(getEnhancerCost())}} Enhance Points<br>Amount: {{formatWhole(player.e.enhancers.sub(tmp.subbedEnh))}}<br>Multiplies Prestige Point gain by {{format(tmp.enhEff)}}<br>Adds<span v-if="player.q.upgrades.includes(53)"> and multiplies</span> to base of Booster/Generator effects by {{format(tmp.enhEff2)}}</button>
</div>
<div v-if="layer=='t'">
<table>
<tr v-if="milestoneShown(player.t.best.gte(2))"><td v-bind:class="{ milestone: player.t.best.lt(2), milestoneDone: player.t.best.gte(2) }"><h3>2 time capsules</h3><br>Keep Booster/Generator milestones on reset</td></tr>
<tr v-if="milestoneShown(player.t.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.t.best.lt(3)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.t.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>3 time capsules</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.t.best.gte(4))"><td v-bind:class="{ milestone: player.t.best.lt(4), milestoneDone: player.t.best.gte(4) }"><h3>4 time capsules</h3><br>Keep Booster Upgrades on all row 3 resets</td></tr>
<tr v-if="milestoneShown(player.t.best.gte(5), true)"><td v-bind:class="{ milestone: player.t.best.lt(5), milestoneDone: player.t.best.gte(5) }"><h3>5 time capsules</h3><br>Automatically purchase Boosters&nbsp;&nbsp;&nbsp;<button v-if="player.t.best.gte(5)" class="smallUpg can b" onclick="toggleAuto('b')">{{player.b.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.t.best.gte(12))"><td v-bind:class="{ milestone: player.t.best.lt(12), milestoneDone: player.t.best.gte(12) }"><h3>12 time capsules</h3><br>Boosters reset nothing</td></tr>
</table><br><br>
You have {{format(player.t.energy)}} Time Energy, which multiplies Point gain & Prestige Point gain by {{format(tmp.timeEff)}}<br>
You have {{ format(player.b.points) }} Boosters<br><br>
<button v-bind:class="{ upgBig: true, can: (player.b.points.gte(getExtCapsuleCost())&&player.t.unl), locked: (player.b.points.lt(getExtCapsuleCost())||!player.t.unl), t: true }" onclick="buyExtCapsule()">Buy an extra Time Capsule<br>Cost: {{formatWhole(getExtCapsuleCost())}} Boosters<br>Amount: {{formatWhole(player.t.extCapsules)}}</button>
</div>
<div v-if="layer=='s'">
<table>
<tr v-if="milestoneShown(player.s.best.gte(2))"><td v-bind:class="{ milestone: player.s.best.lt(2), milestoneDone: player.s.best.gte(2) }"><h3>2 space energy</h3><br>Keep Booster/Generator milestones on reset</td></tr>
<tr v-if="milestoneShown(player.s.best.gte(3)||player.h.best.gte(1)||player.h.best.gte(1))"><td v-bind:class="{ milestone: player.s.best.lt(3)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.s.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>3 space energy</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.s.best.gte(4))"><td v-bind:class="{ milestone: player.s.best.lt(4), milestoneDone: player.s.best.gte(4) }"><h3>4 space energy</h3><br>Keep Generator Upgrades on all row 3 resets</td></tr>
<tr v-if="milestoneShown(player.s.best.gte(5), true)"><td v-bind:class="{ milestone: player.s.best.lt(5), milestoneDone: player.s.best.gte(5) }"><h3>5 space energy</h3><br>Automatically purchase Generators&nbsp;&nbsp;&nbsp;<button v-if="player.s.best.gte(5)" class="smallUpg can g" onclick="toggleAuto('g')">{{player.g.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.s.best.gte(12))"><td v-bind:class="{ milestone: player.s.best.lt(12), milestoneDone: player.s.best.gte(12) }"><h3>12 space energy</h3><br>Generators reset nothing</td></tr>
</table><br><br>
You have {{formatWhole(getSpace())}} Space remaining for Space Buildings.<br>
You have {{ format(player.g.power) }} Generator Power<br><br>
<button onclick="respecSpaceBuildings()" v-bind:class="{ longUpg: true, s: true, can: player.s.unl, locked: !player.s.unl }">Respec Space Buildings</button><br>
<div class="upgRow">
<div v-for="id in tmp.s.trueSbUnl">
<button v-bind:class="{ upg: true, can: (player.g.power.gte(getSpaceBuildingCost(id))&&player.s.unl&&getSpace().gte(1)), locked: (!(player.g.power.gte(getSpaceBuildingCost(id))&&player.s.unl&&getSpace().gte(1))), s: true }" v-on:click="buyBuilding(id)"><h3>Building {{id}}</h3><br>{{getSpaceBuildingEffDesc(id)}}<br><br>Level: {{formatWhole(tmp.s.sb[id])}}<br>Cost: {{format(getSpaceBuildingCost(id))}} Generator Power</button><br><br>
<button v-if="player.q.best.gte(2500)" v-bind:class="{ longUpg: true, s: true, can: tmp.s.sb[id].gte(1), locked: tmp.s.sb[id].lt(1) }" v-on:click="destroyBuilding(id)">Destroy One</button><br>
<button v-if="player.q.best.gte(2500)" v-bind:class="{ longUpg: true, s: true, can: tmp.s.sb[id].gte(1), locked: tmp.s.sb[id].lt(1) }" v-on:click="destroyBuilding(id, true)">Destroy All</button>
</div>
</div>
</div>
<div v-if="layer=='sb'">
<table><tr v-if="milestoneShown(player.sb.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.sb.best.lt(3)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.sb.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>3 Super-Boosters</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.sb.best.gte(4))"><td v-bind:class="{ milestone: player.sb.best.lt(4), milestoneDone: player.sb.best.gte(4) }"><h3>4 Super-Boosters</h3><br>Keep Booster/Generator milestones on reset</td></tr></table>
</div>
<div v-if="layer=='sg'">
<table>
<tr v-if="milestoneShown(player.sg.best.gte(1))"><td v-bind:class="{ milestone: player.sg.best.lt(1), milestoneDone: player.sg.best.gte(1) }"><h3>1 Super-Generator</h3><br>You can buy max Super-Generators, and Super-Generators reset nothing</td></tr>
<tr v-if="milestoneShown(player.sg.best.gte(2), true)"><td v-bind:class="{ milestone: player.sg.best.lt(2), milestoneDone: player.sg.best.gte(2) }"><h3>2 Super-Generators</h3><br>Automatically purchase Super-Generators&nbsp;&nbsp;&nbsp;<button v-if="player.sg.best.gte(2)" class="smallUpg can sg" onclick="toggleAuto('sg')">{{player.sg.auto?"ON":"OFF"}}</button></td></tr>
</table><br><br>
You have {{format(player.sg.power)}} Super-Generator Power, which multiplies the Generator base by {{format(tmp.sGenPowEff)}}
</div>
<div v-if="layer=='h'">
<table><tr v-if="milestoneShown(player.h.best.gte(1))"><td v-bind:class="{ milestone: player.h.best.lt(1), milestoneDone: player.h.best.gte(1) }"><h3>1 Hindrance Spirit</h3><br>Keep Prestige Upgrades on all previous resets, and gain 100x more Enhance Points</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(2))"><td v-bind:class="{ milestone: player.h.best.lt(2), milestoneDone: player.h.best.gte(2) }"><h3>2 Hindrance Spirit</h3><br>Keep all third row milestones on all fourth row resets, and start with your best-ever Space</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(4))"><td v-bind:class="{ milestone: player.h.best.lt(4), milestoneDone: player.h.best.gte(4) }"><h3>4 Hindrance Spirit</h3><br>Keep Time, Enhance, and Space Upgrades on all fourth row resets</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(5), true)"><td v-bind:class="{ milestone: player.h.best.lt(5), milestoneDone: player.h.best.gte(5) }"><h3>5 Hindrance Spirit</h3><br>Automatically purchase Extra Time Capsules&nbsp;&nbsp;&nbsp;<button v-if="player.h.best.gte(5)" class="smallUpg can t" onclick="toggleAuto('t', 'Cap')">{{player.t.autoCap?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.h.best.gte(10))"><td v-bind:class="{ milestone: player.h.best.lt(10), milestoneDone: player.h.best.gte(10) }"><h3>10 Hindrance Spirit</h3><br>Keep Prestige & Super-Booster Upgrades on all fourth row resets</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(15), true)"><td v-bind:class="{ milestone: player.h.best.lt(15), milestoneDone: player.h.best.gte(15) }"><h3>15 Hindrance Spirit</h3><br>Automatically purchase Super-Boosters&nbsp;&nbsp;&nbsp;<button v-if="player.h.best.gte(15)" class="smallUpg can sb" onclick="toggleAuto('sb')">{{player.sb.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.h.best.gte(25))"><td v-bind:class="{ milestone: player.h.best.lt(25), milestoneDone: player.h.best.gte(25) }"><h3>25 Hindrance Spirit</h3><br>Time resets reset nothing</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(2500))"><td v-bind:class="{ milestone: player.h.best.lt(2500), milestoneDone: player.h.best.gte(2500) }"><h3>2,500 Hindrance Spirit</h3><br>Super-Boosters reset nothing</td></tr>
</table>
</div>
<div v-if="layer=='q'">
<table><tr v-if="milestoneShown(player.q.best.gte(1))"><td v-bind:class="{ milestone: player.q.best.lt(1), milestoneDone: player.q.best.gte(1) }"><h3>1 Quirk</h3><br>Keep Prestige Upgrades on all previous resets, and gain 100x more Enhance Points</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(2))"><td v-bind:class="{ milestone: player.q.best.lt(2), milestoneDone: player.q.best.gte(2) }"><h3>2 Quirks</h3><br>You can buy max Time Capsules & Space Energy</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(4))"><td v-bind:class="{ milestone: player.q.best.lt(4), milestoneDone: player.q.best.gte(4) }"><h3>4 Quirks</h3><br>Keep Space Buildings on all fourth row resets</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(5), true)"><td v-bind:class="{ milestone: player.q.best.lt(5), milestoneDone: player.q.best.gte(5) }"><h3>5 Quirks</h3><br>Automatically purchase Enhancers&nbsp;&nbsp;&nbsp;<button v-if="player.q.best.gte(5)" class="smallUpg can e" onclick="toggleAuto('e')">{{player.e.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.q.best.gte(10), true)"><td v-bind:class="{ milestone: player.q.best.lt(10), milestoneDone: player.q.best.gte(10) }"><h3>10 Quirks</h3><br>Automatically purchase Time Capsules & Space Energy<br><button v-if="player.q.best.gte(10)" class="smallUpg can t" onclick="toggleAuto('t')">{{player.t.auto?"ON":"OFF"}}</button>&nbsp;<button v-if="player.q.best.gte(10)" class="smallUpg can s" onclick="toggleAuto('s')">{{player.s.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.q.best.gte(15))"><td v-bind:class="{ milestone: player.q.best.lt(15), milestoneDone: player.q.best.gte(15) }"><h3>15 Quirks</h3><br>Gain 100% of Enhance Point gain every second</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(25))"><td v-bind:class="{ milestone: player.q.best.lt(25), milestoneDone: player.q.best.gte(25) }"><h3>25 Quirks</h3><br>Space resets reset nothing</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(2500))"><td v-bind:class="{ milestone: player.q.best.lt(2500), milestoneDone: player.q.best.gte(2500) }"><h3>2,500 Quirks</h3><br>You can destroy individual Space Buildings</td></tr>
</table><br><br>
You have {{format(player.q.energy)}} Quirk Energy (generated by Quirk Layers), which multiplies Point & Generator Power gain by {{format(tmp.quirkEff)}}<br>
<button v-bind:class="{ upgBig: true, can: player.q.points.gte(getQuirkLayerCost()), locked: player.q.points.lt(getQuirkLayerCost()), q: true }" onclick="buyQuirkLayer()">Increment your Quirk Layer<br>Cost: {{formatWhole(getQuirkLayerCost())}} Quirks<br>Layers: {{formatWhole(player.q.layers)}}</button>
</div>
<div v-if="layer=='hb'">
<table>
<tr v-if="milestoneShown(player.hb.best.gte(1))"><td v-bind:class="{ milestone: player.hb.best.lt(1), milestoneDone: player.hb.best.gte(1) }"><h3>1 Hyper-Booster</h3><br>You can buy max Super-Boosters</td></tr>
</table>
</div>
<div v-if="layer=='ss'">
<table>
<tr v-if="milestoneShown(player.ss.best.gte(1), true)"><td v-bind:class="{ milestone: player.ss.best.lt(1), milestoneDone: player.ss.best.gte(1) }"><h3>1 Subspace Energy</h3><br>Automatically purchase Space Buildings&nbsp;&nbsp;&nbsp;<button v-if="player.ss.best.gte(1)" class="smallUpg can s" onclick="toggleAuto('s', 'Build')">{{player.s.autoBuild?"ON":"OFF"}}</button></td></tr>
</table><br><br>
You have {{format(player.ss.subspace)}} Subspace, which provides you with {{formatWhole(tmp.ssEff1)}} extra Space, makes all Space Buildings {{format(tmp.ssEff2)}}x cheaper, and makes all Space Buildings {{format(tmp.ssEff3.sub(1).times(100))}}% stronger
</div>
<div v-if="layer=='m'">
<table>
<tr v-if="milestoneShown(player.m.total.gte(1))"><td v-bind:class="{ milestone: player.m.total.lt(1), milestoneDone: player.m.total.gte(1) }"><h3>1 total Magic</h3><br>Keep row 4 milestones on all resets</td></tr>
<tr v-if="milestoneShown(player.m.total.gte(2))"><td v-bind:class="{ milestone: player.m.total.lt(2), milestoneDone: player.m.total.gte(2) }"><h3>2 total Magic</h3><br>Keep Hindrance completions on all resets</td></tr>
<tr v-if="milestoneShown(player.m.total.gte(3))"><td v-bind:class="{ milestone: player.m.total.lt(3), milestoneDone: player.m.total.gte(3) }"><h3>3 total Magic</h3><br>Gain 100% of Hindrance Spirit & Quirk gain every second</td></tr>
<tr v-if="milestoneShown(player.m.total.gte(4), true)"><td v-bind:class="{ milestone: player.m.total.lt(4), milestoneDone: player.m.total.gte(4) }"><h3>4 total Magic</h3><br>Automatically purchase Hyper-Boosters & Subspace&nbsp;&nbsp;&nbsp;<button v-if="player.m.total.gte(4)" class="smallUpg can hb" onclick="toggleAuto('hb')">{{player.hb.auto?"ON":"OFF"}}</button>&nbsp;&nbsp;&nbsp;<button v-if="player.m.total.gte(4)" class="smallUpg can ss" onclick="toggleAuto('ss')">{{player.ss.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.m.total.gte(50), true)"><td v-bind:class="{ milestone: player.m.total.lt(50), milestoneDone: player.m.total.gte(50) }"><h3>50 total Magic</h3><br>Automatically cast Spells&nbsp;&nbsp;&nbsp;<button v-if="player.m.total.gte(50)" class="smallUpg can m" onclick="toggleAuto('m')">{{player.m.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.m.total.gte(2.5e9))"><td v-bind:class="{ milestone: player.m.total.lt(2.5e9), milestoneDone: player.m.total.gte(2.5e9) }"><h3>2.5e9 total Magic</h3><br>Gain 100% of Hex gain every second, and Spells last 4x longer</td></tr>
</table><br><br>
<span v-if="player.sp.total.lt(2)">Note: Activating a Spell costs Magic.<br></span>
<div class="upgRow">
<div v-for="id in tmp.spellsUnl">
<button v-bind:class="{ upg: true, bought: spellActive(id), can: ((player.m.points.gte(player.m.toCast[id]))&&player.m.unl&&!spellActive(id)), locked: (!(player.m.points.gte(player.m.toCast[id])||spellActive(id))), m: true }" v-on:click="activateSpell(id)"><h3>{{SPELL_NAMES[id]}}</h3><br>{{getSpellDesc(id)}}<br><br>Time: {{formatTime(player.m.spellTimes[id])}}</button><br><br>
<div v-if="player.m.upgrades.includes(41)">
<input v-model="player.m.toCast[id]" v-on:focus="focused(true)" v-on:blur="focused(false)" v-on:change="updateToCast(id)"></input><br><br>
</div>
</div>
</div>
You have {{formatWhole(player.m.hexes)}} Hexes, which are multiplying Hindrance Spirit & Quirk gain by {{format(tmp.hexEff)}}
</div>
<div v-if="layer=='ba'">
<table>
<tr v-if="milestoneShown(player.ba.best.gte(1))"><td v-bind:class="{ milestone: player.ba.best.lt(1), milestoneDone: player.ba.best.gte(1) }"><h3>1 Balance Energy</h3><br>Keep row 4 milestones on all resets</td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(2))"><td v-bind:class="{ milestone: player.ba.best.lt(2), milestoneDone: player.ba.best.gte(2) }"><h3>2 Balance Energy</h3><br>Keep Quirk Upgrades on all resets</td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(3), true)"><td v-bind:class="{ milestone: player.ba.best.lt(3), milestoneDone: player.ba.best.gte(3) }"><h3>3 Balance Energy</h3><br>Automatically purchase Quirk Layers&nbsp;&nbsp;&nbsp;<button v-if="player.ba.best.gte(3)" class="smallUpg can q" onclick="toggleAuto('q')">{{player.q.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(5))"><td v-bind:class="{ milestone: player.ba.best.lt(5), milestoneDone: player.ba.best.gte(5) }"><h3>5 Balance Energy</h3><br>Keep Hyper-Booster & Subspace Upgrades on all resets</td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(8))"><td v-bind:class="{ milestone: player.ba.best.lt(8), milestoneDone: player.ba.best.gte(8) }"><h3>8 Balance Energy</h3><br>You can buy max Hyper-Boosters & Subspace Energy, and Hyper-Boosters/Subspace Energy reset nothing</td></tr>
</table><br><br>
You have {{format(player.ba.power)}} Balance Power, which is multiplying Hindrance Spirit & Quirk gain by {{format(tmp.balEff)}}<br>
You have {{format(player.ba.positivity)}} Positivity and {{format(player.ba.negativity)}} Negativity, which are multiplying Balance Power gain by {{format(tmp.balEff2)}}
</div>
<div v-if="layer=='ps'">
<table>
<tr v-if="milestoneShown(player.ps.best.gte(2), true)"><td v-bind:class="{ milestone: player.ps.best.lt(5), milestoneDone: player.ps.best.gte(2) }"><h3>2 Phantom Souls</h3><br>Automatically purchase Phantom Souls&nbsp;&nbsp;&nbsp;<button v-if="player.ps.best.gte(2)" class="smallUpg can ps" onclick="toggleAuto('ps')">{{player.ps.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.ps.best.gte(5))"><td v-bind:class="{ milestone: player.ps.best.lt(5), milestoneDone: player.ps.best.gte(5) }"><h3>5 Phantom Souls</h3><br>You can buy max Phantom Souls, and Phantom Souls reset nothing</td></tr>
</table><br><br>
</div>
<div v-if="layer=='sp'">
<table>
<tr v-if="milestoneShown(player.sp.total.gte(1))"><td v-bind:class="{ milestone: player.sp.total.lt(1), milestoneDone: player.sp.total.gte(1) }"><h3>1 total Super-Prestige Point</h3><br>Upgrades of Rows 1-5 and Hindrances are kept on all resets</td></tr>
<tr v-if="milestoneShown(player.sp.total.gte(2), true)"><td v-bind:class="{ milestone: player.sp.total.lt(2), milestoneDone: player.sp.total.gte(2) }"><h3>2 total Super-Prestige Points</h3><br>Keep Magic Milestones on reset, Spells do not cost Magic, and Magic Upgrade 13's effect can be auto-set to your current Magic&nbsp;&nbsp;&nbsp;<button v-if="player.sp.total.gte(2)" class="smallUpg can m" onclick="toggleAuto('m', 'Ins')">{{player.m.autoIns?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.sp.total.gte(5))"><td v-bind:class="{ milestone: player.sp.total.lt(5), milestoneDone: player.sp.total.gte(5) }"><h3>5 total Super-Prestige Points</h3><br>Keep Balance Milestones on reset</td></tr>
<tr v-if="milestoneShown(player.sp.total.gte(10))"><td v-bind:class="{ milestone: player.sp.total.lt(10), milestoneDone: player.sp.total.gte(10) }"><h3>10 total Super-Prestige Points</h3><br>Gain 100% of Magic & Balance Power gain every second</td></tr>
</table>
</div>
<div v-if="layer=='l'">
<br><br>
You have {{format(player.l.power)}} Life Power (+{{format(LIFE_BOOSTERS.calcNewPower(1).sub(player.l.power))}}/s),<br>
which is translating to:
<div class="upgRow">
<div v-for="i in tmp.l.lbUnl">
<button v-bind:class="{ upgBig: true, l: true }"><h3>Life Booster {{i}}</h3><br>{{LIFE_BOOSTERS[i].effDesc(tmp.l.lbEff[i])}}<br><br>Boosters: {{formatWhole(tmp.l.lb[i])}}<br>Next at: {{formatWhole(LIFE_BOOSTERS.req(i).ceil())}} Phantom Souls</button>
</div>
</div>
You have {{formatWhole(player.ps.points)}} Phantom Souls, {{getLayerEffDesc("ps")}}
</div>
<div v-if="layer=='hs'">
<table>
<tr v-if="milestoneShown(player.hs.best.gte(2e4))"><td v-bind:class="{ milestone: player.hs.best.lt(2e4), milestoneDone: player.hs.best.gte(2e4) }"><h3>20,000 Hyperspace Energy</h3><br>Gain 1% of Super-Prestige Points gain every second</td></tr>
</table>
<br><br>
You have {{formatWhole(player.ba.points)}} Balance Energy
<br>
<button v-on:click="HYPERSPACE.buy()" v-bind:class="{ upgBig: true, hs: true, can: HYPERSPACE.canBuy(), locked: !HYPERSPACE.canBuy() }">Buy a Hyperspace<br>Amount: {{formatWhole(player.hs.space.sub(player.hs.spent))}}<br><br>Cost: {{formatWhole(HYPERSPACE.cost().hs)}} Hyperspace Energy & {{formatWhole(HYPERSPACE.cost().ba)}} Balance Energy</button>
<br><br>
<button v-on:click="HYPERSPACE.respec()" v-bind:class="{ longUpg: true, hs: true, can: player.hs.unl, locked: !player.hs.unl }">Respec Super-Upgrades</button><br>
<div class="upgRow">
<div v-for="i in tmp.s.trueSbUnl">
<button v-on:click="HYPERSPACE.superUpg(i)" v-bind:class="{ upg: true, hs: true, can: HYPERSPACE.canSuperUpg(i), locked: !HYPERSPACE.canSuperUpg(i) }"><h3>Building {{i}}</h3><br>{{getSpaceBuildingEffDesc(i)}}<br><br>Super-Level: {{formatWhole(tmp.hs.su[i])}} / {{formatWhole(player.hs.superUpgradeCap)}}<br>({{format(tmp.hs.suEff[i].sub(1).times(100))}}% stronger)<br>Cost: 1 Hyperspace</button>
</div>
</div>
<br>
Get {{formatWhole(player.g.points)}} / {{formatWhole(HYPERSPACE.nextCapReq())}} Generators to increase the cap of Super-Upgrades
</div>
<div v-if="layer=='i'">
<table>
<tr v-if="milestoneShown(player.i.best.gte(3))"><td v-bind:class="{ milestone: player.i.best.lt(3), milestoneDone: player.i.best.gte(3) }"><h3>3 Imperium Bricks</h3><br>You can max out Imperium Bricks</td></tr>
</table>
<br><br>
You have {{formatWhole(player.i.lifeBricks)}} Life Bricks<br>
Next Life Brick is at {{format(player.l.power)}} / {{format(IMPERIUM.lifeReq())}} Life Power
<br><br>
<button v-on:click="IMPERIUM.build()" v-bind:class="{ upgBig: true, i: true, can: IMPERIUM.canBuild(), locked: !IMPERIUM.canBuild() }">
<h3>Imperium Buildings</h3><br>
<span v-if="tmp.s.sbUnl.lt(SPACE_BUILDINGS.max)">Build Space Building {{formatWhole(tmp.s.sbUnl.add(1))}}</span>
<span v-if="tmp.s.sbUnl.gte(SPACE_BUILDINGS.max)">Enhance<sup v-if="tmp.s.sbUnl.div(SPACE_BUILDINGS.max).gte(2)">{{formatWhole(tmp.s.sbUnl.div(SPACE_BUILDINGS.max).floor())}}</sup> Space Building {{formatWhole(tmp.s.sbUnl.sub(tmp.s.sbUnl.div(SPACE_BUILDINGS.max).floor().times(SPACE_BUILDINGS.max)).add(1))}}</span>
<br>
Built Buildings: {{formatWhole(player.i.extraBuildings)}}
<br><br>
<span v-if="!player.i.building">Cost: {{IMPERIUM.cost().i}} Imperium Bricks & {{IMPERIUM.cost().l}} Life Bricks</span>
<span v-if="player.i.building">Progress: {{format(player.i.progress * 100)}}%<br>Your {{formatWhole(player.sg.points)}} Super-Generators speed up your progress by {{format(IMPERIUM.sgSpeedBoost())}}x<br><br>Click to cancel building</span>
</button>
<br>
Your Work is currently {{format(tmp.i.work)}}, which reduces the gain power of rows 1 - 5 by {{format(tmp.i.workEff)}}x
<span v-for="i in IMPERIUM.maxCollapseRows"><span v-if="IMPERIUM.collapsed(i)"><br>Your Work also collapses row {{i}} layers by {{format(tmp.i.collapse[i].times(100))}}%</span></span>
</div>

View file

@ -1,10 +1,11 @@
<!DOCTYPE html>
<head>
<title>The Prestige Tree</title>
<title>The Candy Tree</title>
<link rel="stylesheet" type="text/css" href="style.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 type="text/javascript" src="js/break_eternity.js"></script>
<script type="text/javascript" src="js/layers.js"></script>
<script type="text/javascript" src="js/temp.js"></script>
<script type="text/javascript" src="js/saves.js"></script>
<script type="text/javascript" src="js/game.js"></script>
@ -16,7 +17,7 @@
<div class="vl" v-if="player.tab!='tree'&&player.tab!='gameEnded'"></div>
<div v-if="player.tab=='gameEnded'" class="fullWidth">
<br>
<h2>Prestige Tree {{VERSION.withoutName}}</h2><br><br>
<h2>The Candy Tree {{VERSION.withoutName}}</h2><br><br>
<h3>Congratulations! You have reached the end and beaten this game, but for now...</h3><br>
<h3>Please check the Discord to see there are new content updates!</h3><br><br>
<div v-if="!player.timePlayedReset">It took you {{formatTime(player.timePlayed)}} to beat the game.</div>
@ -24,347 +25,50 @@
<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>
<a class="link" href="http://discord.gg/wwQfgPa" target="_blank">Jacorb's Discord</a><br>
<a class="link" href="http://aarextiaokhiao.github.io/" target="_blank">Aarex's Home</a>
<a class="link" href="http://discord.gg/wwQfgPa" target="_blank">Main Prestige Tree Discord</a><br>
<br><br>
If you would like to speedrun this, press Play Again and record your attempt, then submit on the Discord Server in the channel #speedrun-submissions.
<br><br><br>
<h1>Oh, you are still reading this?</h1>
<br>
Yeah. You also can test the next update whether you want to.<br>
<a class="link" href="http://raw.githack.com/Jacorb90/Prestige-Tree/v1.2-Beta/index.html">Test server</a>
<br><br>
For this next update, there will be 3 new layers which come after row 6! Stay tuned.
</div>
<div v-if="player.tab=='changelog'" class="col right">
<button class="back" onclick="showTab('tree')"></button><br>
<h3>v1.1: The Life Update</h3>
<h3>v0.0.1: Technically something</h3>
<ul>
<li>Added 4 new layers</li>
<li>Added some QoL displays</li>
<li>Added Aqua theme</li>
<li>Added HQ Tree option</li>
<li>Rebalanced early parts of rows 4 - 6</li>
<li>Balanced up to e28,000,000</li>
<li>Fixed some bugs</li>
<li>There is a game, but not the right game.</li>
</ul><br>
<h3>v1.0 Patch 1</h3>
<ul>
<li>Added an option to keep going at endgame</li>
</ul><br>
<div class="link" onclick="showTab('changelog_beta')">Alpha / Beta</div><br>
<div class="link" onclick="showTab('Old Stuff')">Alpha / Beta</div><br>
</div>
<div v-if="player.tab=='changelog_beta'" class="col right">
<button class="back" onclick="showTab('changelog')"></button><br>
<h3>v1.0 Full Release</h3>
<h3>v0.0 Literally nothing</h3>
<ul>
<li>Converted Vue to production mode</li>
<li>Added an end screen at 1e40,000,000 Points</li>
<li>Added nothing</li>
</ul><br>
<h3>v1.0 Beta 4</h3>
<ul>
<li>Balanced up to 1e40,000,000 Points & 500,000 Super-Prestige Points</li>
</ul><br>
<h3>v1.0 Beta 3</h3>
<ul>
<li>Added a hotkey for the fourth Spell</li>
<li>Balanced up to 1e29,000,000 Points & 10,000 Super-Prestige Points</li>
</ul><br>
<h3>v1.0 Beta 2</h3>
<ul>
<li>Fixed a bug involving the fourth Spell</li>
<li>Added more Super-Prestige Upgrades</li>
<li>Balanced up to 1e26,000,000 Points & 250 Super-Prestige Points</li>
</ul><br>
<h3>v1.0 Beta 1</h3>
<ul>
<li>Implemented the Super-Prestige layer (unfinished)</li>
<li>Balanced up to 1e18,000,000 Points & 10 Super-Prestige Points</li>
</ul><br>
<h3>Beta v1.2</h3>
<ul>
<li>Balanced up to 1e15,000,000 Points</li>
</ul><br>
<h3>Beta v1.2 Alpha 13</h3>
<ul>
<li>Reduced a few upgrade costs</li>
<li>Balanced up to 1e11,000,000 Points, 5e23 Magic, and 3e20 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 12</h3>
<ul>
<li>Balanced up to 1e9,200,000 Points, 5e18 Magic, and 1e16 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 11</h3>
<ul>
<li>Balanced up to 1e7,650,000 Points, 1e16 Magic, and 4e13 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 10</h3>
<ul>
<li>Made a few visual fixes</li>
<li>Adjusted the 1,070 Generator upgrade to cost 1,068 Generators instead</li>
<li>Balanced up to 1e6,800,000 Points, 1e14 Magic, and 1.5e12 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 9</h3>
<ul>
<li>Added hints for h8 & h10</li>
<li>Added a new Magic milestone</li>
<li>Reduced offline time to 10% of its original amount</li>
<li>Balanced up to 1e6,000,000 Points, 3e12 Magic, and 1e11 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 8</h3>
<ul>
<li>Added a new milestone</li>
<li>Added a new Hindrance ;)</li>
<li>Balanced up to 1e5,500,000 Points, 2.5e10 Magic, and 2e9 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 7</h3>
<ul>
<li>Balanced up to 1e3,950,000 Points, 1,500,000 Magic, and 5,000,000 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 6</h3>
<ul>
<li>Fixed a bug with hotkeys</li>
<li>Balanced up to 1e3,000,000 Points, 80,000 Magic, and 160,000 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 5</h3>
<ul>
<li>Balanced up to 1e2,400,000 Points, 1,500 Magic, and 3,000 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 4</h3>
<ul>
<li>Implemented the final Hindrance</li>
<li>Balanced up to 1e2,000,000 Points, 200 Magic, and 200 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 3</h3>
<ul>
<li>Balanced up to 50 Magic and 50 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 2</h3>
<ul>
<li>Added 2 new upgrades and a few new milestones</li>
<li>Balanced up to 25 Magic and 25 Balance Energy</li>
</ul><br>
<h3>Beta v1.2 Alpha 1</h3>
<ul>
<li>Implemented the two Row 5 layers</li>
<li>Added a new option</li>
<li>Rebalanced a few things at the end of row 4</li>
<li>Balanced up to 1 of each Row 5 reset</li>
</ul><br>
<h3>Beta v1.1</h3>
<ul>
<li>Cleaned up a few things</li>
</ul><br>
<h3>Beta v1.1 Alpha 21</h3>
<ul>
<li>Rebalanced from h10 to endgame (now ends at 1e920,000 Points unless you wanna grind)</li>
</ul><br>
<h3>Beta v1.1 Alpha 20</h3>
<ul>
<li>Made h10 hidden until you beat h9</li>
<li>Rebalanced/fixed h10</li>
</ul><br>
<h3>Beta v1.1 Alpha 19</h3>
<ul>
<li>Remade the offline progression system</li>
<li>Balanced up to 1e925,000 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 18</h3>
<ul>
<li>Added a new Hindrance (h10)</li>
<li>Balanced up to 1e800,000 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 17</h3>
<ul>
<li>Fixed a bug with unlocking Hyper-Boosters & Subspace</li>
<li>Balanced up to 1e710,000 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 16</h3>
<ul>
<li>Added a new Hindrance (h9)</li>
<li>Added a new Hyper-Booster milestone</li>
<li>Made the Space Building automation prioritize the rightmost buildings first</li>
<li>Balanced up to 1e690,000 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 15</h3>
<ul>
<li>Balanced up to 1e635,000 Points (don't worry, the crazy inflation stops here)</li>
</ul><br>
<h3>Beta v1.1 Alpha 14</h3>
<ul>
<li>Implemented the fourth row 4 layer unlock</li>
<li>Balanced up to 1e240,000-1e250,000 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 13</h3>
<ul>
<li>Implemented Subspace & Hyper-Booster resets</li>
<li>Balanced up to 1e100,000 Points in either path</li>
</ul><br>
<h3>Beta v1.1 Alpha 12</h3>
<ul>
<li>Balanced up to 1e20 Hindrance Spirit, 2e21 Quirks, and 1e72,000 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 11</h3>
<ul>
<li>Added a new Quirk Milestone</li>
<li>Balanced up to 1e15 Hindrance Spirit, 1e16 Quirks, and 1e42,500 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 10</h3>
<ul>
<li>Balanced up to 2e13 Hindrance Spirit & Quirks, and 1e31,000 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 9</h3>
<ul>
<li>Added a new option</li>
<li>Balanced up to 2e10 Hindrance Spirit & Quirks, and 1e27,500 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 8</h3>
<ul>
<li>Several bugfixes</li>
<li>Balanced up to 1e9 Hindrance Spirit & Quirks, and 1e25,750 Points</li>
</ul><br>
<h3>Beta v1.1 Alpha 7</h3>
<ul>
<li>Reversed the order of the changelog</li>
<li>Added the fourth Hindrance</li>
<li>Balanced up to 50,000 Hindrance Spirit & Quirks</li>
</ul><br>
<h3>Beta v1.1 Alpha 6</h3>
<ul>
<li>Various bugfixes</li>
<li>Added the third Hindrance</li>
<li>Balanced up to 2,500 Hindrance Spirit & Quirks</li>
</ul><br><br>
<h3>Beta v1.1 Alpha 5</h3>
<ul>
<li>Add the second Hindrance</li>
<li>Balanced up to 200 Hindrance Spirit & Quirks</li>
</ul><br><br>
<h3>Beta v1.1 Alpha 4</h3>
<ul>
<li>Add the first Hindrance</li>
<li>Implemented some new milestones</li>
<li>Balanced up to 60 Hindrance Spirit & Quirks</li>
</ul><br><br>
<h3>Beta v1.1 Alpha 3</h3>
<ul>
<li>Fixed corruption bug</li>
<li>Implemented some new milestones</li>
<li>Balanced up to 15 Hindrance Spirit & 15 Quirks</li>
</ul><br><br>
<h3>Beta v1.1 Alpha 2</h3>
<ul>
<li>Implemented some new milestones</li>
<li>Balanced up to 5 Hindrance Spirit & 5 Quirks</li>
</ul><br><br>
<h3>Beta v1.1 Alpha 1</h3>
<ul>
<li>Add the framework for the first two row 4 layers</li>
<li>Balanced up to the second row 4 reset</li>
</ul><br><br>
<h3>Beta v1.01</h3>
<ul>
<li>Display Generator Power in the Space tab</li>
<li>Add a credits page in the info tab</li>
<li>Implemented a few minor QoL/visual fixes</li>
</ul><br><br>
<h3>Beta v1.0</h3>
<ul>
<li>Made sure any built-in saves had Auto-Save turned on</li>
<li>Fixed a visual bug for mobile users</li>
<li>Added a "time played" display in the info tab</li>
<li>Implemented a NaN check system</li>
</ul><br><br>
<h3>Alpha Build 10</h3>
<ul>
<li>Rebalanced the Super-Booster era (now up to 1e9,250 points)</li>
<li>Implemented a game version variable</li>
</ul><br><br>
<h3>Alpha Build 9</h3>
<ul>
<li>Fixed a visual bug with the Prestige Tree branches</li>
<li>Added a hotkey for Super-Boosters</li>
<li>Added a new Super-Booster milestone</li>
<li>Fixed a bug with hotkeys</li>
<li>Balanced up to 1e46,500 points</li>
</ul><br><br>
<h3>Alpha Build 8</h3>
<ul>
<li>Implemented Super-Boosters</li>
<li>Balanced up to 1e25,600 points</li>
</ul><br><br>
<h3>Alpha Build 7</h3>
<ul>
<li>Made the new upgrades from Alpha Build 6 shown at proper times</li>
<li>Balanced up to 1e4,175 points</li>
<li>Setup a temp variable system (to prevent lag later on)</li>
</ul><br><br>
<h3>Alpha Build 6</h3>
<ul>
<li>Made font work for Mac users</li>
<li>Added 1 new Space & Time milestone each</li>
<li>Balanced up to 1e3,375 points</li>
</ul><br><br>
<h3>Alpha Build 5</h3>
<ul>
<li>Balanced up to 1e920 with all prestige tree paths (before unlocking third row 3 layer)</li>
</ul><br><br>
<h3>Alpha Build 4</h3>
<ul>
<li>Implemented Auto-Boosters & Auto-Generators</li>
<li>Fixed a balancing issue with a certain prestige tree path (1e660 -> 1e600)</li>
<li>Added changelog</li>
<li>Balanced up to 1e700 with all prestige tree paths</li>
</ul><br><br>
<h3>Pre-Alpha Build 4</h3>
<ul>
<li>Implemented/balanced all row 1 & 2 prestige layers</li>
<li>Added the options/info menus</li>
<li>Balanced the row 3 prestige layers up to 1e560 points</li>
</ul><br><br>
</div>
<div v-if="player.tab=='info'" class="col right">
<button class="back" onclick="showTab('tree')"></button><br>
<h2>Prestige Tree</h2>
<h2>The Candy Tree</h2>
<br>
<h3>{{VERSION.withName}}</h3>
<br>
Made by Jacorb and Aarex
The Candy Tree and code refactor by Acamaeda
<br>
Idea by papyrus (on discord)
The Prestige Tree made by Jacorb and Aarex
<br>
Original idea by papyrus (on discord)
<br><br>
<div class="link" onclick="showTab('changelog')">Changelog</div><br>
<a class="link" href="http://raw.githack.com/Jacorb90/Prestige-Tree/v1.2-Beta/index.html">Test server</a><br><br>
<a class="link" href="http://discord.gg/wwQfgPa" target="_blank">Jacorb's Discord</a><br>
<a class="link" href="http://aarextiaokhiao.github.io/" target="_blank">Aarex's Home</a>
<a class="link" href="http://discord.gg/wwQfgPa" target="_blank">Main Prestige Tree server</a><br>
<br>
Note by Jacorb: If anyone wishes to make a mod of this game, that is perfectly fine with me, just make sure to name it something different (ex: Prestige Tree NG+) and to let me know on <a href="https://discord.gg/wwQfgPa" target="_blank">my discord</a>.
<br><br>
Time Played: {{ formatTime(player.timePlayed) }}<br><br>
<h3>Hotkeys</h3><br>
<span v-if="player.p.unl"><br>P: Prestige reset</span>
<span v-if="player.b.unl"><br>B: Booster reset</span>
<span v-if="player.g.unl"><br>G: Generator reset</span>
<span v-if="player.t.unl"><br>T: Time reset</span>
<span v-if="player.e.unl"><br>E: Enhance reset</span>
<span v-if="player.s.unl"><br>S: Space reset</span>
<span v-if="player.sb.unl"><br>Shift+B: Super-Booster reset</span>
<span v-if="player.sg.unl"><br>Shift+G: Super-Generator reset</span>
<span v-if="player.h.unl"><br>H: Hindrance reset</span>
<span v-if="player.q.unl"><br>Q: Quirk reset</span>
<span v-if="player.hb.unl"><br>Ctrl+B: Hyper-Booster reset</span>
<span v-if="player.ss.unl"><br>Shift+S: Subspace reset</span>
<span v-if="player.m.unl"><br>M: Magic reset</span>
<span v-if="player.ba.unl"><br>A: Balance reset</span>
<span v-if="player.ps.unl"><br>Ctrl+P: Phantom Soul reset</span>
<span v-if="player.sp.unl"><br>Shift+P: Super-Prestige reset</span>
<span v-if="player.l.unl"><br>L: Life Essence reset</span>
<span v-if="player.hs.unl"><br>Ctrl+S: Hyperspace reset</span>
<span v-if="player.i.unl"><br>I: Imperium Brick reset</span>
<span v-if="player.m.unl">
<br>
<span v-for="i in tmp.spellsUnl"><br>{{i}}: Cast spell {{i}}</span>
</span>
<span v-if="player.c.unl"><br>C: Reset candies for lollipops.</span>
</div>
<div v-if="player.tab=='options'" class="col right">
<button class="back" onclick="showTab('tree')"></button><br>
@ -397,289 +101,61 @@
<span v-if="player.offTime !== undefined">
<br>Offline Time: {{formatTime(player.offTime.remain)}}<br>
</span>
<span v-if="player.sp.unl && !player.keepGoing">
<span v-if="false && !player.keepGoing">
<br>Reach {{formatWhole(ENDGAME)}} to beat the game!<br>
</span>
<br>
<span v-if="player.points.lt('1e1000')">You have </span>
<h2 id="points">{{format(player.points)}}</h2>
<span v-if="player.points.lt('1e1e6')"> points</span>
<h2 id="candies">{{format(player.points)}}</h2>
<span v-if="player.points.lt('1e1e6')"> candies</span>
<br><br><br><br><br>
<table>
<td><layer-node layer='p' abb='P'></layer-node></td>
<td><layer-node layer='c' abb='C'></layer-node></td>
</table><table>
<td><button class="treeNode hidden"></button></td>
</table><table>
<td v-if="player.tab=='tree'&&(player.b.unl||player.g.unl)" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(1)"></img></td>
<td><layer-node layer='b' abb='B'></layer-node></td>
<td><layer-node layer='g' abb='G'></layer-node></td>
<td v-if="player.tab=='tree'&&(player.c.unl||player.c.unl)" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(1)"></img></td>
<td><layer-node layer='f' abb='F'></layer-node></td>
</table><table>
<td><button class="treeNode hidden"></button></td>
</table><table>
<td v-if="player.tab=='tree'&&(player.e.unl||player.t.unl||player.s.unl)" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(2)"></img></td>
<td><layer-node layer='sb' abb='SB'></layer-node></td>
<td><layer-node layer='t' abb='T'></layer-node></td>
<td><layer-node layer='e' abb='E'></layer-node></td>
<td><layer-node layer='s' abb='S'></layer-node></td>
<td><layer-node layer='sg' abb='SG'></layer-node></td>
</table><table>
<td><button class="treeNode hidden"></button></td>
</table><table>
<td v-if="player.tab=='tree'&&(player.h.unl||player.q.unl)" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(3)"></img></td>
<td v-if="player.tab=='tree'&&(player.e.unl||player.t.unl||player.s.unl)" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(2)"></img></td>
<td><layer-node layer='hb' abb='HB'></layer-node></td>
<td><layer-node layer='h' abb='H'></layer-node></td>
<td><layer-node layer='q' abb='Q'></layer-node></td>
<td><layer-node layer='ss' abb='SS'></layer-node></td>
<td><layer-node layer='hg' abb='HG'></layer-node></td>
</table><table>
<td><button class="treeNode hidden"></button></td>
</table><table>
<td v-if="player.tab=='tree'&&(player.m.unl||player.ba.unl)" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(4)"></img></td>
<td><layer-node layer='m' abb='M'></layer-node></td>
<td><layer-node layer='ps' abb='PS'></layer-node></td>
<td><layer-node layer='ba' abb='BA'></layer-node></td>
</table><table>
<td><button class="treeNode hidden"></button></td>
</table><table>
<td v-if="player.tab=='tree'&&player.sp.unl" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(5)"></img></td>
<td><layer-node layer='l' abb='L'></layer-node></td>
<td><layer-node layer='sp' abb='SP'></layer-node></td>
<td><layer-node layer='hs' abb='HS'></layer-node></td>
<td><layer-node layer='i' abb='I'></layer-node></td>
</table><table>
<td><button class="treeNode hidden"></button></td>
</table><table>
<td v-if="player.tab=='tree'&&layerShown('tm')" class="left"><br><br><img class="remove" src="remove.png" onclick="resetRow(6)"></img></td>
<td><layer-node layer='mb' abb='MB'></layer-node></td>
<td><layer-node layer='ge' abb='Ge'></layer-node></td>
<td><layer-node layer='ma' abb='Ma'></layer-node></td>
</table>
<canvas id="treeCanvas" class="canvas"></canvas>
</div>
<div v-for="layer in LAYERS">
<div v-if="player.tab==layer" class="col right">
<button class="back" onclick="showTab('tree')"></button><br><br><br>
<span v-if="player[layer].points.lt('1e1000')">You have </span><h2 v-bind:class="{ [layer+'_txt']: true }">{{formatWhole(player[layer].points)}}</h2> {{LAYER_RES[layer]}}<span v-if="Object.keys(LAYER_EFFS).includes(layer)">, {{getLayerEffDesc(layer)}}</span>
<span v-if="player[layer].points.lt('1e1000')">You have </span><h2 v-bind:style="{'color': layers[layer].color, 'text-shadow': '0px 0px 10px' + layers[layer].color}">{{formatWhole(player[layer].points)}}</h2> {{layers[layer].resource}}<span v-if="layers[layer].effects != undefined">, {{layers[layer].effectDescription()}}</span>
<br><br>
<button v-if="LAYER_TYPE[layer]=='normal'" v-bind:class="{ [layer]: true, reset: true, locked: tmp.layerAmt[layer].lt(tmp.layerReqs[layer]), can: tmp.layerAmt[layer].gte(tmp.layerReqs[layer]) }" v-on:click="doReset(layer)"><span v-if="player[layer].points.lt(1e3)">Reset for </span>+<b>{{formatWhole(tmp.resetGain[layer])}}</b> {{LAYER_RES[layer]}}<span v-if="tmp.resetGain[layer].lt(100) && player[layer].points.lt(1e3)"><br><br>Next at {{ (LAYER_RES_CEIL.includes(layer) ? formatWhole(tmp.nextAt[layer]) : format(tmp.nextAt[layer])) }} {{ LAYER_AMT_NAMES[layer] }}</span></button>
<button v-if="LAYER_TYPE[layer]=='static'" v-bind:class="{ [layer]: true, reset: true, locked: tmp.layerAmt[layer].lt(tmp.nextAt[layer]), can: tmp.layerAmt[layer].gte(tmp.nextAt[layer]) }" v-on:click="doReset(layer)"><span v-if="player[layer].points.lt(10)">Reset for </span>+<b>{{formatWhole(tmp.resetGain[layer])}}</b> {{LAYER_RES[layer]}}<br><br><span v-if="player[layer].points.lt(10)">Req: {{formatWhole(tmp.layerAmt[layer])}} / </span>{{(LAYER_RES_CEIL.includes(layer) ? formatWhole(tmp.nextAt[layer]) : format(tmp.nextAt[layer]))}} {{ LAYER_AMT_NAMES[layer] }}</button>
<span v-if="LAYER_TYPE[layer]=='normal' && tmp.resetGain[layer].lt(100) && player[layer].points.lt(1e3)"><br>You have {{formatWhole(tmp.layerAmt[layer])}} {{LAYER_AMT_NAMES[layer]}}</span>
<button v-if="layers[layer].type=='normal'" v-bind:class="{ [layer]: true, reset: true, locked: tmp.layerAmt[layer].lt(tmp.layerReqs[layer]), can: tmp.layerAmt[layer].gte(tmp.layerReqs[layer]) }" v-bind:style="{'background-color': layers[layer].color}" v-on:click="doReset(layer)"><span v-if="player[layer].points.lt(1e3)">Reset for </span>+<b>{{formatWhole(tmp.resetGain[layer])}}</b> {{layers[layer].resource}}<span v-if="tmp.resetGain[layer].lt(100) && player[layer].points.lt(1e3)"><br><br>Next at {{ (layers[layer].resCeil ? formatWhole(tmp.nextAt[layer]) : format(tmp.nextAt[layer])) }} {{ layers[layer].baseResource }}</span></button>
<button v-if="layers[layer].type=='static'" v-bind:class="{ [layer]: true, reset: true, locked: tmp.layerAmt[layer].lt(tmp.nextAt[layer]), can: tmp.layerAmt[layer].gte(tmp.nextAt[layer]) }" v-bind:style="{'background-color': layers[layer].color}" v-on:click="doReset(layer)"><span v-if="player[layer].points.lt(10)">Reset for </span>+<b>{{formatWhole(tmp.resetGain[layer])}}</b> {{layers[layer].resource}}<br><br><span v-if="player[layer].points.lt(10)">Req: {{formatWhole(tmp.layerAmt[layer])}} / </span>{{(layers[layer].resCeil ? formatWhole(tmp.nextAt[layer]) : format(tmp.nextAt[layer]))}} {{ layers[layer].baseResource }}</button>
<span v-if="layers[layer].type=='normal' && tmp.resetGain[layer].lt(100) && player[layer].points.lt(1e3)"><br>You have {{formatWhole(tmp.layerAmt[layer])}} {{layers[layer].baseResource}}</span>
<br><br>
<span v-if="layer!='p'">Your best {{LAYER_RES[layer]}} is {{formatWhole(player[layer].best)}}<br></span>
<span v-if="player[layer].total">You have made a total of {{formatWhole(player[layer].total)}} {{LAYER_RES[layer]}}<br></span>
<div v-if="layer=='b'">
<span v-if="layer!='c'">Your best {{layers[layer].resource}} is {{formatWhole(player[layer].best)}}<br></span>
<span v-if="player[layer].total">You have made a total of {{formatWhole(player[layer].total)}} {{layers[layer].resource}}<br></span>
<div v-if="layer=='aefaf'">
<table>
<tr v-if="milestoneShown(player.b.best.gte(8))"><td v-bind:class="{ milestone: player.b.best.lt(8)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.b.best.gte(8)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>8 Boosters</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.b.best.gte(15))"><td v-bind:class="{ milestone: player.b.best.lt(15), milestoneDone: player.b.best.gte(15) }"><h3>15 Boosters</h3><br>You can buy max Boosters</td></tr>
<tr v-if="milestoneShown(player.c.best.gte(8))"><td v-bind:class="{ milestone: player.c.best.lt(8)&&player.c.best.lt(1)&&player.c.best.lt(1), milestoneDone: player.c.best.gte(8)||player.c.best.gte(1)||player.c.best.gte(1) }"><h3>8 Boosters</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.c.best.gte(15))"><td v-bind:class="{ milestone: player.c.best.lt(15), milestoneDone: player.c.best.gte(15) }"><h3>15 Boosters</h3><br>You can buy max Boosters</td></tr>
</table>
</div>
<div v-if="layer=='g'">
<table>
<tr v-if="milestoneShown(player.g.best.gte(8)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.g.best.lt(8)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.g.best.gte(8)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>8 Generators</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.g.best.gte(10))"><td v-bind:class="{ milestone: player.g.best.lt(10), milestoneDone: player.g.best.gte(10) }"><h3>10 Generators</h3><br>Gain 100% of Prestige Point gain every second</td></tr>
<tr v-if="milestoneShown(player.g.best.gte(15))"><td v-bind:class="{ milestone: player.g.best.lt(15), milestoneDone: player.g.best.gte(15) }"><h3>15 Generators</h3><br>You can buy max Generators</td></tr>
</table><br><br>
You have {{format(player.g.power)}} Generator Power, which multiplies Point gain by {{format(tmp.genPowEff)}}
</div>
<div v-if="layer=='e'">
<table>
<tr v-if="milestoneShown(player.e.best.gte(2))"><td v-bind:class="{ milestone: player.e.best.lt(2), milestoneDone: player.e.best.gte(2) }"><h3>2 enhance points</h3><br>Keep Booster/Generator milestones on reset</td></tr>
<tr v-if="milestoneShown(player.e.best.gte(10)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.e.best.lt(10)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.e.best.gte(10)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>10 enhance points</h3><br>Keep Prestige Upgrades on reset</td></tr>
</table><br><br>
<button v-bind:class="{ upgBig: true, can: player.e.points.gte(getEnhancerCost()), locked: player.e.points.lt(getEnhancerCost()), e: true }" onclick="buyEnhancer()">Buy an Enhancer<br>Cost: {{formatWhole(getEnhancerCost())}} Enhance Points<br>Amount: {{formatWhole(player.e.enhancers.sub(tmp.subbedEnh))}}<br>Multiplies Prestige Point gain by {{format(tmp.enhEff)}}<br>Adds<span v-if="player.q.upgrades.includes(53)"> and multiplies</span> to base of Booster/Generator effects by {{format(tmp.enhEff2)}}</button>
</div>
<div v-if="layer=='t'">
<table>
<tr v-if="milestoneShown(player.t.best.gte(2))"><td v-bind:class="{ milestone: player.t.best.lt(2), milestoneDone: player.t.best.gte(2) }"><h3>2 time capsules</h3><br>Keep Booster/Generator milestones on reset</td></tr>
<tr v-if="milestoneShown(player.t.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.t.best.lt(3)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.t.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>3 time capsules</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.t.best.gte(4))"><td v-bind:class="{ milestone: player.t.best.lt(4), milestoneDone: player.t.best.gte(4) }"><h3>4 time capsules</h3><br>Keep Booster Upgrades on all row 3 resets</td></tr>
<tr v-if="milestoneShown(player.t.best.gte(5), true)"><td v-bind:class="{ milestone: player.t.best.lt(5), milestoneDone: player.t.best.gte(5) }"><h3>5 time capsules</h3><br>Automatically purchase Boosters&nbsp;&nbsp;&nbsp;<button v-if="player.t.best.gte(5)" class="smallUpg can b" onclick="toggleAuto('b')">{{player.b.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.t.best.gte(12))"><td v-bind:class="{ milestone: player.t.best.lt(12), milestoneDone: player.t.best.gte(12) }"><h3>12 time capsules</h3><br>Boosters reset nothing</td></tr>
</table><br><br>
You have {{format(player.t.energy)}} Time Energy, which multiplies Point gain & Prestige Point gain by {{format(tmp.timeEff)}}<br>
You have {{ format(player.b.points) }} Boosters<br><br>
<button v-bind:class="{ upgBig: true, can: (player.b.points.gte(getExtCapsuleCost())&&player.t.unl), locked: (player.b.points.lt(getExtCapsuleCost())||!player.t.unl), t: true }" onclick="buyExtCapsule()">Buy an extra Time Capsule<br>Cost: {{formatWhole(getExtCapsuleCost())}} Boosters<br>Amount: {{formatWhole(player.t.extCapsules)}}</button>
</div>
<div v-if="layer=='s'">
<table>
<tr v-if="milestoneShown(player.s.best.gte(2))"><td v-bind:class="{ milestone: player.s.best.lt(2), milestoneDone: player.s.best.gte(2) }"><h3>2 space energy</h3><br>Keep Booster/Generator milestones on reset</td></tr>
<tr v-if="milestoneShown(player.s.best.gte(3)||player.h.best.gte(1)||player.h.best.gte(1))"><td v-bind:class="{ milestone: player.s.best.lt(3)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.s.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>3 space energy</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.s.best.gte(4))"><td v-bind:class="{ milestone: player.s.best.lt(4), milestoneDone: player.s.best.gte(4) }"><h3>4 space energy</h3><br>Keep Generator Upgrades on all row 3 resets</td></tr>
<tr v-if="milestoneShown(player.s.best.gte(5), true)"><td v-bind:class="{ milestone: player.s.best.lt(5), milestoneDone: player.s.best.gte(5) }"><h3>5 space energy</h3><br>Automatically purchase Generators&nbsp;&nbsp;&nbsp;<button v-if="player.s.best.gte(5)" class="smallUpg can g" onclick="toggleAuto('g')">{{player.g.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.s.best.gte(12))"><td v-bind:class="{ milestone: player.s.best.lt(12), milestoneDone: player.s.best.gte(12) }"><h3>12 space energy</h3><br>Generators reset nothing</td></tr>
</table><br><br>
You have {{formatWhole(getSpace())}} Space remaining for Space Buildings.<br>
You have {{ format(player.g.power) }} Generator Power<br><br>
<button onclick="respecSpaceBuildings()" v-bind:class="{ longUpg: true, s: true, can: player.s.unl, locked: !player.s.unl }">Respec Space Buildings</button><br>
<div class="upgRow">
<div v-for="id in tmp.s.trueSbUnl">
<button v-bind:class="{ upg: true, can: (player.g.power.gte(getSpaceBuildingCost(id))&&player.s.unl&&getSpace().gte(1)), locked: (!(player.g.power.gte(getSpaceBuildingCost(id))&&player.s.unl&&getSpace().gte(1))), s: true }" v-on:click="buyBuilding(id)"><h3>Building {{id}}</h3><br>{{getSpaceBuildingEffDesc(id)}}<br><br>Level: {{formatWhole(tmp.s.sb[id])}}<br>Cost: {{format(getSpaceBuildingCost(id))}} Generator Power</button><br><br>
<button v-if="player.q.best.gte(2500)" v-bind:class="{ longUpg: true, s: true, can: tmp.s.sb[id].gte(1), locked: tmp.s.sb[id].lt(1) }" v-on:click="destroyBuilding(id)">Destroy One</button><br>
<button v-if="player.q.best.gte(2500)" v-bind:class="{ longUpg: true, s: true, can: tmp.s.sb[id].gte(1), locked: tmp.s.sb[id].lt(1) }" v-on:click="destroyBuilding(id, true)">Destroy All</button>
</div>
</div>
</div>
<div v-if="layer=='sb'">
<table><tr v-if="milestoneShown(player.sb.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1))"><td v-bind:class="{ milestone: player.sb.best.lt(3)&&player.h.best.lt(1)&&player.q.best.lt(1), milestoneDone: player.sb.best.gte(3)||player.h.best.gte(1)||player.q.best.gte(1) }"><h3>3 Super-Boosters</h3><br>Keep Prestige Upgrades on reset</td></tr>
<tr v-if="milestoneShown(player.sb.best.gte(4))"><td v-bind:class="{ milestone: player.sb.best.lt(4), milestoneDone: player.sb.best.gte(4) }"><h3>4 Super-Boosters</h3><br>Keep Booster/Generator milestones on reset</td></tr></table>
</div>
<div v-if="layer=='sg'">
<table>
<tr v-if="milestoneShown(player.sg.best.gte(1))"><td v-bind:class="{ milestone: player.sg.best.lt(1), milestoneDone: player.sg.best.gte(1) }"><h3>1 Super-Generator</h3><br>You can buy max Super-Generators, and Super-Generators reset nothing</td></tr>
<tr v-if="milestoneShown(player.sg.best.gte(2), true)"><td v-bind:class="{ milestone: player.sg.best.lt(2), milestoneDone: player.sg.best.gte(2) }"><h3>2 Super-Generators</h3><br>Automatically purchase Super-Generators&nbsp;&nbsp;&nbsp;<button v-if="player.sg.best.gte(2)" class="smallUpg can sg" onclick="toggleAuto('sg')">{{player.sg.auto?"ON":"OFF"}}</button></td></tr>
</table><br><br>
You have {{format(player.sg.power)}} Super-Generator Power, which multiplies the Generator base by {{format(tmp.sGenPowEff)}}
</div>
<div v-if="layer=='h'">
<table><tr v-if="milestoneShown(player.h.best.gte(1))"><td v-bind:class="{ milestone: player.h.best.lt(1), milestoneDone: player.h.best.gte(1) }"><h3>1 Hindrance Spirit</h3><br>Keep Prestige Upgrades on all previous resets, and gain 100x more Enhance Points</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(2))"><td v-bind:class="{ milestone: player.h.best.lt(2), milestoneDone: player.h.best.gte(2) }"><h3>2 Hindrance Spirit</h3><br>Keep all third row milestones on all fourth row resets, and start with your best-ever Space</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(4))"><td v-bind:class="{ milestone: player.h.best.lt(4), milestoneDone: player.h.best.gte(4) }"><h3>4 Hindrance Spirit</h3><br>Keep Time, Enhance, and Space Upgrades on all fourth row resets</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(5), true)"><td v-bind:class="{ milestone: player.h.best.lt(5), milestoneDone: player.h.best.gte(5) }"><h3>5 Hindrance Spirit</h3><br>Automatically purchase Extra Time Capsules&nbsp;&nbsp;&nbsp;<button v-if="player.h.best.gte(5)" class="smallUpg can t" onclick="toggleAuto('t', 'Cap')">{{player.t.autoCap?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.h.best.gte(10))"><td v-bind:class="{ milestone: player.h.best.lt(10), milestoneDone: player.h.best.gte(10) }"><h3>10 Hindrance Spirit</h3><br>Keep Prestige & Super-Booster Upgrades on all fourth row resets</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(15), true)"><td v-bind:class="{ milestone: player.h.best.lt(15), milestoneDone: player.h.best.gte(15) }"><h3>15 Hindrance Spirit</h3><br>Automatically purchase Super-Boosters&nbsp;&nbsp;&nbsp;<button v-if="player.h.best.gte(15)" class="smallUpg can sb" onclick="toggleAuto('sb')">{{player.sb.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.h.best.gte(25))"><td v-bind:class="{ milestone: player.h.best.lt(25), milestoneDone: player.h.best.gte(25) }"><h3>25 Hindrance Spirit</h3><br>Time resets reset nothing</td></tr>
<tr v-if="milestoneShown(player.h.best.gte(2500))"><td v-bind:class="{ milestone: player.h.best.lt(2500), milestoneDone: player.h.best.gte(2500) }"><h3>2,500 Hindrance Spirit</h3><br>Super-Boosters reset nothing</td></tr>
</table>
</div>
<div v-if="layer=='q'">
<table><tr v-if="milestoneShown(player.q.best.gte(1))"><td v-bind:class="{ milestone: player.q.best.lt(1), milestoneDone: player.q.best.gte(1) }"><h3>1 Quirk</h3><br>Keep Prestige Upgrades on all previous resets, and gain 100x more Enhance Points</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(2))"><td v-bind:class="{ milestone: player.q.best.lt(2), milestoneDone: player.q.best.gte(2) }"><h3>2 Quirks</h3><br>You can buy max Time Capsules & Space Energy</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(4))"><td v-bind:class="{ milestone: player.q.best.lt(4), milestoneDone: player.q.best.gte(4) }"><h3>4 Quirks</h3><br>Keep Space Buildings on all fourth row resets</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(5), true)"><td v-bind:class="{ milestone: player.q.best.lt(5), milestoneDone: player.q.best.gte(5) }"><h3>5 Quirks</h3><br>Automatically purchase Enhancers&nbsp;&nbsp;&nbsp;<button v-if="player.q.best.gte(5)" class="smallUpg can e" onclick="toggleAuto('e')">{{player.e.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.q.best.gte(10), true)"><td v-bind:class="{ milestone: player.q.best.lt(10), milestoneDone: player.q.best.gte(10) }"><h3>10 Quirks</h3><br>Automatically purchase Time Capsules & Space Energy<br><button v-if="player.q.best.gte(10)" class="smallUpg can t" onclick="toggleAuto('t')">{{player.t.auto?"ON":"OFF"}}</button>&nbsp;<button v-if="player.q.best.gte(10)" class="smallUpg can s" onclick="toggleAuto('s')">{{player.s.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.q.best.gte(15))"><td v-bind:class="{ milestone: player.q.best.lt(15), milestoneDone: player.q.best.gte(15) }"><h3>15 Quirks</h3><br>Gain 100% of Enhance Point gain every second</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(25))"><td v-bind:class="{ milestone: player.q.best.lt(25), milestoneDone: player.q.best.gte(25) }"><h3>25 Quirks</h3><br>Space resets reset nothing</td></tr>
<tr v-if="milestoneShown(player.q.best.gte(2500))"><td v-bind:class="{ milestone: player.q.best.lt(2500), milestoneDone: player.q.best.gte(2500) }"><h3>2,500 Quirks</h3><br>You can destroy individual Space Buildings</td></tr>
</table><br><br>
You have {{format(player.q.energy)}} Quirk Energy (generated by Quirk Layers), which multiplies Point & Generator Power gain by {{format(tmp.quirkEff)}}<br>
<button v-bind:class="{ upgBig: true, can: player.q.points.gte(getQuirkLayerCost()), locked: player.q.points.lt(getQuirkLayerCost()), q: true }" onclick="buyQuirkLayer()">Increment your Quirk Layer<br>Cost: {{formatWhole(getQuirkLayerCost())}} Quirks<br>Layers: {{formatWhole(player.q.layers)}}</button>
</div>
<div v-if="layer=='hb'">
<table>
<tr v-if="milestoneShown(player.hb.best.gte(1))"><td v-bind:class="{ milestone: player.hb.best.lt(1), milestoneDone: player.hb.best.gte(1) }"><h3>1 Hyper-Booster</h3><br>You can buy max Super-Boosters</td></tr>
</table>
</div>
<div v-if="layer=='ss'">
<table>
<tr v-if="milestoneShown(player.ss.best.gte(1), true)"><td v-bind:class="{ milestone: player.ss.best.lt(1), milestoneDone: player.ss.best.gte(1) }"><h3>1 Subspace Energy</h3><br>Automatically purchase Space Buildings&nbsp;&nbsp;&nbsp;<button v-if="player.ss.best.gte(1)" class="smallUpg can s" onclick="toggleAuto('s', 'Build')">{{player.s.autoBuild?"ON":"OFF"}}</button></td></tr>
</table><br><br>
You have {{format(player.ss.subspace)}} Subspace, which provides you with {{formatWhole(tmp.ssEff1)}} extra Space, makes all Space Buildings {{format(tmp.ssEff2)}}x cheaper, and makes all Space Buildings {{format(tmp.ssEff3.sub(1).times(100))}}% stronger
</div>
<div v-if="layer=='m'">
<table>
<tr v-if="milestoneShown(player.m.total.gte(1))"><td v-bind:class="{ milestone: player.m.total.lt(1), milestoneDone: player.m.total.gte(1) }"><h3>1 total Magic</h3><br>Keep row 4 milestones on all resets</td></tr>
<tr v-if="milestoneShown(player.m.total.gte(2))"><td v-bind:class="{ milestone: player.m.total.lt(2), milestoneDone: player.m.total.gte(2) }"><h3>2 total Magic</h3><br>Keep Hindrance completions on all resets</td></tr>
<tr v-if="milestoneShown(player.m.total.gte(3))"><td v-bind:class="{ milestone: player.m.total.lt(3), milestoneDone: player.m.total.gte(3) }"><h3>3 total Magic</h3><br>Gain 100% of Hindrance Spirit & Quirk gain every second</td></tr>
<tr v-if="milestoneShown(player.m.total.gte(4), true)"><td v-bind:class="{ milestone: player.m.total.lt(4), milestoneDone: player.m.total.gte(4) }"><h3>4 total Magic</h3><br>Automatically purchase Hyper-Boosters & Subspace&nbsp;&nbsp;&nbsp;<button v-if="player.m.total.gte(4)" class="smallUpg can hb" onclick="toggleAuto('hb')">{{player.hb.auto?"ON":"OFF"}}</button>&nbsp;&nbsp;&nbsp;<button v-if="player.m.total.gte(4)" class="smallUpg can ss" onclick="toggleAuto('ss')">{{player.ss.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.m.total.gte(50), true)"><td v-bind:class="{ milestone: player.m.total.lt(50), milestoneDone: player.m.total.gte(50) }"><h3>50 total Magic</h3><br>Automatically cast Spells&nbsp;&nbsp;&nbsp;<button v-if="player.m.total.gte(50)" class="smallUpg can m" onclick="toggleAuto('m')">{{player.m.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.m.total.gte(2.5e9))"><td v-bind:class="{ milestone: player.m.total.lt(2.5e9), milestoneDone: player.m.total.gte(2.5e9) }"><h3>2.5e9 total Magic</h3><br>Gain 100% of Hex gain every second, and Spells last 4x longer</td></tr>
</table><br><br>
<span v-if="player.sp.total.lt(2)">Note: Activating a Spell costs Magic.<br></span>
<div class="upgRow">
<div v-for="id in tmp.spellsUnl">
<button v-bind:class="{ upg: true, bought: spellActive(id), can: ((player.m.points.gte(player.m.toCast[id]))&&player.m.unl&&!spellActive(id)), locked: (!(player.m.points.gte(player.m.toCast[id])||spellActive(id))), m: true }" v-on:click="activateSpell(id)"><h3>{{SPELL_NAMES[id]}}</h3><br>{{getSpellDesc(id)}}<br><br>Time: {{formatTime(player.m.spellTimes[id])}}</button><br><br>
<div v-if="player.m.upgrades.includes(41)">
<input v-model="player.m.toCast[id]" v-on:focus="focused(true)" v-on:blur="focused(false)" v-on:change="updateToCast(id)"></input><br><br>
</div>
</div>
</div>
You have {{formatWhole(player.m.hexes)}} Hexes, which are multiplying Hindrance Spirit & Quirk gain by {{format(tmp.hexEff)}}
</div>
<div v-if="layer=='ba'">
<table>
<tr v-if="milestoneShown(player.ba.best.gte(1))"><td v-bind:class="{ milestone: player.ba.best.lt(1), milestoneDone: player.ba.best.gte(1) }"><h3>1 Balance Energy</h3><br>Keep row 4 milestones on all resets</td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(2))"><td v-bind:class="{ milestone: player.ba.best.lt(2), milestoneDone: player.ba.best.gte(2) }"><h3>2 Balance Energy</h3><br>Keep Quirk Upgrades on all resets</td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(3), true)"><td v-bind:class="{ milestone: player.ba.best.lt(3), milestoneDone: player.ba.best.gte(3) }"><h3>3 Balance Energy</h3><br>Automatically purchase Quirk Layers&nbsp;&nbsp;&nbsp;<button v-if="player.ba.best.gte(3)" class="smallUpg can q" onclick="toggleAuto('q')">{{player.q.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(5))"><td v-bind:class="{ milestone: player.ba.best.lt(5), milestoneDone: player.ba.best.gte(5) }"><h3>5 Balance Energy</h3><br>Keep Hyper-Booster & Subspace Upgrades on all resets</td></tr>
<tr v-if="milestoneShown(player.ba.best.gte(8))"><td v-bind:class="{ milestone: player.ba.best.lt(8), milestoneDone: player.ba.best.gte(8) }"><h3>8 Balance Energy</h3><br>You can buy max Hyper-Boosters & Subspace Energy, and Hyper-Boosters/Subspace Energy reset nothing</td></tr>
</table><br><br>
You have {{format(player.ba.power)}} Balance Power, which is multiplying Hindrance Spirit & Quirk gain by {{format(tmp.balEff)}}<br>
You have {{format(player.ba.positivity)}} Positivity and {{format(player.ba.negativity)}} Negativity, which are multiplying Balance Power gain by {{format(tmp.balEff2)}}
</div>
<div v-if="layer=='ps'">
<table>
<tr v-if="milestoneShown(player.ps.best.gte(2), true)"><td v-bind:class="{ milestone: player.ps.best.lt(5), milestoneDone: player.ps.best.gte(2) }"><h3>2 Phantom Souls</h3><br>Automatically purchase Phantom Souls&nbsp;&nbsp;&nbsp;<button v-if="player.ps.best.gte(2)" class="smallUpg can ps" onclick="toggleAuto('ps')">{{player.ps.auto?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.ps.best.gte(5))"><td v-bind:class="{ milestone: player.ps.best.lt(5), milestoneDone: player.ps.best.gte(5) }"><h3>5 Phantom Souls</h3><br>You can buy max Phantom Souls, and Phantom Souls reset nothing</td></tr>
</table><br><br>
</div>
<div v-if="layer=='sp'">
<table>
<tr v-if="milestoneShown(player.sp.total.gte(1))"><td v-bind:class="{ milestone: player.sp.total.lt(1), milestoneDone: player.sp.total.gte(1) }"><h3>1 total Super-Prestige Point</h3><br>Upgrades of Rows 1-5 and Hindrances are kept on all resets</td></tr>
<tr v-if="milestoneShown(player.sp.total.gte(2), true)"><td v-bind:class="{ milestone: player.sp.total.lt(2), milestoneDone: player.sp.total.gte(2) }"><h3>2 total Super-Prestige Points</h3><br>Keep Magic Milestones on reset, Spells do not cost Magic, and Magic Upgrade 13's effect can be auto-set to your current Magic&nbsp;&nbsp;&nbsp;<button v-if="player.sp.total.gte(2)" class="smallUpg can m" onclick="toggleAuto('m', 'Ins')">{{player.m.autoIns?"ON":"OFF"}}</button></td></tr>
<tr v-if="milestoneShown(player.sp.total.gte(5))"><td v-bind:class="{ milestone: player.sp.total.lt(5), milestoneDone: player.sp.total.gte(5) }"><h3>5 total Super-Prestige Points</h3><br>Keep Balance Milestones on reset</td></tr>
<tr v-if="milestoneShown(player.sp.total.gte(10))"><td v-bind:class="{ milestone: player.sp.total.lt(10), milestoneDone: player.sp.total.gte(10) }"><h3>10 total Super-Prestige Points</h3><br>Gain 100% of Magic & Balance Power gain every second</td></tr>
</table>
</div>
<div v-if="layer=='l'">
<br><br>
You have {{format(player.l.power)}} Life Power (+{{format(LIFE_BOOSTERS.calcNewPower(1).sub(player.l.power))}}/s),<br>
which is translating to:
<div class="upgRow">
<div v-for="i in tmp.l.lbUnl">
<button v-bind:class="{ upgBig: true, l: true }"><h3>Life Booster {{i}}</h3><br>{{LIFE_BOOSTERS[i].effDesc(tmp.l.lbEff[i])}}<br><br>Boosters: {{formatWhole(tmp.l.lb[i])}}<br>Next at: {{formatWhole(LIFE_BOOSTERS.req(i).ceil())}} Phantom Souls</button>
</div>
</div>
You have {{formatWhole(player.ps.points)}} Phantom Souls, {{getLayerEffDesc("ps")}}
</div>
<div v-if="layer=='hs'">
<table>
<tr v-if="milestoneShown(player.hs.best.gte(2e4))"><td v-bind:class="{ milestone: player.hs.best.lt(2e4), milestoneDone: player.hs.best.gte(2e4) }"><h3>20,000 Hyperspace Energy</h3><br>Gain 1% of Super-Prestige Points gain every second</td></tr>
</table>
<br><br>
You have {{formatWhole(player.ba.points)}} Balance Energy
<br>
<button v-on:click="HYPERSPACE.buy()" v-bind:class="{ upgBig: true, hs: true, can: HYPERSPACE.canBuy(), locked: !HYPERSPACE.canBuy() }">Buy a Hyperspace<br>Amount: {{formatWhole(player.hs.space.sub(player.hs.spent))}}<br><br>Cost: {{formatWhole(HYPERSPACE.cost().hs)}} Hyperspace Energy & {{formatWhole(HYPERSPACE.cost().ba)}} Balance Energy</button>
<br><br>
<button v-on:click="HYPERSPACE.respec()" v-bind:class="{ longUpg: true, hs: true, can: player.hs.unl, locked: !player.hs.unl }">Respec Super-Upgrades</button><br>
<div class="upgRow">
<div v-for="i in tmp.s.trueSbUnl">
<button v-on:click="HYPERSPACE.superUpg(i)" v-bind:class="{ upg: true, hs: true, can: HYPERSPACE.canSuperUpg(i), locked: !HYPERSPACE.canSuperUpg(i) }"><h3>Building {{i}}</h3><br>{{getSpaceBuildingEffDesc(i)}}<br><br>Super-Level: {{formatWhole(tmp.hs.su[i])}} / {{formatWhole(player.hs.superUpgradeCap)}}<br>({{format(tmp.hs.suEff[i].sub(1).times(100))}}% stronger)<br>Cost: 1 Hyperspace</button>
</div>
</div>
<br>
Get {{formatWhole(player.g.points)}} / {{formatWhole(HYPERSPACE.nextCapReq())}} Generators to increase the cap of Super-Upgrades
</div>
<div v-if="layer=='i'">
<table>
<tr v-if="milestoneShown(player.i.best.gte(3))"><td v-bind:class="{ milestone: player.i.best.lt(3), milestoneDone: player.i.best.gte(3) }"><h3>3 Imperium Bricks</h3><br>You can max out Imperium Bricks</td></tr>
</table>
<br><br>
You have {{formatWhole(player.i.lifeBricks)}} Life Bricks<br>
Next Life Brick is at {{format(player.l.power)}} / {{format(IMPERIUM.lifeReq())}} Life Power
<br><br>
<button v-on:click="IMPERIUM.build()" v-bind:class="{ upgBig: true, i: true, can: IMPERIUM.canBuild(), locked: !IMPERIUM.canBuild() }">
<h3>Imperium Buildings</h3><br>
<span v-if="tmp.s.sbUnl.lt(SPACE_BUILDINGS.max)">Build Space Building {{formatWhole(tmp.s.sbUnl.add(1))}}</span>
<span v-if="tmp.s.sbUnl.gte(SPACE_BUILDINGS.max)">Enhance<sup v-if="tmp.s.sbUnl.div(SPACE_BUILDINGS.max).gte(2)">{{formatWhole(tmp.s.sbUnl.div(SPACE_BUILDINGS.max).floor())}}</sup> Space Building {{formatWhole(tmp.s.sbUnl.sub(tmp.s.sbUnl.div(SPACE_BUILDINGS.max).floor().times(SPACE_BUILDINGS.max)).add(1))}}</span>
<br>
Built Buildings: {{formatWhole(player.i.extraBuildings)}}
<br><br>
<span v-if="!player.i.building">Cost: {{IMPERIUM.cost().i}} Imperium Bricks & {{IMPERIUM.cost().l}} Life Bricks</span>
<span v-if="player.i.building">Progress: {{format(player.i.progress * 100)}}%<br>Your {{formatWhole(player.sg.points)}} Super-Generators speed up your progress by {{format(IMPERIUM.sgSpeedBoost())}}x<br><br>Click to cancel building</span>
</button>
<br>
Your Work is currently {{format(tmp.i.work)}}, which reduces the gain power of rows 1 - 5 by {{format(tmp.i.workEff)}}x
<span v-for="i in IMPERIUM.maxCollapseRows"><span v-if="IMPERIUM.collapsed(i)"><br>Your Work also collapses row {{i}} layers by {{format(tmp.i.collapse[i].times(100))}}%</span></span>
</div>
<br><br>
<div v-if="LAYER_UPGS[layer]" class="upgTable">
<div v-for="row in LAYER_UPGS[layer].rows" class="upgRow">
<div v-for="col in LAYER_UPGS[layer].cols" class="upgAlign">
<button v-if="LAYER_UPGS[layer][row*10+col].unl()" v-on:click="buyUpg(layer, row*10+col)" v-bind:class="{ [layer]: true, upg: true, bought: player[layer].upgrades.includes(row*10+col), locked: (player[layer].points.lt(LAYER_UPGS[layer][row*10+col].cost)&&!player[layer].upgrades.includes(row*10+col)), can: (player[layer].points.gte(LAYER_UPGS[layer][row*10+col].cost)&&!player[layer].upgrades.includes(row*10+col)) }">{{ LAYER_UPGS[layer][row*10+col].desc }}<span v-if="LAYER_UPGS[layer][row*10+col].currently"><br>Currently: {{LAYER_UPGS[layer][row*10+col].effDisp(LAYER_UPGS[layer][row*10+col].currently())}}</span><br><br>Cost: {{ formatWhole(LAYER_UPGS[layer][row*10+col].cost) }} {{LAYER_RES[layer]}}</button>
<div v-if="layers[layer].upgrades != undefined" class="upgTable">
<div v-for="row in layers[layer].upgrades.rows" class="upgRow">
<div v-for="col in layers[layer].upgrades.cols" class="upgAlign">
<button v-if="layers[layer].upgrades[row*10+col].unl()" v-on:click="buyUpg(layer, row*10+col)" v-bind:class="{ [layer]: true, upg: true, bought: player[layer].upgrades.includes(row*10+col), locked: (!(canAffordUpg(layer, row*10+col))&&!player[layer].upgrades.includes(row*10+col)), can: (canAffordUpg(layer, row*10+col)&&!player[layer].upgrades.includes(row*10+col))}" v-bind:style="{'background-color': layers[layer].color}">{{ layers[layer].upgrades[row*10+col].desc }}<span v-if="layers[layer].upgrades[row*10+col].effect"><br>Currently: {{layers[layer].upgrades[row*10+col].effDisp(layers[layer].upgrades[row*10+col].effect())}}</span><br><br>Cost: {{ formatWhole(layers[layer].upgrades[row*10+col].cost) }} {{(layers[layer].upgrades[row*10+col].currencyDisplayName ? layers[layer].upgrades[row*10+col].currencyDisplayName : layers[layer].resource)}}</button>
</div>
</div>
</div>
<div v-if="LAYER_CHALLS[layer]" class="upgTable">
<div v-for="row in LAYER_CHALLS[layer].rows" class="upgRow">
<div v-for="col in LAYER_CHALLS[layer].cols">
<div v-if="LAYER_CHALLS[layer][row*10+col].unl()" v-bind:class="{hChall: true, done: player[layer].challs.includes(row*10+col), canComplete: (player.points.gte(LAYER_CHALLS[layer][row*10+col].goal)&&tmp.challActive[layer][row*10+col]&&!player[layer].challs.includes(row*10+col))}">
<br><h3>{{LAYER_CHALLS[layer][row*10+col].name}}</h3><br><br>
<button v-bind:class="{ longUpg: true, can: true, [layer]: true }" v-on:click="startChall(layer, row*10+col)">{{player[layer].active==(row*10+col)?(player.points.gte(LAYER_CHALLS[layer][row*10+col].goal)?"Finish":"Exit Early"):(player[layer].challs.includes(row*10+col)?"Completed":"Start")}}</button><br><br>
{{LAYER_CHALLS[layer][row*10+col].desc}}<br>
Goal: {{format(LAYER_CHALLS[layer][row*10+col].goal)}} Points<br>
Reward: {{LAYER_CHALLS[layer][row*10+col].reward}}<br>
<span v-if="LAYER_CHALLS[layer][row*10+col].effDisp!==undefined">Currently: {{LAYER_CHALLS[layer][row*10+col].effDisp(LAYER_CHALLS[layer][row*10+col].currently())}}</span>
<div v-if="layers[layer].challs" class="upgTable">
<div v-for="row in layers[layer].challs.rows" class="upgRow">
<div v-for="col in layers[layer].challs.cols">
<div v-if="layers[layer].challs[row*10+col].unl()" v-bind:class="{hChall: true, done: player[layer].challs.includes(row*10+col), canComplete: (player.points.gte(layers[layer].challs[row*10+col].goal)&&tmp.challActive[layer][row*10+col]&&!player[layer].challs.includes(row*10+col))}">
<br><h3>{{layers[layer].challs[row*10+col].name}}</h3><br><br>
<button v-bind:class="{ longUpg: true, can: true, [layer]: true }" v-on:click="startChall(layer, row*10+col)">{{player[layer].active==(row*10+col)?(player.points.gte(layers[layer].challs[row*10+col].goal)?"Finish":"Exit Early"):(player[layer].challs.includes(row*10+col)?"Completed":"Start")}}</button><br><br>
{{layers[layer].challs[row*10+col].desc}}<br>
Goal: {{format(layers[layer].challs[row*10+col].goal)}} Points<br>
Reward: {{layers[layer].challs[row*10+col].reward}}<br>
<span v-if="layers[layer].challs[row*10+col].effDisp!==undefined">Currently: {{layers[layer].challs[row*10+col].effDisp(layers[layer].challs[row*10+col].effect())}}</span>
</div>
</div>
</div>
@ -691,8 +167,8 @@
<script>
// Mod Identifier, for ~~btpt~~ any userscripts. Consider adding this to your mod!
const modInfo = {
name: "Prestige Tree",
id: "default"
name: "The Candy Tree",
id: "crossover"
}
</script>
</body>

View file

@ -39,75 +39,24 @@ var colors_theme
function drawTree() {
if (!retrieveCanvasData()) return;
ctx.clearRect(0, 0, canvas.width, canvas.height);
if (layerShown('b')) drawTreeBranch("p", "b")
if (layerShown('g')) drawTreeBranch("p", "g")
if (layerShown('e')) {
drawTreeBranch("b", "e")
drawTreeBranch("g", "e")
for (layer in layers){
if (layers[layer].layerShown() && layers[layer].branches){
for (branch in layers[layer].branches)
{
drawTreeBranch(layer, layers[layer].branches[branch])
}
}
}
if (layerShown('t')) drawTreeBranch("b", "t")
if (layerShown('sb')) drawTreeBranch("b", "sb")
if (layerShown('sg')) drawTreeBranch("g", "sg")
if (layerShown('s')) drawTreeBranch("g", "s")
if (layerShown('h')) drawTreeBranch("t", "h")
if (layerShown('q')) drawTreeBranch("e", "q")
if (layerShown('hb')) {
drawTreeBranch("sb", "hb")
drawTreeBranch("t", "hb")
}
if (layerShown('ss')) {
drawTreeBranch("e", "ss")
drawTreeBranch("s", "ss")
}
if (layerShown('hg')) {
drawTreeBranch("sg", "hg")
}
if (layerShown('m')) {
drawTreeBranch("hb", "m")
drawTreeBranch("h", "m")
drawTreeBranch("q", "m")
}
if (layerShown('ba')) {
drawTreeBranch("h", "ba", 2)
drawTreeBranch("q", "ba")
drawTreeBranch("ss", "ba")
}
if (layerShown('sp')) {
drawTreeBranch("m", "sp")
drawTreeBranch("ba", "sp")
}
if (layerShown('l')) {
drawTreeBranch("hb", "l")
drawTreeBranch("m", "l")
}
if (layerShown('ps')) {
drawTreeBranch("h", "ps", 3)
drawTreeBranch("q", "ps", 3)
}
if (layerShown('hs')) {
drawTreeBranch("ss", "hs")
drawTreeBranch("ba", "hs")
}
if (layerShown('i')) {
drawTreeBranch("ss", "i")
drawTreeBranch("sg", "i")
}
if (layerShown('mb')) {
drawTreeBranch("l", "mb")
drawTreeBranch("ps", "mb", 2)
}
if (layerShown('ge')) {
drawTreeBranch("sp", "ge")
}
if (layerShown('ma')) {
drawTreeBranch("hs", "ma")
drawTreeBranch("i", "ma")
}
needCanvasUpdate = false;
}
function drawTreeBranch(num1, num2, color_id = 1) { // taken from Antimatter Dimensions & adjusted slightly
let start = document.getElementById(num1).getBoundingClientRect();
function drawTreeBranch(num1, data) { // taken from Antimatter Dimensions & adjusted slightly
let num2 = data[0]
let color_id = data[1]
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.getElementById("treeTab").scrollLeft || document.body.scrollLeft);
let y1 = start.top + (start.height / 2) + (document.getElementById("treeTab").scrollTop || document.body.scrollTop);

3751
js/game.js

File diff suppressed because it is too large Load diff

123
js/layers.js Normal file
View file

@ -0,0 +1,123 @@
var layers = {
c: {
startData() { return {
unl: true,
points: new Decimal(0),
best: new Decimal(0),
upgrades: [],
}},
color: "#4BEC13",
requires() {return new Decimal(10)}, // Can be a function that takes requirement increases into account
resource: "lollipops", // Name of prestige currency
baseResource: "candies", // Name of resource prestige is based on
baseAmount() {return player.points},
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))
resCeil: false, // True if the resource needs to be rounded up
canBuyMax() {}, // Only needed for static layers
gainMult() {
mult = new Decimal(1)
if (player.c.upgrades.includes(21)) mult = mult.times(2)
if (player.c.upgrades.includes(23)) mult = mult.times(LAYER_UPGS.c[23].currently())
return mult
},
gainExp() {
return new Decimal(1)
},
row: 0,
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.c.points, 0.2)),
icecreamCap: (player.c.points * 10)
}},
effectDescription() {
eff = layer.c.effect();
return "which are boosting waffles by "+format(eff.waffleBoost)+" and increasing the Ice Cream cap by "+format(eff.icecreamCap)
},
upgrades: {
rows: 1,
cols: 3,
11: {
desc: "Gain 1 Candy every second.",
cost: new Decimal(1),
unl() { return player.c.unl },
},
12: {
desc: "Candy generation is faster based on your unspent Lollipops.",
cost: new Decimal(1),
unl() { return player.c.upgrades.includes(11) },
effect() {
let ret = player.c.points.add(1).pow(player.c.upgrades.includes(24)?1.1:(player.c.upgrades.includes(14)?0.75:0.5))
if (ret.gte("1e20000000")) ret = ret.sqrt().times("1e10000000")
return ret;
},
effDisp(x) { return format(x)+"x" },
},
13: {
desc: "Make this layer act like you bought it first.",
cost: new Decimal(69),
currencyDisplayName: "candies", // Use if using a nonstandard currency
currencyInternalName: "points", // Use if using a nonstandard currency
currencyLayer: "", // Leave empty if not in a layer "e.g. points"
unl() { return player.c.upgrades.includes(12) },
onPurchase() {
player.c.order = 0
}
},
},
convertToDecimal() {
// Convert any layer-specific values (besides points, total, and best) to Decimal
},
layerShown() {return true}, // Condition for when layer appears
update(diff) {
if (player.c.upgrades.includes(11)) player.points = player.points.add(tmp.pointGen.times(diff)).max(0)
}, // Do any gameloop things (e.g. resource generation) inherent to this layer
automate() {
}, // Do any automation inherent to this layer if appropriate
updateTemp() {
}, // Do any necessary temp updating
resetsNothing() {return false},
incr_order: [], // Array of layer names to have their order increased when this one is first unlocked
},
f: {
startData() { return {
unl: false,
points: new Decimal(0),
best: new Decimal(0),
}},
color: "#FE0102",
requires() {return new Decimal(200)}, // Can be a function that takes requirement increases into account
resource: "butts", // Name of prestige currency
baseResource: "points", // Name of resource prestige is based on
baseAmount() {return player.points},
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
resCeil: false, // True if the resource needs to be rounded up
gainMult() {
mult = new Decimal(1)
},
gainExp() {
return new Decimal(1)
},
row: 1,
effect() {return},
layerShown() {return true}, // Condition for when layer appears
resetsNothing() {return false},
branches: [["c", 1]] // Each pair corresponds to a line added to the tree when this node is unlocked. The letter is the other end of the line, and the number affects the color, 1 is default
},
}
function layerShown(layer){
return layers[layer].layerShown();
}
const LAYERS = Object.keys(layers);
var ROW_LAYERS = {}
for (layer in layers){
row = layers[layer].row
if(!ROW_LAYERS[row]) ROW_LAYERS[row] = {}
ROW_LAYERS[row][layer]=layer;
}

View file

@ -1,132 +1,37 @@
function updateTemp() {
if (!tmp.challActive) {
let LAYERS_WITH_CHALLS = Object.keys(LAYER_CHALLS)
tmp.challActive = {}
for (let i = 0; i < LAYERS_WITH_CHALLS.length; i++) {
tmp.challActive[LAYERS_WITH_CHALLS[i]] = {}
updateChallTemp(LAYERS_WITH_CHALLS[i])
if (!tmp.challActive) {tmp.challActive = {}}
for (layer in layers) {
if(layers[layer].challs !== undefined){
tmp.challActive[layer] = {}
updateChallTemp(layer)
}
}
if (!tmp.layerEffs) tmp.layerEffs = {}
for (let name in LAYER_EFFS) tmp.layerEffs[name] = LAYER_EFFS[name]()
for (layer in layers) tmp.layerEffs[layer] = layers[layer].effect()
if (!tmp.layerReqs) tmp.layerReqs = {}
for (let name in LAYER_REQS) tmp.layerReqs[name] = getLayerReq(name)
for (layer in layers) tmp.layerReqs[layer] = layers[layer].requires()
if (!tmp.gainMults) tmp.gainMults = {}
if (!tmp.gainExp) tmp.gainExp = {}
if (!tmp.resetGain) tmp.resetGain = {}
if (!tmp.nextAt) tmp.nextAt = {}
if (!tmp.layerAmt) tmp.layerAmt = {}
for (let i in LAYERS) {
tmp.layerAmt[LAYERS[i]] = getLayerAmt(LAYERS[i])
tmp.gainMults[LAYERS[i]] = getLayerGainMult(LAYERS[i])
tmp.gainExp[LAYERS[i]] = getLayerGainExp(LAYERS[i])
tmp.resetGain[LAYERS[i]] = getResetGain(LAYERS[i])
tmp.nextAt[LAYERS[i]] = getNextAt(LAYERS[i])
for (layer in layers) {
tmp.layerAmt[layer] = layers[layer].baseAmount()
tmp.gainMults[layer] = layers[layer].gainMult()
tmp.gainExp[layer] = layers[layer].gainExp()
tmp.resetGain[layer] = getResetGain(layer)
tmp.nextAt[layer] = getNextAt(layer)
}
tmp.pointGen = getPointGen()
tmp.scaling12b = getScaling12Boosters()
tmp.atbb = addToBoosterBase()
tmp.atgb = addToGenBase()
tmp.genPowEff = getGenPowerEff()
tmp.enhPow = getEnhancerPow()
tmp.enhEff = getEnhancerEff()
tmp.enhEff2 = getEnhancerEff2()
tmp.subbedEnh = new Decimal(0)
if (tmp.challActive ? tmp.challActive.h[52] : true) {
tmp.subbedEnh = tmp.subbedEnh.add(new Decimal(player.h.time).times(40).add(1).log10().pow(10).max(10)).round()
}
tmp.freeExtCap = getFreeExtCapsules()
tmp.timeEff = getTimeEnergyEff()
tmp.attb = addToTimeBase()
tmp.mttb = multiplyToTimeBase()
if (layerUnl("s")) {
tmp.s = {
sb: {},
sbEff: {}
}
var data = tmp.s
data.sbUnl = getSpaceBuildingsUnl()
data.trueSbUnl = Decimal.min(data.sbUnl, SPACE_BUILDINGS.max).floor().toNumber()
data.sbCostMult = getSpaceBuildingCostMult()
data.sbCostMod = getSpaceBuildingCostMod()
data.sbExtra = getExtraBuildingLevels()
data.sbPow = getSpaceBuildingPow()
data.sbSum = sumValues(player.s.buildings)
for (let i=data.trueSbUnl;i>=1;i--) {
data.sb[i] = fixValue(player.s.buildings[i])
data.sbEff[i] = getSpaceBuildingEff(i)
}
}
tmp.quirkEff = getQuirkEnergyEff()
tmp.qCB = getQuirkLayerCostBase()
tmp.ssEff1 = getSubspaceEff1()
tmp.ssEff2 = getSubspaceEff2()
tmp.ssEff3 = getSubspaceEff3()
tmp.balEff = getBalancePowerEff()
tmp.balEff2 = getBalanceTypesEff()
tmp.baExp = getBalanceEnergyExp()
tmp.hexEff = getHexEff()
tmp.spellsUnl = player.sp.upgrades.includes(13)?4:3
if (!tmp.spellEffs) tmp.spellEffs = {}
for (let i=1;i<=4;i++) tmp.spellEffs[i] = getSpellEff(i)
tmp.sGenPowEff = getSGenPowEff()
if (layerUnl("l")) {
if (!tmp.l) tmp.l = {
lb: {},
lbEff: {}
}
var data = tmp.l
var data2 = LIFE_BOOSTERS
data.lpEff = data2.eff()
data.lbUnl = data2.unl()
for (let i=1;i<=data2.max;i++) {
data.lb[i] = fixValue(player.l.boosters[i])
data.lbEff[i] = data2[i].eff(data.lb[i].times(data.lpEff))
}
}
if (layerUnl("hs")) {
if (!tmp.hs) tmp.hs = {
su: {},
suEff: {}
}
var data = tmp.hs
var data2 = HYPERSPACE
data.eff = data2.eff()
for (let i=1;i<=tmp.s.trueSbUnl;i++) data.su[i] = fixValue(player.hs.superUpgrades[i])
}
if (layerUnl("i")) {
if (!tmp.i) tmp.i = {}
var data = tmp.i
data.work = new Decimal(1)
if (player.i.building) data.work = data.work.add(player.i.extraBuildings.add(1).sqrt().add(1).div(5))
data.workEff = Decimal.pow(2, data.work.sub(1))
data.collapse = {}
for (var i = 1; i <= IMPERIUM.maxCollapseRows; i++) if (data.work.gt(i + 0.5)) data.collapse[i] = data.work.sub(i + 0.5).times(2).min(1)
data.compressed = tmp.s.sbUnl.sub(SPACE_BUILDINGS.max).max(0).floor().toNumber()
for (layer in layers){
if (layers[layer].updateTemp) layers[layer].updateTemp()
}
}
@ -134,7 +39,7 @@ function updateChallTemp(layer) {
if (player[layer] === undefined) return
let data = tmp.challActive[layer]
let data2 = LAYER_CHALLS[layer]
let data2 = layers[layer].challs
let customActive = data2.active !== undefined
for (let row = 1; row <= data2.rows; row++) {
for (let col = 1; col <= data2.cols; col++) {

43
js/v.js
View file

@ -10,15 +10,18 @@ function loadVue() {
showTab(layer)
}"
v-bind:tooltip="
layerUnl(layer) ? formatWhole(player[layer].points) + ' ' + LAYER_RES[layer]
: 'Reach ' + formatWhole(tmp.layerReqs[layer]) + ' ' + LAYER_AMT_NAMES[layer] + ' to unlock (You have ' + formatWhole(tmp.layerAmt[layer]) + ' ' + LAYER_AMT_NAMES[layer] + ')'
player[layer].unl ? formatWhole(player[layer].points) + ' ' + layers[layer].resource
: 'Reach ' + formatWhole(tmp.layerReqs[layer]) + ' ' + layers[layer].baseResource + ' to unlock (You have ' + formatWhole(tmp.layerAmt[layer]) + ' ' + layers[layer].baseResource + ')'
"
v-bind:class="{
treeNode: true,
[layer]: true,
hidden: !layerShown(layer),
locked: !layerUnl(layer),
can: layerUnl(layer)
hidden: !layers[layer].layerShown(),
locked: !player[layer].unl,
can: layerUnl(layer),
}"
v-bind:style="{
'background-color': layers[layer].color,
}">
{{abb}}
</button>
@ -29,6 +32,7 @@ function loadVue() {
data: {
player,
tmp,
layers,
Decimal,
format,
formatWhole,
@ -36,41 +40,14 @@ function loadVue() {
focused,
getThemeName,
layerUnl,
getLayerEffDesc,
doReset,
buyUpg,
getEnhancerCost,
getExtCapsuleCost,
getSpace,
getSpaceBuildingsUnl,
getSpaceBuildingCost,
getSpaceBuildingEffDesc,
buyBuilding,
getQuirkLayerCost,
buyQuirkLayer,
startChall,
milestoneShown,
destroyBuilding,
getSpellDesc,
activateSpell,
spellActive,
updateToCast,
keepGoing,
VERSION,
ENDGAME,
LAYERS,
LAYER_RES,
LAYER_TYPE,
LAYER_UPGS,
LAYER_EFFS,
LAYER_AMT_NAMES,
LAYER_RES_CEIL,
LAYER_CHALLS,
SPACE_BUILDINGS,
SPELL_NAMES,
LIFE_BOOSTERS,
HYPERSPACE,
IMPERIUM
LAYERS
},
})
}

131
sampleLayers.js Normal file
View file

@ -0,0 +1,131 @@
var layers = {
c: {
startData() { return {
unl: true,
points: new Decimal(0),
best: new Decimal(0),
upgrades: [],
challs: [],
}},
color: "#4BEC13",
requires() {return new Decimal(10)}, // Can be a function that takes requirement increases into account
resource: "lollipops", // Name of prestige currency
baseResource: "candies", // Name of resource prestige is based on
baseAmount() {return player.points},
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))
resCeil: false, // True if the resource needs to be rounded up
canBuyMax() {}, // Only needed for static layers
gainMult() {
mult = new Decimal(1)
if (player.c.upgrades.includes(21)) mult = mult.times(2)
if (player.c.upgrades.includes(23)) mult = mult.times(LAYER_UPGS.c[23].currently())
return mult
},
gainExp() {
return new Decimal(1)
},
row: 0,
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.c.points, 0.2)),
icecreamCap: (player.c.points * 10)
}},
effectDescription() {
eff = layer.c.effect();
return "which are boosting waffles by "+format(eff.waffleBoost)+" and increasing the Ice Cream cap by "+format(eff.icecreamCap)
},
upgrades: {
rows: 1,
cols: 3,
11: {
desc: "Gain 1 Candy every second.",
cost: new Decimal(1),
unl() { return player.c.unl },
},
12: {
desc: "Candy generation is faster based on your unspent Lollipops.",
cost: new Decimal(1),
unl() { return player.c.upgrades.includes(11) },
effect() {
let ret = player.c.points.add(1).pow(player.c.upgrades.includes(24)?1.1:(player.c.upgrades.includes(14)?0.75:0.5))
if (ret.gte("1e20000000")) ret = ret.sqrt().times("1e10000000")
return ret;
},
effDisp(x) { return format(x)+"x" },
},
13: {
desc: "Make this layer act like you bought it first.",
cost: new Decimal(69),
currencyDisplayName: "candies", // Use if using a nonstandard currency
currencyInternalName: "points", // Use if using a nonstandard currency
currencyLayer: "", // Leave empty if not in a layer "e.g. points"
unl() { return player.c.upgrades.includes(12) },
onPurchase() {
player.c.order = 0
}
},
},
challs: {
rows: 1,
cols: 1,
active(x) {
if (x<71&&x!=42&&x!=52) if (this.active(71)) return true
if (x==11||x==41) if (this.active(51)) return true
if (x==31||x==32) if (this.active(61)) return true
return player.c.active==x;
},
11: {
name: "Skip the Second",
desc: "Boosters and Generator Power do nothing",
unl() { return player.c.best.gt(0) },
goal: new Decimal("1e2400"),
reward: "The generator power effect is raised to the power of 1.25",
},
},
convertToDecimal() {
// Convert any layer-specific values (besides points, total, and best) to Decimal
},
layerShown() {return true}, // Condition for when layer appears
update(diff) {
if (player.c.upgrades.includes(11)) player.points = player.points.add(tmp.pointGen.times(diff)).max(0)
}, // Do any gameloop things (e.g. resource generation) inherent to this layer
automate() {}, // Do any automation inherent to this layer if appropriate
updateTemp() {}, // Do any necessary temp updating
resetsNothing() {return false},
incr_order: [], // Array of layer names to have their order increased when this one is first unlocked
branches: [] // Each pair corresponds to a line added to the tree when this node is unlocked. The letter is the other end of the line, and the number affects the color, 1 is default
},
f: { // This layer contains a more minimal set of things, besides a branch
startData() { return {
unl: false,
points: new Decimal(0),
best: new Decimal(0),
}},
color: "#FE0102",
requires() {return new Decimal(200)},
resource: "stuff",
baseResource: "points",
baseAmount() {return player.points},
type: "normal",
exponent: 0.5,
resCeil: false,
gainMult() {
mult = new Decimal(1)
},
gainExp() {
return new Decimal(1)
},
row: 1,
effect() {return},
layerShown() {return true}, // Condition for when layer appears
resetsNothing() {return false},
branches: [["c", 1]] // Each pair corresponds to a line added to the tree when this node is unlocked. The letter is the other end of the line, and the number affects the color, 1 is default
},
}
function layerShown(layer){
return layers[layer].layerShown();
}
const LAYERS = Object.keys(layers);

230
style.css
View file

@ -167,236 +167,6 @@ h1, h2, h3, b, input {
text-shadow: 0px 0px 10px var(--points);
}
.p {
background-color: #00bfbf;
color: rgba(0, 0, 0, 0.5);
}
.p_txt {
color: #00bfbf;
text-shadow: 0px 0px 10px #00bfbf;
}
.b {
background-color: #415a9e;
color: rgba(0, 0, 0, 0.5);
}
.b_txt {
color: #415a9e;
text-shadow: 0px 0px 10px #415a9e;
}
.g {
background-color: #409c6e;
color: rgba(0, 0, 0, 0.5);
}
.g_txt {
color: #409c6e;
text-shadow: 0px 0px 10px #409c6e;
}
.e {
background-color: #9643a3;
color: rgba(0, 0, 0, 0.5);
}
.e_txt {
color: #9643a3;
text-shadow: 0px 0px 10px #9643a3;
}
.t {
background-color: #3f993d;
color: rgba(0, 0, 0, 0.5);
}
.t_txt {
color: #3f993d;
text-shadow: 0px 0px 10px #3f993d;
}
.s {
background-color: #dfdfdf;
color: rgba(0, 0, 0, 0.5);
}
.s_txt {
color: #dfdfdf;
text-shadow: 0px 0px 10px #dfdfdf;
}
.sb {
background-color: #494b99;
color: rgba(0, 0, 0, 0.5);
}
.sb_txt {
color: #494b99;
text-shadow: 0px 0px 10px #494b99;
}
.h {
background-color: #a14040;
color: rgba(0, 0, 0, 0.5);
}
.h_txt {
color: #a14040;
text-shadow: 0px 0px 10px #a14040;
}
.q {
background-color: #ff2bf2;
color: rgba(0, 0, 0, 0.5);
}
.q_txt {
color: #ff2bf2;
text-shadow: 0px 0px 10px #ff2bf2;
}
.hb {
background-color: #513d94;
color: rgba(0, 0, 0, 0.5);
}
.hb_txt {
color: #513d94;
text-shadow: 0px 0px 10px #513d94;
}
.ss {
background-color: #eff7ff;
color: rgba(0, 0, 0, 0.5);
}
.ss_txt {
color: #eff7ff;
text-shadow: 0px 0px 10px #eff7ff;
}
.hg {
background-color: #3d9989;
color: rgba(0, 0, 0, 0.5);
}
.hg_txt {
color: #3d9989;
text-shadow: 0px 0px 10px #3d9989;
}
.m {
background-color: #eb34c0;
color: rgba(0, 0, 0, 0.5);
}
.m_txt {
color: #eb34c0;
text-shadow: 0px 0px 10px #eb34c0;
}
.ba {
background-color: #ebc88f;
color: rgba(0, 0, 0, 0.5);
}
.ba_txt {
color: #ebc88f;
text-shadow: 0px 0px 10px #ebc88f;
}
.sg {
background-color: #3d997a;
color: rgba(0, 0, 0, 0.5);
}
.sg_txt {
color: #3d997a;
text-shadow: 0px 0px 10px #3d997a;
}
.sp {
background-color: #00a7bf;
color: rgba(0, 0, 0, 0.5);
}
.sp_txt {
color: #00a7bf;
text-shadow: 0px 0px 10px #00a7bf;
}
.l {
background-color: #7fbf7f;
color: rgba(0, 0, 0, 0.5);
}
.l_txt {
color: #7fbf7f;
text-shadow: 0px 0px 10px #7fbf7f;
}
.ps {
background-color: #b38fbf;
color: rgba(0, 0, 0, 0.5);
}
.ps_txt {
color: #b38fbf;
text-shadow: 0px 0px 10px #b38fbf;
}
.hs {
background-color: #dfdfff;
color: rgba(0, 0, 0, 0.5);
}
.hs_txt {
color: #dfdfff;
text-shadow: 0px 0px 10px #dfdfff;
}
.i {
background-color: #e5dab7;
color: rgba(0, 0, 0, 0.5);
}
.i_txt {
color: #e5dab7;
text-shadow: 0px 0px 10px #e5dab7;
}
.mb {
background-color: #ff9f7f;
color: rgba(0, 0, 0, 0.5);
}
.mb_txt {
color: #ff9f7f;
text-shadow: 0px 0px 10px #ff9f7f;
}
.ge {
background-color: #bfbfbf;
color: rgba(0, 0, 0, 0.5);
}
.ge_txt {
color: #bfbfbf;
text-shadow: 0px 0px 10px #bfbfbf;
}
.ma {
background-color: #9f9f9f;
color: rgba(0, 0, 0, 0.5);
}
.ma_txt {
color: #9f9f9f;
text-shadow: 0px 0px 10px #9f9f9f;
}
#optionWheel {
position: absolute;
top: 0px;