diff --git a/changelog.md b/changelog.md index 55909f8..efadcd1 100644 --- a/changelog.md +++ b/changelog.md @@ -1,8 +1,8 @@ #The Modding Tree changelog: ##v2.0 -Added Progress bars, which are highly customizable and can be horizontal or vertical. -Added clickables, a more generalized variant of buyables! +Added progress bars, which are highly customizable and can be horizontal or vertical! +Added clickables, a more generalized variant of buyables. Support for multiple completions of challenges. Added getter/setter functions for buyable amount and such Moved modInfo to game.js, added a spot for a Discord link, changelog link, and a separate mod version from the TMT version diff --git a/docs/!general-info.md b/docs/!general-info.md index 0b9507c..f5a7287 100644 --- a/docs/!general-info.md +++ b/docs/!general-info.md @@ -2,10 +2,12 @@ The main way to add content is through creating layers. You can either add a layer directly in the layers object in layersSupportjs, or declare it in another file and then do "`addLayer(layername, layerdata)`" (good for breaking things up into smaller files). The existing layers are just examples and can be freely deleted. -You can use those as references and a base for your own layers. +You can also use them as references and a base for your own layers. -**You will also need to add layer nodes to the tree in the HTML, look for where it says "Modify the tree in the table below!"** While you're there, you can also edit the modInfo at the top to change the name for your mod and some other settings. A unique modId will prevent your mod's saves from conflicting with other mods. +The first thing you need to do is to edit the modInfo at the top of game.js to set your modID (a string). A +unique modId will prevent your mod's saves from conflicting with other mods. + Most of the time, you won't need to dive deep into the code to create things, but you still can if you really want to. @@ -15,6 +17,10 @@ The Modding Tree uses break_eternity.js to store large values. This means that m and must be treated differently. For example, you have to use `new Decimal(x)` to create a Decimal value instead of a plain number, and perform operations on them by calling functions. e.g, instead of `x = x + y`, use `x = x.add(y)`. +Almost all values can be either a constant value, or a dynamic value. Dynamic values are defined by putting a function +that returns what the value should be at any given time. + +All display text can be basic HTML instead (But you can't use most Vue features there). ## Table of Contents: diff --git a/docs/custom-tab-layouts.md b/docs/custom-tab-layouts.md index 7106f37..b387dbb 100644 --- a/docs/custom-tab-layouts.md +++ b/docs/custom-tab-layouts.md @@ -25,6 +25,8 @@ These are the existing components, but you can create more in v.js: - display-text: Displays some text (can use basic HTML). The argument is the text to display. It can also be a function that returns updating text. +- raw-html: Displays some basic HTML, can also be a function. + - blank: Adds empty space. The default dimensions are 8px x 17px. The argument changes the dimensions. If it's a single value (e.g. "20px"), that determines the height. If you have a pair of arguments, the first is width and the second is height. diff --git a/docs/layer-features.md b/docs/layer-features.md index e57b557..1f098f4 100644 --- a/docs/layer-features.md +++ b/docs/layer-features.md @@ -145,9 +145,14 @@ Key: # Other features - doReset(resettingLayer): **optional**, is triggered when a layer on a row greater than or equal to this one does a reset. - If you use it, you can choose what to keep via milestones and such. - Without it, the default is to reset everything on the row, but only - if it was triggered by a layer in a higher row. + The default behavior is to reset everything on the row, but only if it was triggered by a layer in a higher row. + + If you want to keep things, determine what to keep based on the resettingLayer, milestones, and such, then call + resetLayerData(layer, keep), where layer is this layer, and keep is an array of the names of things to keep. + It can include things like "points", "best", "total" (for this layer's prestige currency), "upgrades", + any unique variables like "generatorPower", etc. + If you want to only keep specific upgrades or something like that, save them in a separate variable, then + call resetLayerData, and then set player[layer].upgrades to the saved upgrades. - update(diff): **optional**, this function is called every game tick. Use it for any passive resource production or time-based things. diff is the time since the last tick. diff --git a/js/game.js b/js/game.js index 4c953a4..b307809 100644 --- a/js/game.js +++ b/js/game.js @@ -14,11 +14,12 @@ let modInfo = { offlineLimit: 1 // In hours } +// Set your version in num and name, but leave the tmt values so people know what version it is let VERSION = { - num: "1.3.5 maybe", - name: "Tabception... ception!", - tmtNum: "1.3.5 maybe", - tmtName: "Tabception... ception!" + num: "2.0", + name: "Finally making some progress!", + tmtNum: "2.0", + tmtName: "Finally making some progress!" } // Determines if it should show points/sec @@ -120,26 +121,28 @@ function rowReset(row, layer) { layers[lr].doReset(layer) } else - if(layers[layer].row > layers[lr].row) fullLayerReset(lr) + if(layers[layer].row > layers[lr].row) layerDataReset(lr) } } -function fullLayerReset(layer) { +function layerDataReset(layer, keep = []) { + let storedData = {} + + for (thing in keep) { + if (player[layer][keep[thing]] !== undefined) + storedData[keep[thing]] = player[layer][keep[thing]] + } + console.log(storedData) + player[layer] = layers[layer].startData(); player[layer].upgrades = [] player[layer].milestones = [] player[layer].challenges = [] - if (layers[layer].tabFormat && !Array.isArray(layers[layer].tabFormat)) { - if (player.subtabs[layer] == undefined) player.subtabs[layer] = {} - if (player.subtabs[layer].mainTabs == undefined) player.subtabs[layer].mainTabs = Object.keys(layers[layer].tabFormat)[0] - } - - if (layers[layer].microtabs) { - if (player.subtabs[layer] == undefined) player.subtabs[layer] = {} - for (item in layers[layer].microtabs) - if (player.subtabs[layer][item] == undefined) player.subtabs[layer][item] = Object.keys(layers[layer].microtabs[item])[0] - } resetBuyables(layer) + + for (thing in storedData) { + player[layer][thing] =storedData[thing] + } } function resetBuyables(layer){ diff --git a/js/layers.js b/js/layers.js index 77b97f0..5df326c 100644 --- a/js/layers.js +++ b/js/layers.js @@ -175,7 +175,7 @@ addLayer("c", { }, }, doReset(resettingLayer){ // Triggers when this layer is being reset, along with the layer doing the resetting. Not triggered by lower layers resetting, but is by layers on the same row. - if(layers[resettingLayer].row > this.row) fullLayerReset(this.layer) // This is actually the default behavior + if(layers[resettingLayer].row > this.row) layerDataReset(this.layer, ["upgrades", "challenges"]) // This is actually the default behavior }, layerShown() {return true}, // Condition for when layer appears on the tree automate() { diff --git a/js/utils.js b/js/utils.js index 81fdc50..201f9dd 100644 --- a/js/utils.js +++ b/js/utils.js @@ -587,7 +587,7 @@ function focused(x) { function prestigeButtonText(layer) { if(tmp[layer].type == "normal") - return `${ player[layer].points.lt(1e3) ? (tmp[layer].resetDescription !== undefined ? tmp[layer].resetDescription : "Reset for ") : ""}+${formatWhole(tmp[layer].resetGain)} ${tmp[layer].resource} ${tmp[layer].resetGain.lt(100) && player[layer].points.lt(1e3) ? `

Next at ${ (tmp[layer].roundUpCost ? formatWhole(tmp[layer].nextAt) : format(tmp[layer].nextAt))}` : ""} ${ tmp[layer].baseResource }` + return `${ player[layer].points.lt(1e3) ? (tmp[layer].resetDescription !== undefined ? tmp[layer].resetDescription : "Reset for ") : ""}+${formatWhole(tmp[layer].resetGain)} ${tmp[layer].resource} ${tmp[layer].resetGain.lt(100) && player[layer].points.lt(1e3) ? `

Next at ${ (tmp[layer].roundUpCost ? formatWhole(tmp[layer].nextAt) : format(tmp[layer].nextAt))} ${ tmp[layer].baseResource }` : ""}` else if(tmp[layer].type== "static") return `${tmp[layer].resetDescription !== undefined ? tmp[layer].resetDescription : "Reset for "}+${formatWhole(tmp[layer].resetGain)} ${tmp[layer].resource}

${player[layer].points.lt(20) ? (tmp[layer].baseAmount.gte(tmp[layer].nextAt)&&(tmp[layer].canBuyMax !== undefined) && tmp[layer].canBuyMax?"Next":"Req") : ""}: ${formatWhole(tmp[layer].baseAmount)} / ${(tmp[layer].roundUpCost ? formatWhole(tmp[layer].nextAtDisp) : format(tmp[layer].nextAtDisp))} ${ tmp[layer].baseResource } `