Module:BATTD costs: Difference between revisions
yes i know this is broken i will fix it l8r |
mNo edit summary |
||
| (20 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- | -- helper functions | ||
local function GetTotalCosts(baseCost, accessibleUpgrades, upgradesById, upgradeLocksById, upgradePrereqsOfById, Y, N) | local function GetTotalCosts(baseCost, initialPurchasedUpgrades, accessibleUpgrades, startingUpgrade, | ||
upgradesById, upgradeLocksById, upgradePrereqsById, upgradePrereqsOfById, Y, N) | |||
local sFormat = string.format | local sFormat = string.format | ||
local tConcat = table.concat | local tConcat = table.concat | ||
local sGsub = string.gsub | local sGsub = string.gsub | ||
-- create the table headers | |||
local headerRow = {"{|class=\"wikitable sortable\" style=\"text-align:center\"\n!Total cost!!Sell value"} | local headerRow = {"{|class=\"wikitable sortable\" style=\"text-align:center\"\n!Total cost!!Sell value"} | ||
for | for upgradeId, _ in pairs(accessibleUpgrades) do | ||
headerRow[ | headerRow[#headerRow+1] = sFormat("!![[%s|%s]]", upgradesById[upgradeId]._pageName, upgradesById[upgradeId].name) | ||
end | end | ||
| Line 29: | Line 31: | ||
end | end | ||
local function RecursiveGetTotalCosts(currentCost, purchasedUpgrades, | local function RecursiveGetTotalCosts(currentCost, purchasedUpgrades, myUpgradeId) | ||
-- skip this upgrade if we don't have all the prereqs | |||
for _, prereqId in ipairs(upgradePrereqsById[myUpgradeId]) do | |||
if not purchasedUpgrades[prereqId] then return false end | |||
end | |||
-- skip this upgrade if it's locked by an already purchased upgrade | |||
for purchasedUpgradeId, _ in pairs(purchasedUpgrades) do | |||
if upgradeLocksById[purchasedUpgradeId][myUpgradeId] then return false end | |||
end | |||
--upgradeLocksById[startingUpgrade][myUpgradeId] = true | |||
for | -- shallow copy purchasedUpgrades but with this upgrade included in it now | ||
row[ | local purchasedUpgradesNext = { [myUpgradeId] = true } | ||
for purchasedUpgradeId, _ in pairs(purchasedUpgrades) do | |||
purchasedUpgradesNext[purchasedUpgradeId] = true | |||
end | |||
-- add row to output | |||
row = {sFormat("|-\n|$%s||$%s", FormatNum(currentCost), FormatNum(currentCost*0.7))} | |||
for accessibleUpgradeId, _ in pairs(accessibleUpgrades) do | |||
row[#row+1] = sFormat("||%s", purchasedUpgradesNext[accessibleUpgradeId] and Y or N) | |||
end | end | ||
outputTable[#outputTable+1] = tConcat(row, "") | outputTable[#outputTable+1] = tConcat(row, "") | ||
for | -- depth first | ||
for _, prereqOfId in ipairs(upgradePrereqsOfById[myUpgradeId]) do | |||
RecursiveGetTotalCosts(currentCost + upgradesById[prereqOfId].cost, purchasedUpgradesNext, prereqOfId) | |||
end | |||
-- breadth next | |||
for purchasedUpgradeId, _ in pairs(purchasedUpgrades) do | |||
for _, prereqOfId in ipairs(upgradePrereqsOfById[purchasedUpgradeId]) do | |||
--RecursiveGetTotalCosts(currentCost + upgradesById[prereqOfId].cost, purchasedUpgradesNext, prereqOfId) | |||
RecursiveGetTotalCosts(currentCost + | |||
end | end | ||
end | end | ||
return true | |||
end | end | ||
RecursiveGetTotalCosts(baseCost, initialPurchasedUpgrades, startingUpgrade) | |||
outputTable[#outputTable+1] = "|}" | |||
return tConcat(outputTable, "\n") | |||
end | end | ||
local function SetUpTables(towerName) | |||
local function | |||
local sFormat = string.format | local sFormat = string.format | ||
local query = mw.ext.cargo.query | local query = mw.ext.cargo.query | ||
local | local upgradesById = { root = {} } -- key:value table - upgrade:upgrade data | ||
local | local upgradeLocksById = { root = {} } -- key:values table - upgrades:upgrades that this upgrade locks | ||
local upgradePrereqsById = { root = {} } -- key:values table - upgrade:prerequisites to purchase this upgrade | |||
local upgradePrereqsOfById = { root = {} } -- key:values table - upgrades:upgrades this is a prerequisite of | |||
-- tower cost + total cost of this upgrade and all its prereqs | |||
local baseCost = tonumber(query("battd_characters", "cost", { | |||
where=sFormat("name='%s'", towerName) | |||
local | })[1].cost) | ||
-- cargo queries for data | -- cargo queries for data | ||
| Line 141: | Line 103: | ||
}), | }), | ||
query("battd_upgrades=main, battd_upgrades__previous=prev", "main.id=thisId, prev._value=prevId", { | query("battd_upgrades=main, battd_upgrades__previous=prev", "main.id=thisId, prev._value=prevId", { | ||
where=sFormat("main.tower='%s'", towerName), | where=sFormat("main.tower='%s' AND NOT unused", towerName), | ||
join="main._ID=prev._RowID" | join="main._ID=prev._RowID" | ||
}), | }), | ||
query("battd_upgrades=main, battd_upgrades__locked_by_upgrades=lock", "main.id=thisId, lock._value=lockId", { | query("battd_upgrades=main, battd_upgrades__locked_by_upgrades=lock", "main.id=thisId, lock._value=lockId", { | ||
where=sFormat("main.tower='%s'", towerName), | where=sFormat("main.tower='%s' AND NOT unused", towerName), | ||
join="main._ID=lock._RowID" | join="main._ID=lock._RowID" | ||
}) | }) | ||
| Line 152: | Line 114: | ||
for i, upgrade in ipairs(upgrades) do | for i, upgrade in ipairs(upgrades) do | ||
upgradesById[upgrade.id] = upgrade | upgradesById[upgrade.id] = upgrade | ||
upgradeLocksById[upgrade.id] = {} | |||
end | end | ||
| Line 165: | Line 127: | ||
end | end | ||
else | else | ||
-- if this upgrade | -- if this upgrade has no prereqs, give it a fake upgrade called "root" as a prereq | ||
upgradePrereqsOfById["root"][#upgradePrereqsOfById["root"]+1] = upgrade.thisId | upgradePrereqsOfById["root"][#upgradePrereqsOfById["root"]+1] = upgrade.thisId | ||
upgradePrereqsById[upgrade.thisId] = {"root"} | |||
end | end | ||
| Line 176: | Line 139: | ||
end | end | ||
end | end | ||
-- build upgradeLocksById | |||
for _, upgrade in ipairs(upgradeLocks) do | |||
if upgrade.lockId then | |||
upgradeLocksById[upgrade.thisId][upgrade.lockId] = true | |||
end | |||
end | |||
return upgradesById, upgradeLocksById, upgradePrereqsById, upgradePrereqsOfById, baseCost | |||
end | |||
local function Upgrade(towerName, upgradeId, Y, N) | |||
local upgradesById, upgradeLocksById, upgradePrereqsById, upgradePrereqsOfById, baseCost = SetUpTables(towerName) | |||
-- build | local purchasedUpgrades = {} -- this upgrade and any other upgrades that had to already be purchased to get it | ||
local function | local accessibleUpgrades = {} -- list of upgrades that are possible to reach from this upgrade by some route | ||
-- build purchasedUpgrades recursively | |||
local function GetPurchasedUpgrades(myUpgradeId) | |||
if not purchasedUpgrades[myUpgradeId] then baseCost = baseCost + upgradesById[myUpgradeId].cost end | |||
for | for _, prereqId in ipairs(upgradePrereqsById[myUpgradeId]) do | ||
if prereqId ~= "root" then GetPurchasedUpgrades(prereqId) end | |||
purchasedUpgrades[prereqId] = true | |||
end | end | ||
end | end | ||
local function | GetPurchasedUpgrades(upgradeId) | ||
-- generate a list of upgrades that are reachable from this upgrade, but do not have this upgrade as a prerequisite | |||
-- also generate a list of upgrades that are immediately reachable from this upgrade | |||
local function DetermineAccessibility(myUpgradeId) | |||
if myUpgradeId == upgradeId then return end | |||
for _, | -- if this upgrade is locked by an already purchased upgrade, then it is inaccessible | ||
for _, upgradeLock in ipairs(upgradeLocksById[myUpgradeId]) do | |||
if purchasedUpgrades[upgradeLock] then return end | |||
end | |||
-- find upgrades that are reachable from the current upgrades owned | |||
for _, prereqId in ipairs(upgradePrereqsById[myUpgradeId]) do | |||
-- upgrades with multiple prereqs are only accessible if we can reach all its prereqs | |||
-- if it is accessible, it'll be reached again on another recursion | |||
if not (accessibleUpgrades[prereqId] or purchasedUpgrades[prereqId] or prereqId == "root") or prereqId == upgradeId then return end | |||
end | |||
if not purchasedUpgrades[myUpgradeId] then accessibleUpgrades[myUpgradeId] = true end | |||
-- determine accessibility of next upgrades | |||
if upgradePrereqsOfById[myUpgradeId] then | |||
for _, prereqOfId in ipairs(upgradePrereqsOfById[myUpgradeId]) do | |||
DetermineAccessibility(prereqOfId) | |||
end | end | ||
end | end | ||
end | end | ||
-- | -- start with the root | ||
for | for _, prereqOfId in ipairs(upgradePrereqsOfById.root) do | ||
DetermineAccessibility(prereqOfId) | |||
end | end | ||
return GetTotalCosts(baseCost, purchasedUpgrades, accessibleUpgrades, upgradeId, | |||
upgradesById, upgradeLocksById, upgradePrereqsById, upgradePrereqsOfById, Y, N) | |||
return GetTotalCosts(baseCost, | |||
end | end | ||
-- GLOBAL FUNCTIONS | -- GLOBAL FUNCTIONS | ||
p["tower"] = function(frame) | |||
local upgradesById, upgradeLocksById, upgradePrereqsById, upgradePrereqsOfById, baseCost = SetUpTables(frame.args[1]) | |||
end | end | ||
p["upgrade"] = function(frame) | |||
return Upgrade(frame.args[1], frame.args[2], frame:expandTemplate{title = "Y", args = {}}, frame:expandTemplate{title = "N", args = {}}) | |||
return | --return Upgrade(frame.args[1], frame.args[2], "Y", "N") | ||
end | end | ||
return p | return p | ||