diff --git a/changelog.md b/changelog.md
index a6c6478..58831ff 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,9 @@
# The Modding Tree changelog:
+- Added fullDisplay feature to upgrades and challenges, overrides other displays and lets you set the full text.
+- best, total, and unlocked are always automatically added to layerData (but best and total will only display if you add them yourself).
+- Fixed getStartClickables.
+
### v2.2.4 - 11/28/20
- Added softcap and softcapPower features (for Normal layers)
- Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)
diff --git a/docs/challenges.md b/docs/challenges.md
index c2cd17f..dea9333 100644
--- a/docs/challenges.md
+++ b/docs/challenges.md
@@ -37,6 +37,8 @@ Individual Challenges can have these features:
- rewardDisplay(): **optional**. A function that returns a display of the current effects of the reward with formatting. Default behavior is to just display the a number appropriately formatted.
+- fullDisplay(): **OVERRIDE**. Overrides the other displays and descriptions, and lets you set the full text for the challenge. Can use basic HTML.
+
- goal: A Decimal for the amount of currency required to beat the challenge. By default, the goal is in basic Points. The goal can also be a function if its value changes.
- unlocked(): **optional**. A function returning a bool to determine if the challenge is visible or not. Default is unlocked.
@@ -62,3 +64,7 @@ By default, challenges use basic Points for the goal. You can change that using
- currencyLayer: **optional**. the internal name of the layer that currency is stored in. If it's not in a layer, omit. If it's not stored directly in a layer, instead use the next feature.
- currencyLocation: **optional**. if your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like `player[this.layer].buyables`)
+
+You can also set a fully custom win condition that overrides other goal-related features (use fullDisplay along with this)
+
+- canComplete(): **OVERRIDE**, returns true if you can complete the challenge
\ No newline at end of file
diff --git a/docs/upgrades.md b/docs/upgrades.md
index ba4c2b7..06b59f9 100644
--- a/docs/upgrades.md
+++ b/docs/upgrades.md
@@ -35,11 +35,13 @@ Individual upgrades can have these features:
- effectDisplay(): **optional**. A function that returns a display of the current effects of the upgrade with formatting. Default displays nothing. Can use basic HTML.
+- fullDisplay(): **OVERRIDE**. Overrides the other displays and descriptions, and lets you set the full text for the upgrade. Can use basic HTML.
+
- cost: A Decimal for the cost of the upgrade. By default, upgrades cost the main prestige currency for the layer.
- unlocked(): **optional**. A function returning a bool to determine if the upgrade is visible or not. Default is unlocked.
-- onPurchase() - **optional**. This function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".
+- onPurchase(): **optional**. This function will be called when the upgrade is purchased. Good for upgrades like "makes this layer act like it was unlocked first".
- style: **optional**. Applies CSS to this upgrade, in the form of an object where the keys are CSS attributes, and the values are the values for those attributes (both as strings).
@@ -56,3 +58,9 @@ By default, upgrades use the main prestige currency for the layer. You can inclu
- currencyLayer: **optional**. The internal name of the layer that currency is stored in. If it's not in a layer (like Points), omit. If it's not stored directly in a layer, instead use the next feature.
- currencyLocation: **optional**. If your currency is stored in something inside a layer (e.g. a buyable's amount), you can access it this way. This is a function returning the object in "player" that contains the value (like `player[this.layer].buyables`)
+
+If you want to do something more complicated like upgrades that cost two currencies, you can override the purchase system with these (and you need to use fullDisplay as well)
+
+-canAfford(): **OVERRIDE**, a function determining if you are able to buy the upgrade
+
+-pay(): **OVERRIDE**, a function that reduces your currencies when you buy the upgrade
\ No newline at end of file
diff --git a/js/Demo/demoLayers.js b/js/Demo/demoLayers.js
index 8088d76..f6e5b0d 100644
--- a/js/Demo/demoLayers.js
+++ b/js/Demo/demoLayers.js
@@ -119,11 +119,6 @@ addLayer("c", {
effectDisplay() { return format(this.effect())+"x" }, // Add formatting to the effect
},
13: {
- description: "Unlock a secret subtab and make this layer act if you unlocked it first.",
- cost: new Decimal(69),
- currencyDisplayName: "candies", // Use if using a nonstandard currency
- currencyInternalName: "points", // Use if using a nonstandard currency
- currencyLocation: "", // The object in player data that the currency is contained in
unlocked() { return (hasUpgrade(this.layer, 12))},
onPurchase() { // This function triggers when the upgrade is purchased
player[this.layer].unlockOrder = 0
@@ -138,6 +133,9 @@ addLayer("c", {
}
} // Otherwise use the default
},
+ canAfford(){return player.points.lte(7)},
+ pay(){player.points = player.points.add(7)},
+ fullDisplay: "Only buyable with less than 7 points, and gives you 7 more. Unlocks a secret subtab."
},
22: {
title: "This upgrade doesn't exist",
diff --git a/js/Demo/demoMod.js b/js/Demo/demoMod.js
index dbf11ec..4b83e5b 100644
--- a/js/Demo/demoMod.js
+++ b/js/Demo/demoMod.js
@@ -12,7 +12,7 @@ let modInfo = {
// Set your version in num and name
let VERSION = {
- num: "2.2.4",
+ num: "2.2.5",
name: "Uprooted",
}
diff --git a/js/components.js b/js/components.js
index ad03f75..4dfe3ce 100644
--- a/js/components.js
+++ b/js/components.js
@@ -153,11 +153,14 @@ function loadVue() {
template: `
+
+
+
+
+ Currently:
+
Cost: {{ formatWhole(tmp[layer].upgrades[data].cost) }} {{(tmp[layer].upgrades[data].currencyDisplayName ? tmp[layer].upgrades[data].currencyDisplayName : tmp[layer].resource)}}
+
+
`
})
diff --git a/js/game.js b/js/game.js
index af4057c..ecc997f 100644
--- a/js/game.js
+++ b/js/game.js
@@ -4,7 +4,7 @@ var gameEnded = false;
// Don't change this
const TMT_VERSION = {
- tmtNum: "2.2.4",
+ tmtNum: "2.2.5",
tmtName: "Uprooted"
}
@@ -111,7 +111,7 @@ function layerDataReset(layer, keep = []) {
storedData[keep[thing]] = player[layer][keep[thing]]
}
- layOver(player[layer], layers[layer].startData());
+ layOver(player[layer], getStartLayerData(layer))
player[layer].upgrades = []
player[layer].milestones = []
player[layer].challenges = getStartChallenges(layer)
@@ -230,8 +230,8 @@ function startChallenge(layer, x) {
function canCompleteChallenge(layer, x)
{
if (x != player[layer].activeChallenge) return
-
let challenge = tmp[layer].challenges[x]
+ if (challenge.canComplete !== undefined) return challenge.canComplete
if (challenge.currencyInternalName){
let name = challenge.currencyInternalName
diff --git a/js/technical/temp.js b/js/technical/temp.js
index b1d353d..c07b9de 100644
--- a/js/technical/temp.js
+++ b/js/technical/temp.js
@@ -5,7 +5,7 @@ var NaNalert = false;
var activeFunctions = [
"startData", "onPrestige", "doReset", "update", "automate",
"buy", "buyMax", "respec", "onComplete", "onPurchase", "onPress", "onClick", "masterButtonPress",
- "sellOne", "sellAll",
+ "sellOne", "sellAll", "pay",
]
var noCall = doNotCallTheseFunctionsEveryTick
diff --git a/js/utils.js b/js/utils.js
index f658c0f..7d44004 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -115,17 +115,8 @@ function getStartPlayer() {
playerdata.infoboxes = {}
for (layer in layers){
- playerdata[layer] = {}
- if (layers[layer].startData)
- playerdata[layer] = layers[layer].startData()
- else playerdata[layer].unlocked = true
- playerdata[layer].buyables = getStartBuyables(layer)
- if(playerdata[layer].clickables == undefined) playerdata[layer].clickables = getStartClickables(layer)
- playerdata[layer].spentOnBuyables = new Decimal(0)
- playerdata[layer].upgrades = []
- playerdata[layer].milestones = []
- playerdata[layer].achievements = []
- playerdata[layer].challenges = getStartChallenges(layer)
+ playerdata[layer] = getStartLayerData(layer)
+
if (layers[layer].tabFormat && !Array.isArray(layers[layer].tabFormat)) {
playerdata.subtabs[layer] = {}
playerdata.subtabs[layer].mainTabs = Object.keys(layers[layer].tabFormat)[0]
@@ -140,10 +131,30 @@ function getStartPlayer() {
for (item in layers[layer].infoboxes)
playerdata.infoboxes[layer][item] = false
}
+
}
return playerdata
}
+function getStartLayerData(layer){
+ layerdata = {}
+ if (layers[layer].startData)
+ layerdata = layers[layer].startData()
+
+ if (layerdata.unlocked === undefined) layerdata.unlocked = true
+ if (layerdata.total === undefined) layerdata.total = new Decimal(0)
+ if (layerdata.best === undefined) layerdata.best = new Decimal(0)
+
+ layerdata.buyables = getStartBuyables(layer)
+ if(layerdata.clickables == undefined) layerdata.clickables = getStartClickables(layer)
+ layerdata.spentOnBuyables = new Decimal(0)
+ layerdata.upgrades = []
+ layerdata.milestones = []
+ layerdata.achievements = []
+ layerdata.challenges = getStartChallenges(layer)
+ return layerdata
+}
+
function getStartBuyables(layer){
let data = {}
@@ -159,7 +170,6 @@ function getStartClickables(layer){
let data = {}
if (layers[layer].clickables) {
if (isPlainObject(layers[layer].clickables[id]))
- if (isPlainObject(id))
data[id] = ""
}
return data
@@ -439,6 +449,7 @@ function respecBuyables(layer) {
function canAffordUpgrade(layer, id) {
let upg = tmp[layer].upgrades[id]
+ if (tmp[layer].upgrades[id].canAfford !== undefined) return tmp[layer].upgrades[id].canAfford
let cost = tmp[layer].upgrades[id].cost
return canAffordPurchase(layer, upg, cost)
}
@@ -528,32 +539,39 @@ function buyUpgrade(layer, id) {
}
function buyUpg(layer, id) {
+ let upg = tmp[layer].upgrades[id]
if (!player[layer].unlocked) return
if (!tmp[layer].upgrades[id].unlocked) return
if (player[layer].upgrades.includes(id)) return
- let upg = tmp[layer].upgrades[id]
- let cost = tmp[layer].upgrades[id].cost
+ if (upg.canAfford === false) return
+ let pay = layers[layer].upgrades[id].pay
+ if (pay !== undefined)
+ pay()
+ else
+ {
+ let cost = tmp[layer].upgrades[id].cost
- if (upg.currencyInternalName){
- let name = upg.currencyInternalName
- if (upg.currencyLocation){
- if (upg.currencyLocation[name].lt(cost)) return
- upg.currencyLocation[name] = upg.currencyLocation[name].sub(cost)
- }
- else if (upg.currencyLayer){
- let lr = upg.currencyLayer
- if (player[lr][name].lt(cost)) return
- player[lr][name] = player[lr][name].sub(cost)
+ if (upg.currencyInternalName){
+ let name = upg.currencyInternalName
+ if (upg.currencyLocation){
+ if (upg.currencyLocation[name].lt(cost)) return
+ upg.currencyLocation[name] = upg.currencyLocation[name].sub(cost)
+ }
+ else if (upg.currencyLayer){
+ let lr = upg.currencyLayer
+ if (player[lr][name].lt(cost)) return
+ player[lr][name] = player[lr][name].sub(cost)
+ }
+ else {
+ if (player[name].lt(cost)) return
+ player[name] = player[name].sub(cost)
+ }
}
else {
- if (player[name].lt(cost)) return
- player[name] = player[name].sub(cost)
+ if (player[layer].points.lt(cost)) return
+ player[layer].points = player[layer].points.sub(cost)
}
}
- else {
- if (player[layer].points.lt(cost)) return
- player[layer].points = player[layer].points.sub(cost)
- }
player[layer].upgrades.push(id);
if (upg.onPurchase != undefined)
upg.onPurchase()