Module:BATTD costs: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 11: | Line 11: | ||
local upgradesById = {} -- key:value table - upgrade:upgrade data | local upgradesById = {} -- key:value table - upgrade:upgrade data | ||
local upgradeLocksById = {} -- key:values table - upgrades:upgrades that this upgrade locks | |||
local upgradePrereqsById = {} -- key:values table - upgrade:prerequisites to purchase this upgrade | local upgradePrereqsById = {} -- key:values table - upgrade:prerequisites to purchase this upgrade | ||
local upgradePrereqsOfById = { | local upgradePrereqsOfById = { -- key:values table - upgrades:upgrades this is a prerequisite of | ||
root = {} | |||
} | |||
local alreadyPurchasedUpgrades = { | local alreadyPurchasedUpgrades = { -- this upgrade and all upgrades the player has to have already purchased to get it | ||
root = true | |||
} | |||
-- cargo queries for data | -- cargo queries for data | ||
| Line 35: | Line 38: | ||
upgradesById[upgrade.id] = upgrade | upgradesById[upgrade.id] = upgrade | ||
if upgrade.name == upgradeName then upgradeId = upgrade.id end | if upgrade.name == upgradeName then upgradeId = upgrade.id end | ||
end | |||
-- build upgradePrereqsById, upgradePrereqsOfById | |||
for i, upgrade in ipairs(upgradePrereqs) do | |||
-- upgrade:next table | |||
if upgrade.prevId then | |||
if upgradePrereqsOfById[upgrade.prevId] then | |||
upgradePrereqsOfById[upgrade.prevId][#upgradePrereqsOfById[upgrade.prevId]+1] = upgrade.thisId | |||
else | |||
upgradePrereqsOfById[upgrade.prevId] = {upgrade.thisId} | |||
end | |||
else | |||
-- if this upgrade is a root upgrade and is not already purchased | |||
upgradePrereqsOfById["root"][#upgradePrereqsOfById["root"]+1] = upgrade.thisId | |||
end | |||
-- upgrade:prev table | |||
if upgradePrereqsById[upgrade.thisId] then | |||
upgradePrereqsById[upgrade.thisId][#upgradePrereqsById[upgrade.thisId]+1] = upgrade.prevId | |||
else | |||
upgradePrereqsById[upgrade.thisId] = {upgrade.prevId} | |||
end | |||
end | end | ||
| Line 65: | Line 90: | ||
-- generate table header | -- generate table header | ||
local row = {[[{|class="wikitable sortable" style="text-align:center" | local row = {[[{|class="wikitable sortable" style="text-align:center"\n!Cost!!Sell value\n]]} | ||
!Cost!!Sell value]]} | |||
for i, upgrade in ipairs(upgrades) do | for i, upgrade in ipairs(upgrades) do | ||
| Line 105: | Line 103: | ||
outputTable[1] = tConcat(row) | outputTable[1] = tConcat(row) | ||
local function recursiveGetTotalCosts(currentCost, purchasedUpgrades) | |||
-- add row to outputTable | |||
row = {sFormat("\n|-\n|$%s", lang:formatNum(currentCost))} | |||
for i, upgrade in ipairs(upgrades) do | |||
if not alreadyPurchasedUpgrades[upgrade.id] then | |||
row[#row+1] = purchasedUpgrades[upgrade.id] and "||{{Y}}" or "||{{N}}" | |||
for i, | end | ||
row[ | |||
end | end | ||
outputTable[#outputTable+1] = tConcat(row, "\n") | outputTable[#outputTable+1] = tConcat(row, "\n") | ||
for | for thisUpgradeId, _ in pairs(purchasedUpgrades) do | ||
-- skip if this upgrade is a leaf | |||
if upgradePrereqsOfById[thisUpgradeId] then | |||
for _, nextUpgradeId in pairs(upgradePrereqsOfById[thisUpgradeId]) do | |||
if not purchasedUpgrades[nextUpgradeId] then | |||
local purchasedUpgradesNext = {} | |||
for p1, p2 in pairs(purchasedUpgrades) do purchasedUpgradesNext[p1] = p2 end | |||
purchasedUpgradesNext[nextUpgradeId] = true | |||
recursiveGetTotalCosts(currentCost + upgradesById[nextUpgradeId].cost, purchasedUpgradesNext) | |||
end | |||
end | |||
end | |||
end | end | ||
end | end | ||
recursiveGetTotalCosts(baseCost, alreadyPurchasedUpgrades) | |||
outputTable[#outputTable+1] = "\n|}" | outputTable[#outputTable+1] = "\n|}" | ||
Revision as of 01:15, 12 January 2026
Documentation for this module may be created at Module:BATTD costs/doc
local p = {}
local function upgrade(towerName, upgradeName)
local sFormat = string.format
local tConcat = table.concat
local query = mw.ext.cargo.query
local lang = mw.language.new("en")
local outputTable = {}
local upgradeId = ""
local upgradesById = {} -- key:value table - upgrade:upgrade data
local upgradeLocksById = {} -- key:values table - upgrades:upgrades that this upgrade locks
local upgradePrereqsById = {} -- key:values table - upgrade:prerequisites to purchase this upgrade
local upgradePrereqsOfById = { -- key:values table - upgrades:upgrades this is a prerequisite of
root = {}
}
local alreadyPurchasedUpgrades = { -- this upgrade and all upgrades the player has to have already purchased to get it
root = true
}
-- cargo queries for data
local upgrades, upgradePrereqs, upgradeLocks =
query("battd_upgrades", "_pageName, id, name, tower, cost", {
where=sFormat("tower='%s'", towerName)
}),
query("battd_upgrades=main, battd_upgrades__previous=prev", "main.id=thisId, prev._value=prevId", {
where=sFormat("main.tower='%s'", towerName),
join="main._ID=prev._RowID"
}),
query("battd_upgrades=main, battd_upgrades__locked_by_upgrades=lock", "main.id=thisId, lock._value=lockId", {
where=sFormat("main.tower='%s'", towerName),
join="main._ID=lock._RowID"
})
-- build upgradesById
for i, upgrade in ipairs(upgrades) do
upgradesById[upgrade.id] = upgrade
if upgrade.name == upgradeName then upgradeId = upgrade.id end
end
-- build upgradePrereqsById, upgradePrereqsOfById
for i, upgrade in ipairs(upgradePrereqs) do
-- upgrade:next table
if upgrade.prevId then
if upgradePrereqsOfById[upgrade.prevId] then
upgradePrereqsOfById[upgrade.prevId][#upgradePrereqsOfById[upgrade.prevId]+1] = upgrade.thisId
else
upgradePrereqsOfById[upgrade.prevId] = {upgrade.thisId}
end
else
-- if this upgrade is a root upgrade and is not already purchased
upgradePrereqsOfById["root"][#upgradePrereqsOfById["root"]+1] = upgrade.thisId
end
-- upgrade:prev table
if upgradePrereqsById[upgrade.thisId] then
upgradePrereqsById[upgrade.thisId][#upgradePrereqsById[upgrade.thisId]+1] = upgrade.prevId
else
upgradePrereqsById[upgrade.thisId] = {upgrade.prevId}
end
end
-- build alreadyPurchasedUpgrades
local function getAlreadyPurchasedUpgrades(myUpgradeId)
local cost = upgradesById[myUpgradeId].cost
alreadyPurchasedUpgrades[myUpgradeId] = true
for i, id in ipairs(upgradePrereqsById[myUpgradeId]) do
cost = cost + getAlreadyPurchasedUpgrades(id)
end
return cost
end
-- tower cost + total cost of this upgrade and all its prereqs
local baseCost = getAlreadyPurchasedUpgrades(upgradeId) + query("battd_characters", "cost", {
where=sFormat("name='%s'", towerName)
})[1].cost
-- build upgradeLocksById
for i, upgrade in ipairs(upgradeLocks) do
if upgrade.lockId then
if upgradeLocksById[upgrade.thisId] then
upgradeLocksById[upgrade.thisId][#upgradeLocksById[upgrade.thisId]+1] = upgrade.lockId
else
upgradeLocksById[upgrade.thisId] = {upgrade.lockId}
end
end
end
-- generate table header
local row = {[[{|class="wikitable sortable" style="text-align:center"\n!Cost!!Sell value\n]]}
for i, upgrade in ipairs(upgrades) do
--mw.logObject(upgrade)
if not alreadyPurchasedUpgrades[upgrade.id] then row[#row+1] = sFormat("!![[%s|%s]]", upgrade._pageName, upgrade.name) end
end
outputTable[1] = tConcat(row)
local function recursiveGetTotalCosts(currentCost, purchasedUpgrades)
-- add row to outputTable
row = {sFormat("\n|-\n|$%s", lang:formatNum(currentCost))}
for i, upgrade in ipairs(upgrades) do
if not alreadyPurchasedUpgrades[upgrade.id] then
row[#row+1] = purchasedUpgrades[upgrade.id] and "||{{Y}}" or "||{{N}}"
end
end
outputTable[#outputTable+1] = tConcat(row, "\n")
for thisUpgradeId, _ in pairs(purchasedUpgrades) do
-- skip if this upgrade is a leaf
if upgradePrereqsOfById[thisUpgradeId] then
for _, nextUpgradeId in pairs(upgradePrereqsOfById[thisUpgradeId]) do
if not purchasedUpgrades[nextUpgradeId] then
local purchasedUpgradesNext = {}
for p1, p2 in pairs(purchasedUpgrades) do purchasedUpgradesNext[p1] = p2 end
purchasedUpgradesNext[nextUpgradeId] = true
recursiveGetTotalCosts(currentCost + upgradesById[nextUpgradeId].cost, purchasedUpgradesNext)
end
end
end
end
end
recursiveGetTotalCosts(baseCost, alreadyPurchasedUpgrades)
outputTable[#outputTable+1] = "\n|}"
return tConcat(outputTable)
end
function p.upgrade(frame)
return upgrade(frame.args[1], frame.args[2])
end
return p