diff --git a/index.html b/index.html
index 46c9f0f..69f5eb8 100644
--- a/index.html
+++ b/index.html
@@ -17,6 +17,7 @@
+
diff --git a/js/game.js b/js/game.js
index 3d38522..c195ac2 100644
--- a/js/game.js
+++ b/js/game.js
@@ -5,7 +5,7 @@ var NaNalert = false;
var gameEnded = false;
let VERSION = {
- num: "1.2",
+ num: "1.2.2",
name: "This changes everything!"
}
@@ -54,112 +54,6 @@ function inChallenge(layer, id){
return layers[layer].challs[id].countsAs.includes(id)
}
-function save() {
- localStorage.setItem(modInfo.id, btoa(JSON.stringify(player)))
-}
-
-function fixSave() {
- defaultData = startPlayerBase()
- for (datum in defaultData){
- if (player[datum] == undefined){
- player[datum] = defaultData[datum]
- }
- }
- for (layer in layers) {
- defaultData = layers[layer].startData()
- if (player[layer].upgrades == undefined)
- player[layer].upgrades = []
- if (player[layer].milestones == undefined)
- player[layer].milestones = []
- if (player[layer].challs == undefined)
- player[layer].challs = []
-
- for (datum in defaultData){
- if (player[layer][datum] == undefined){
- player[layer][datum] = defaultData[datum]
- }
- }
-
- if (player[layer].spentOnBuyables == undefined)
- player[layer].spentOnBuyables = new Decimal(0)
-
- if (layers[layer].buyables) {
- if (player[layer].buyables == undefined) player[layer].buyables = {}
-
- for (id in layers[layer].buyables){
- if (player[layer].buyables[id] == undefined && !isNaN(id))
- player[layer].buyables[id] = new Decimal(0)
- }
- }
- }
-}
-
-function load() {
- let get = localStorage.getItem(modInfo.id);
- if (get===null || get===undefined) player = getStartPlayer()
- else player = Object.assign(getStartPlayer(), JSON.parse(atob(get)))
- fixSave()
-
- player.tab = "tree"
- if (player.offlineProd) {
- if (player.offTime === undefined) player.offTime = { remain: 0 }
- player.offTime.remain += (Date.now() - player.time) / 1000
- }
- player.time = Date.now();
- convertToDecimal();
- versionCheck();
- changeTheme();
- changeTreeQuality();
- updateTemp();
- updateTemp();
- loadVue();
-}
-
-function exportSave() {
- let str = btoa(JSON.stringify(player))
-
- const el = document.createElement("textarea");
- el.value = str;
- document.body.appendChild(el);
- el.select();
- el.setSelectionRange(0, 99999);
- document.execCommand("copy");
- document.body.removeChild(el);
-}
-
-function importSave(imported=undefined, forced=false) {
- if (imported===undefined) imported = prompt("Paste your save here")
- try {
- tempPlr = Object.assign(getStartPlayer(), JSON.parse(atob(imported)))
- if(tempPlr.versionType != modInfo.id && !forced) // Wrong save (use "Forced" to force it to accept.)
- return
- player = tempPlr;
- player.versionType = modInfo.id
- fixSave()
- save()
- window.location.reload()
- } catch(e) {
- return;
- }
-}
-
-function versionCheck() {
- let setVersion = true
-
- if (player.versionType===undefined||player.version===undefined) {
- player.versionType = "Modding"
- player.version = 0
- }
-
- if (setVersion) {
- if (player.versionType == "Modding" && VERSION.num > player.version) player.keepGoing = false
- player.versionType = getStartPlayer().versionType
- player.version = VERSION.num
- player.beta = VERSION.beta
- }
-}
-
-
function convertToDecimal() {
player.points = new Decimal(player.points)
for (layer in layers) {
@@ -178,89 +72,6 @@ function convertToDecimal() {
}
}
-function toggleOpt(name) {
- player[name] = !player[name]
- if (name == "hqTree") changeTreeQuality()
-}
-
-function changeTreeQuality() {
- var on = player.hqTree
- document.body.style.setProperty('--hqProperty1', on ? "2px solid" : "4px solid")
- document.body.style.setProperty('--hqProperty2a', on ? "-4px -4px 4px rgba(0, 0, 0, 0.25) inset" : "-4px -4px 4px rgba(0, 0, 0, 0) inset")
- document.body.style.setProperty('--hqProperty2b', on ? "0px 0px 20px var(--background)" : "")
- document.body.style.setProperty('--hqProperty3', on ? "2px 2px 4px rgba(0, 0, 0, 0.25)" : "none")
-}
-
-function exponentialFormat(num, precision) {
- let e = num.log10().floor()
- let m = num.div(Decimal.pow(10, e))
- return m.toStringWithDecimalPlaces(3)+"e"+e.toStringWithDecimalPlaces(0)
-}
-
-function commaFormat(num, precision) {
- if (num === null || num === undefined) return "NaN"
- if (num.mag < 0.001) return (0).toFixed(precision)
- return num.toStringWithDecimalPlaces(precision).replace(/\B(?=(\d{3})+(?!\d))/g, ",")
-}
-
-function fixValue(x, y = 0) {
- return x || new Decimal(y)
-}
-
-function sumValues(x) {
- x = Object.values(x)
- if (!x[0]) return new Decimal(0)
- return x.reduce((a, b) => Decimal.add(a, b))
-}
-
-function format(decimal, precision=2) {
- decimal = new Decimal(decimal)
- if (isNaN(decimal.sign)||isNaN(decimal.layer)||isNaN(decimal.mag)) {
- player.hasNaN = true;
- return "NaN"
- }
- if (decimal.sign<0) return "-"+format(decimal.neg(), precision)
- if (decimal.mag == Number.POSITIVE_INFINITY) return "Infinity"
- if (decimal.gte("eeee1000")) {
- var slog = decimal.slog()
- if (slog.gte(1e6)) return "F" + format(slog.floor())
- else return Decimal.pow(10, slog.sub(slog.floor())).toStringWithDecimalPlaces(3) + "F" + commaFormat(slog.floor(), 0)
- } else if (decimal.gte("1e1000")) return (Math.floor(decimal.mantissa + 0.01) + ("e"+formatWhole(decimal.log10())))
- else if (decimal.gte(1e9)) return exponentialFormat(decimal, precision)
- else if (decimal.gte(1e3)) return commaFormat(decimal, 0)
- else return commaFormat(decimal, precision)
-}
-
-function formatWhole(decimal) {
- return format(decimal, 0)
-}
-
-function formatTime(s) {
- if (s<60) return format(s)+"s"
- else if (s<3600) return formatWhole(Math.floor(s/60))+"m "+format(s%60)+"s"
- else return formatWhole(Math.floor(s/3600))+"h "+formatWhole(Math.floor(s/60)%60)+"m "+format(s%60)+"s"
-}
-
-var onTreeTab = true
-function showTab(name) {
- if (LAYERS.includes(name) && !layerUnl(name)) return
-
- var toTreeTab = name == "tree"
- player.tab = name
-
- if (toTreeTab != onTreeTab) {
- document.getElementById("treeTab").className = toTreeTab ? "fullWidth" : "col left"
- onTreeTab = toTreeTab
- resizeCanvas()
- }
- delete player.notify[name]
-}
-
-function notifyLayer(name) {
- if (player.tab == name || !layerUnl(name)) return
- player.notify[name] = 1
-}
-
function getResetGain(layer) {
if (tmp.gainExp[layer].eq(0)) return new Decimal(0)
if (layers[layer].type=="static") {
@@ -292,20 +103,6 @@ function getNextAt(layer) {
}
}
-function nodeShown(layer) {
- if (tmp.layerShown[layer]) return true
- switch(layer) {
- case "idk":
- return player.l.unl
- break;
- }
- return false
-}
-
-function layerUnl(layer) {
- return LAYERS.includes(layer) && (player[layer].unl || (tmp.layerAmt[layer].gte(tmp.layerReqs[layer]) && layers[layer].layerShown()))
-}
-
function rowReset(row, layer) {
for (lr in ROW_LAYERS[row]){
if(layers[lr].doReset)
@@ -350,6 +147,7 @@ function generatePoints(layer, diff) {
}
var prevOnReset
+
function doReset(layer, force=false) {
let row = layers[layer].row
if (!force) {
@@ -489,12 +287,6 @@ function resetRow(row) {
resizeCanvas();
}
-
-function toggleAuto(toggle) {
- player[toggle[0]][toggle[1]] = !player[toggle[0]][toggle[1]]
-}
-
-
function startChall(layer, x) {
if (!player[layer].unl) return
if (player[layer].active == x) {
@@ -542,82 +334,12 @@ function completeChall(layer, x) {
updateChallTemp(layer)
}
-function adjustMSDisp() {
- let displays = ["always", "automation", "incomplete", "never"];
- player.msDisplay = displays[(displays.indexOf(player.msDisplay)+1)%4]
-}
-
-function milestoneShown(layer, id) {
- complete = player[layer].milestones.includes(id)
- auto = layers[layer].milestones[id].toggles
-
- switch(player.msDisplay) {
- case "always":
- return true;
- break;
- case "automation":
- return (auto)||!complete
- break;
- case "incomplete":
- return !complete
- break;
- case "never":
- return false;
- break;
- }
- return false;
-}
-
-
-
VERSION.withoutName = "v" + VERSION.num + (VERSION.pre ? " Pre-Release " + VERSION.pre : VERSION.pre ? " Beta " + VERSION.beta : "")
VERSION.withName = VERSION.withoutName + (VERSION.name ? ": " + VERSION.name : "")
const ENDGAME = new Decimal("e280000000");
-function keepGoing() {
- player.keepGoing = true;
- showTab("tree")
-}
-
-function toNumber(x) {
- if (x.mag !== undefined) return x.toNumber()
- if (x + 0 !== x) return parseFloat(x)
- return x
-}
-
-function updateMilestones(layer){
- for (id in layers[layer].milestones){
- if (!(player[layer].milestones.includes(id)) && layers[layer].milestones[id].done())
- player[layer].milestones.push(id)
- }
-}
-
-function addTime(diff, layer) {
- let data = player
- let time = data.timePlayed
- if (layer) {
- data = data[layer]
- time = data.time
- }
-
- //I am not that good to perfectly fix that leak. ~ DB Aarex
- if (time + 0 !== time) {
- console.log("Memory leak detected. Trying to fix...")
- time = toNumber(time)
- if (isNaN(time) || time == 0) {
- console.log("Couldn't fix! Resetting...")
- time = layer ? player.timePlayed : 0
- if (!layer) player.timePlayedReset = true
- }
- }
- time += toNumber(diff)
-
- if (layer) data.time = time
- else data.timePlayed = time
-}
-
function gameLoop(diff) {
if (player.points.gte(ENDGAME) || gameEnded) gameEnded = 1
@@ -658,13 +380,8 @@ function hardReset() {
window.location.reload();
}
-var saveInterval = setInterval(function() {
- if (player===undefined) return;
- if (gameEnded&&!player.keepGoing) return;
- if (player.autosave) save();
-}, 5000)
-
var ticking = false
+
var interval = setInterval(function() {
if (player===undefined||tmp===undefined) return;
if (ticking) return;
@@ -688,53 +405,3 @@ var interval = setInterval(function() {
gameLoop(diff)
ticking = false
}, 50)
-
-const themes = {
- 1: "aqua"
-}
-const theme_names = {
- aqua: "Aqua"
-}
-
-function changeTheme() {
- let aqua = player.theme == "aqua"
- colors_theme = colors[player.theme || "default"]
- document.body.style.setProperty('--background', aqua ? "#001f3f" : "#0f0f0f")
- document.body.style.setProperty('--background_tooltip', aqua ? "rgba(0, 15, 31, 0.75)" : "rgba(0, 0, 0, 0.75)")
- document.body.style.setProperty('--color', aqua ? "#bfdfff" : "#dfdfdf")
- document.body.style.setProperty('--points', aqua ? "#dfefff" : "#ffffff")
-}
-
-function getThemeName() {
- return player.theme ? theme_names[player.theme] : "Default"
-}
-
-function switchTheme() {
- if (player.theme === undefined) player.theme = themes[1]
- else {
- player.theme = themes[Object.keys(themes)[player.theme] + 1]
- if (!player.theme) delete player.theme
- }
- changeTheme()
- resizeCanvas()
-}
-
-document.onkeydown = function(e) {
- if (player===undefined) return;
- if (gameEnded&&!player.keepGoing) return;
- let shiftDown = e.shiftKey
- let ctrlDown = e.ctrlKey
- let key = e.key
- if (ctrlDown) key = "ctrl+" + key
- if (onFocused) return
- if (ctrlDown && key != "-" && key != "_" && key != "+" && key != "=" && key != "r" && key != "R" && key != "F5") e.preventDefault()
- if(hotkeys[key]){
- if (player[hotkeys[key].layer].unl)
- hotkeys[key].onPress()
- }
-}
-
-var onFocused = false
-function focused(x) {
- onFocused = x
-}
\ No newline at end of file
diff --git a/js/utils.js b/js/utils.js
new file mode 100644
index 0000000..166f599
--- /dev/null
+++ b/js/utils.js
@@ -0,0 +1,339 @@
+// ************ Number formatting ************
+
+function exponentialFormat(num, precision) {
+ let e = num.log10().floor()
+ let m = num.div(Decimal.pow(10, e))
+ return m.toStringWithDecimalPlaces(3)+"e"+e.toStringWithDecimalPlaces(0)
+}
+
+function commaFormat(num, precision) {
+ if (num === null || num === undefined) return "NaN"
+ if (num.mag < 0.001) return (0).toFixed(precision)
+ return num.toStringWithDecimalPlaces(precision).replace(/\B(?=(\d{3})+(?!\d))/g, ",")
+}
+
+function fixValue(x, y = 0) {
+ return x || new Decimal(y)
+}
+
+function sumValues(x) {
+ x = Object.values(x)
+ if (!x[0]) return new Decimal(0)
+ return x.reduce((a, b) => Decimal.add(a, b))
+}
+
+function format(decimal, precision=2) {
+ decimal = new Decimal(decimal)
+ if (isNaN(decimal.sign)||isNaN(decimal.layer)||isNaN(decimal.mag)) {
+ player.hasNaN = true;
+ return "NaN"
+ }
+ if (decimal.sign<0) return "-"+format(decimal.neg(), precision)
+ if (decimal.mag == Number.POSITIVE_INFINITY) return "Infinity"
+ if (decimal.gte("eeee1000")) {
+ var slog = decimal.slog()
+ if (slog.gte(1e6)) return "F" + format(slog.floor())
+ else return Decimal.pow(10, slog.sub(slog.floor())).toStringWithDecimalPlaces(3) + "F" + commaFormat(slog.floor(), 0)
+ } else if (decimal.gte("1e1000")) return (Math.floor(decimal.mantissa + 0.01) + ("e"+formatWhole(decimal.log10())))
+ else if (decimal.gte(1e9)) return exponentialFormat(decimal, precision)
+ else if (decimal.gte(1e3)) return commaFormat(decimal, 0)
+ else return commaFormat(decimal, precision)
+}
+
+function formatWhole(decimal) {
+ return format(decimal, 0)
+}
+
+function formatTime(s) {
+ if (s<60) return format(s)+"s"
+ else if (s<3600) return formatWhole(Math.floor(s/60))+"m "+format(s%60)+"s"
+ else return formatWhole(Math.floor(s/3600))+"h "+formatWhole(Math.floor(s/60)%60)+"m "+format(s%60)+"s"
+}
+
+// ************ Save stuff ************
+
+function save() {
+ localStorage.setItem(modInfo.id, btoa(JSON.stringify(player)))
+}
+
+function fixSave() {
+ defaultData = startPlayerBase()
+ for (datum in defaultData){
+ if (player[datum] == undefined){
+ player[datum] = defaultData[datum]
+ }
+ }
+ for (layer in layers) {
+ defaultData = layers[layer].startData()
+ if (player[layer].upgrades == undefined)
+ player[layer].upgrades = []
+ if (player[layer].milestones == undefined)
+ player[layer].milestones = []
+ if (player[layer].challs == undefined)
+ player[layer].challs = []
+
+ for (datum in defaultData){
+ if (player[layer][datum] == undefined){
+ player[layer][datum] = defaultData[datum]
+ }
+ }
+
+ if (player[layer].spentOnBuyables == undefined)
+ player[layer].spentOnBuyables = new Decimal(0)
+
+ if (layers[layer].buyables) {
+ if (player[layer].buyables == undefined) player[layer].buyables = {}
+
+ for (id in layers[layer].buyables){
+ if (player[layer].buyables[id] == undefined && !isNaN(id))
+ player[layer].buyables[id] = new Decimal(0)
+ }
+ }
+ }
+}
+
+function load() {
+ let get = localStorage.getItem(modInfo.id);
+ if (get===null || get===undefined) player = getStartPlayer()
+ else player = Object.assign(getStartPlayer(), JSON.parse(atob(get)))
+ fixSave()
+
+ player.tab = "tree"
+ if (player.offlineProd) {
+ if (player.offTime === undefined) player.offTime = { remain: 0 }
+ player.offTime.remain += (Date.now() - player.time) / 1000
+ }
+ player.time = Date.now();
+ convertToDecimal();
+ versionCheck();
+ changeTheme();
+ changeTreeQuality();
+ updateTemp();
+ updateTemp();
+ loadVue();
+}
+
+function exportSave() {
+ let str = btoa(JSON.stringify(player))
+
+ const el = document.createElement("textarea");
+ el.value = str;
+ document.body.appendChild(el);
+ el.select();
+ el.setSelectionRange(0, 99999);
+ document.execCommand("copy");
+ document.body.removeChild(el);
+}
+
+function importSave(imported=undefined, forced=false) {
+ if (imported===undefined) imported = prompt("Paste your save here")
+ try {
+ tempPlr = Object.assign(getStartPlayer(), JSON.parse(atob(imported)))
+ if(tempPlr.versionType != modInfo.id && !forced) // Wrong save (use "Forced" to force it to accept.)
+ return
+ player = tempPlr;
+ player.versionType = modInfo.id
+ fixSave()
+ save()
+ window.location.reload()
+ } catch(e) {
+ return;
+ }
+}
+
+function versionCheck() {
+ let setVersion = true
+
+ if (player.versionType===undefined||player.version===undefined) {
+ player.versionType = "Modding"
+ player.version = 0
+ }
+
+ if (setVersion) {
+ if (player.versionType == "Modding" && VERSION.num > player.version) player.keepGoing = false
+ player.versionType = getStartPlayer().versionType
+ player.version = VERSION.num
+ player.beta = VERSION.beta
+ }
+}
+
+var saveInterval = setInterval(function() {
+ if (player===undefined) return;
+ if (gameEnded&&!player.keepGoing) return;
+ if (player.autosave) save();
+}, 5000)
+
+// ************ Themes ************
+
+const themes = {
+ 1: "aqua"
+}
+const theme_names = {
+ aqua: "Aqua"
+}
+
+function changeTheme() {
+ let aqua = player.theme == "aqua"
+ colors_theme = colors[player.theme || "default"]
+ document.body.style.setProperty('--background', aqua ? "#001f3f" : "#0f0f0f")
+ document.body.style.setProperty('--background_tooltip', aqua ? "rgba(0, 15, 31, 0.75)" : "rgba(0, 0, 0, 0.75)")
+ document.body.style.setProperty('--color', aqua ? "#bfdfff" : "#dfdfdf")
+ document.body.style.setProperty('--points', aqua ? "#dfefff" : "#ffffff")
+}
+
+function getThemeName() {
+ return player.theme ? theme_names[player.theme] : "Default"
+}
+
+function switchTheme() {
+ if (player.theme === undefined) player.theme = themes[1]
+ else {
+ player.theme = themes[Object.keys(themes)[player.theme] + 1]
+ if (!player.theme) delete player.theme
+ }
+ changeTheme()
+ resizeCanvas()
+}
+
+// ************ Options ************
+
+function toggleOpt(name) {
+ player[name] = !player[name]
+ if (name == "hqTree") changeTreeQuality()
+}
+
+function changeTreeQuality() {
+ var on = player.hqTree
+ document.body.style.setProperty('--hqProperty1', on ? "2px solid" : "4px solid")
+ document.body.style.setProperty('--hqProperty2a', on ? "-4px -4px 4px rgba(0, 0, 0, 0.25) inset" : "-4px -4px 4px rgba(0, 0, 0, 0) inset")
+ document.body.style.setProperty('--hqProperty2b', on ? "0px 0px 20px var(--background)" : "")
+ document.body.style.setProperty('--hqProperty3', on ? "2px 2px 4px rgba(0, 0, 0, 0.25)" : "none")
+}
+
+function toggleAuto(toggle) {
+ player[toggle[0]][toggle[1]] = !player[toggle[0]][toggle[1]]
+}
+
+function adjustMSDisp() {
+ let displays = ["always", "automation", "incomplete", "never"];
+ player.msDisplay = displays[(displays.indexOf(player.msDisplay)+1)%4]
+}
+
+function milestoneShown(layer, id) {
+ complete = player[layer].milestones.includes(id)
+ auto = layers[layer].milestones[id].toggles
+
+ switch(player.msDisplay) {
+ case "always":
+ return true;
+ break;
+ case "automation":
+ return (auto)||!complete
+ break;
+ case "incomplete":
+ return !complete
+ break;
+ case "never":
+ return false;
+ break;
+ }
+ return false;
+}
+
+// ************ Misc ************
+
+var onTreeTab = true
+function showTab(name) {
+ if (LAYERS.includes(name) && !layerUnl(name)) return
+
+ var toTreeTab = name == "tree"
+ player.tab = name
+
+ if (toTreeTab != onTreeTab) {
+ document.getElementById("treeTab").className = toTreeTab ? "fullWidth" : "col left"
+ onTreeTab = toTreeTab
+ resizeCanvas()
+ }
+ delete player.notify[name]
+}
+
+function notifyLayer(name) {
+ if (player.tab == name || !layerUnl(name)) return
+ player.notify[name] = 1
+}
+
+function nodeShown(layer) {
+ if (tmp.layerShown[layer]) return true
+ switch(layer) {
+ case "idk":
+ return player.l.unl
+ break;
+ }
+ return false
+}
+
+function layerUnl(layer) {
+ return LAYERS.includes(layer) && (player[layer].unl || (tmp.layerAmt[layer].gte(tmp.layerReqs[layer]) && layers[layer].layerShown()))
+}
+
+function keepGoing() {
+ player.keepGoing = true;
+ showTab("tree")
+}
+
+function toNumber(x) {
+ if (x.mag !== undefined) return x.toNumber()
+ if (x + 0 !== x) return parseFloat(x)
+ return x
+}
+
+function updateMilestones(layer){
+ for (id in layers[layer].milestones){
+ if (!(player[layer].milestones.includes(id)) && layers[layer].milestones[id].done())
+ player[layer].milestones.push(id)
+ }
+}
+
+function addTime(diff, layer) {
+ let data = player
+ let time = data.timePlayed
+ if (layer) {
+ data = data[layer]
+ time = data.time
+ }
+
+ //I am not that good to perfectly fix that leak. ~ DB Aarex
+ if (time + 0 !== time) {
+ console.log("Memory leak detected. Trying to fix...")
+ time = toNumber(time)
+ if (isNaN(time) || time == 0) {
+ console.log("Couldn't fix! Resetting...")
+ time = layer ? player.timePlayed : 0
+ if (!layer) player.timePlayedReset = true
+ }
+ }
+ time += toNumber(diff)
+
+ if (layer) data.time = time
+ else data.timePlayed = time
+}
+
+document.onkeydown = function(e) {
+ if (player===undefined) return;
+ if (gameEnded&&!player.keepGoing) return;
+ let shiftDown = e.shiftKey
+ let ctrlDown = e.ctrlKey
+ let key = e.key
+ if (ctrlDown) key = "ctrl+" + key
+ if (onFocused) return
+ if (ctrlDown && key != "-" && key != "_" && key != "+" && key != "=" && key != "r" && key != "R" && key != "F5") e.preventDefault()
+ if(hotkeys[key]){
+ if (player[hotkeys[key].layer].unl)
+ hotkeys[key].onPress()
+ }
+}
+
+var onFocused = false
+function focused(x) {
+ onFocused = x
+}
\ No newline at end of file