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()