1
0
Fork 0
mirror of https://github.com/Acamaeda/The-Modding-Tree.git synced 2024-11-24 17:31:50 +00:00
This commit is contained in:
Acamaeda 2020-11-29 16:28:24 -05:00
parent 977643f5f6
commit 324e868430
9 changed files with 83 additions and 46 deletions

View file

@ -1,5 +1,9 @@
# The Modding Tree changelog: # 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 ### v2.2.4 - 11/28/20
- Added softcap and softcapPower features (for Normal layers) - 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) - Offline time limit and default max tick length were fixed (previously the limits were 1000x too large)

View file

@ -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. - 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. - 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. - 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. - 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`) - 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

View file

@ -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. - 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. - 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. - 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). - 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. - 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`) - 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

View file

@ -119,11 +119,6 @@ addLayer("c", {
effectDisplay() { return format(this.effect())+"x" }, // Add formatting to the effect effectDisplay() { return format(this.effect())+"x" }, // Add formatting to the effect
}, },
13: { 13: {
description: "Unlock a <b>secret subtab</b> 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))}, unlocked() { return (hasUpgrade(this.layer, 12))},
onPurchase() { // This function triggers when the upgrade is purchased onPurchase() { // This function triggers when the upgrade is purchased
player[this.layer].unlockOrder = 0 player[this.layer].unlockOrder = 0
@ -138,6 +133,9 @@ addLayer("c", {
} }
} // Otherwise use the default } // 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: { 22: {
title: "This upgrade doesn't exist", title: "This upgrade doesn't exist",

View file

@ -12,7 +12,7 @@ let modInfo = {
// Set your version in num and name // Set your version in num and name
let VERSION = { let VERSION = {
num: "2.2.4", num: "2.2.5",
name: "Uprooted", name: "Uprooted",
} }

View file

@ -153,11 +153,14 @@ function loadVue() {
template: ` template: `
<button v-if="tmp[layer].upgrades && tmp[layer].upgrades[data]!== undefined && tmp[layer].upgrades[data].unlocked" v-on:click="buyUpg(layer, data)" v-bind:class="{ [layer]: true, upg: true, bought: hasUpgrade(layer, data), locked: (!(canAffordUpgrade(layer, data))&&!hasUpgrade(layer, data)), can: (canAffordUpgrade(layer, data)&&!hasUpgrade(layer, data))}" <button v-if="tmp[layer].upgrades && tmp[layer].upgrades[data]!== undefined && tmp[layer].upgrades[data].unlocked" v-on:click="buyUpg(layer, data)" v-bind:class="{ [layer]: true, upg: true, bought: hasUpgrade(layer, data), locked: (!(canAffordUpgrade(layer, data))&&!hasUpgrade(layer, data)), can: (canAffordUpgrade(layer, data)&&!hasUpgrade(layer, data))}"
v-bind:style="[((!hasUpgrade(layer, data) && canAffordUpgrade(layer, data)) ? {'background-color': tmp[layer].color} : {}), tmp[layer].upgrades[data].style]"> v-bind:style="[((!hasUpgrade(layer, data) && canAffordUpgrade(layer, data)) ? {'background-color': tmp[layer].color} : {}), tmp[layer].upgrades[data].style]">
<span v-if= "tmp[layer].upgrades[data].title"><h3 v-html="tmp[layer].upgrades[data].title"></h3><br></span> <span v-if="tmp[layer].upgrades[data].fullDisplay" v-html="tmp[layer].upgrades[data].fullDisplay"></span>
<span v-html="tmp[layer].upgrades[data].description"></span> <span v-else>
<span v-if="tmp[layer].upgrades[data].effectDisplay"><br>Currently: <span v-html="tmp[layer].upgrades[data].effectDisplay"></span></span> <span v-if= "tmp[layer].upgrades[data].title"><h3 v-html="tmp[layer].upgrades[data].title"></h3><br></span>
<br><br>Cost: {{ formatWhole(tmp[layer].upgrades[data].cost) }} {{(tmp[layer].upgrades[data].currencyDisplayName ? tmp[layer].upgrades[data].currencyDisplayName : tmp[layer].resource)}} <span v-html="tmp[layer].upgrades[data].description"></span>
</button> <span v-if="tmp[layer].upgrades[data].effectDisplay"><br>Currently: <span v-html="tmp[layer].upgrades[data].effectDisplay"></span></span>
<br><br>Cost: {{ formatWhole(tmp[layer].upgrades[data].cost) }} {{(tmp[layer].upgrades[data].currencyDisplayName ? tmp[layer].upgrades[data].currencyDisplayName : tmp[layer].resource)}}
</span>
</button>
` `
}) })

View file

@ -4,7 +4,7 @@ var gameEnded = false;
// Don't change this // Don't change this
const TMT_VERSION = { const TMT_VERSION = {
tmtNum: "2.2.4", tmtNum: "2.2.5",
tmtName: "Uprooted" tmtName: "Uprooted"
} }
@ -111,7 +111,7 @@ function layerDataReset(layer, keep = []) {
storedData[keep[thing]] = player[layer][keep[thing]] storedData[keep[thing]] = player[layer][keep[thing]]
} }
layOver(player[layer], layers[layer].startData()); layOver(player[layer], getStartLayerData(layer))
player[layer].upgrades = [] player[layer].upgrades = []
player[layer].milestones = [] player[layer].milestones = []
player[layer].challenges = getStartChallenges(layer) player[layer].challenges = getStartChallenges(layer)
@ -230,8 +230,8 @@ function startChallenge(layer, x) {
function canCompleteChallenge(layer, x) function canCompleteChallenge(layer, x)
{ {
if (x != player[layer].activeChallenge) return if (x != player[layer].activeChallenge) return
let challenge = tmp[layer].challenges[x] let challenge = tmp[layer].challenges[x]
if (challenge.canComplete !== undefined) return challenge.canComplete
if (challenge.currencyInternalName){ if (challenge.currencyInternalName){
let name = challenge.currencyInternalName let name = challenge.currencyInternalName

View file

@ -5,7 +5,7 @@ var NaNalert = false;
var activeFunctions = [ var activeFunctions = [
"startData", "onPrestige", "doReset", "update", "automate", "startData", "onPrestige", "doReset", "update", "automate",
"buy", "buyMax", "respec", "onComplete", "onPurchase", "onPress", "onClick", "masterButtonPress", "buy", "buyMax", "respec", "onComplete", "onPurchase", "onPress", "onClick", "masterButtonPress",
"sellOne", "sellAll", "sellOne", "sellAll", "pay",
] ]
var noCall = doNotCallTheseFunctionsEveryTick var noCall = doNotCallTheseFunctionsEveryTick

View file

@ -115,17 +115,8 @@ function getStartPlayer() {
playerdata.infoboxes = {} playerdata.infoboxes = {}
for (layer in layers){ for (layer in layers){
playerdata[layer] = {} playerdata[layer] = getStartLayerData(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)
if (layers[layer].tabFormat && !Array.isArray(layers[layer].tabFormat)) { if (layers[layer].tabFormat && !Array.isArray(layers[layer].tabFormat)) {
playerdata.subtabs[layer] = {} playerdata.subtabs[layer] = {}
playerdata.subtabs[layer].mainTabs = Object.keys(layers[layer].tabFormat)[0] playerdata.subtabs[layer].mainTabs = Object.keys(layers[layer].tabFormat)[0]
@ -140,10 +131,30 @@ function getStartPlayer() {
for (item in layers[layer].infoboxes) for (item in layers[layer].infoboxes)
playerdata.infoboxes[layer][item] = false playerdata.infoboxes[layer][item] = false
} }
} }
return playerdata 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){ function getStartBuyables(layer){
let data = {} let data = {}
@ -159,7 +170,6 @@ function getStartClickables(layer){
let data = {} let data = {}
if (layers[layer].clickables) { if (layers[layer].clickables) {
if (isPlainObject(layers[layer].clickables[id])) if (isPlainObject(layers[layer].clickables[id]))
if (isPlainObject(id))
data[id] = "" data[id] = ""
} }
return data return data
@ -439,6 +449,7 @@ function respecBuyables(layer) {
function canAffordUpgrade(layer, id) { function canAffordUpgrade(layer, id) {
let upg = tmp[layer].upgrades[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 let cost = tmp[layer].upgrades[id].cost
return canAffordPurchase(layer, upg, cost) return canAffordPurchase(layer, upg, cost)
} }
@ -528,32 +539,39 @@ function buyUpgrade(layer, id) {
} }
function buyUpg(layer, id) { function buyUpg(layer, id) {
let upg = tmp[layer].upgrades[id]
if (!player[layer].unlocked) return if (!player[layer].unlocked) return
if (!tmp[layer].upgrades[id].unlocked) return if (!tmp[layer].upgrades[id].unlocked) return
if (player[layer].upgrades.includes(id)) return if (player[layer].upgrades.includes(id)) return
let upg = tmp[layer].upgrades[id] if (upg.canAfford === false) return
let cost = tmp[layer].upgrades[id].cost let pay = layers[layer].upgrades[id].pay
if (pay !== undefined)
pay()
else
{
let cost = tmp[layer].upgrades[id].cost
if (upg.currencyInternalName){ if (upg.currencyInternalName){
let name = upg.currencyInternalName let name = upg.currencyInternalName
if (upg.currencyLocation){ if (upg.currencyLocation){
if (upg.currencyLocation[name].lt(cost)) return if (upg.currencyLocation[name].lt(cost)) return
upg.currencyLocation[name] = upg.currencyLocation[name].sub(cost) upg.currencyLocation[name] = upg.currencyLocation[name].sub(cost)
} }
else if (upg.currencyLayer){ else if (upg.currencyLayer){
let lr = upg.currencyLayer let lr = upg.currencyLayer
if (player[lr][name].lt(cost)) return if (player[lr][name].lt(cost)) return
player[lr][name] = player[lr][name].sub(cost) player[lr][name] = player[lr][name].sub(cost)
}
else {
if (player[name].lt(cost)) return
player[name] = player[name].sub(cost)
}
} }
else { else {
if (player[name].lt(cost)) return if (player[layer].points.lt(cost)) return
player[name] = player[name].sub(cost) 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); player[layer].upgrades.push(id);
if (upg.onPurchase != undefined) if (upg.onPurchase != undefined)
upg.onPurchase() upg.onPurchase()