Module:BTD6 stats: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
-- This code is copyrighted and licensed under the Creative Commons Attribution-NonCommercial-ShareAlike International license, version 4.0. You may reuse and adapt this code for other purposes if: | |||
-- * You give appropriate credit | |||
-- * You are not using this material for commercial purposes | |||
-- * You are releasing it under the same license | |||
-- The subpages of this page are adapted from internal data in Bloons TD 6, which is copyrighted by Ninja Kiwi Limited. Its usage on Blooncyclopedia is believed to be fair use. | |||
-- Further information: https://www.bloonswiki.com/Blooncyclopedia:Copyrights | |||
-- By editing this code, you agree to release your changes under the same terms. | |||
local p = {} | local p = {} | ||
local my_data = {} | local my_data = {} | ||
| Line 11: | Line 19: | ||
} | } | ||
function parse_tower(frame, new_data, prev_data) | function parse_tower(frame, new_data, prev_data, header) | ||
local template = {} | local template = {} | ||
| Line 17: | Line 25: | ||
local tinsert = table.insert | local tinsert = table.insert | ||
local tconcat = table.concat | local tconcat = table.concat | ||
local sformat = string.format | |||
-- search through tables | -- search through tables | ||
for k, v in pairs(new_data) do | for k, v in pairs(new_data) do | ||
if tonumber(k) == nil then | if type(v) == "table" and tonumber(k) == nil then | ||
template[k] = {} | template[k] = {} | ||
| Line 27: | Line 36: | ||
-- iterate through attacks/abilities/subtowers | -- iterate through attacks/abilities/subtowers | ||
for kk, vv in pairs(v) do | for kk, vv in pairs(v) do | ||
if k == "subtowers" then tinsert(template[k], sformat(header, kk)) end | |||
if prev_data[k][kk] == nil then prev_data[k][kk] = {} end | if prev_data[k][kk] == nil then prev_data[k][kk] = {} end | ||
-- parse sub-table of table | -- parse sub-table of table | ||
| Line 91: | Line 101: | ||
end | end | ||
function parse_tower_full(frame, new_data, prev_data) | function parse_tower_full(frame, new_data, prev_data, header) | ||
local template = {} | local template = {} | ||
| Line 97: | Line 107: | ||
local tinsert = table.insert | local tinsert = table.insert | ||
local tconcat = table.concat | local tconcat = table.concat | ||
local sformat = string.format | |||
-- update prev_data first | -- update prev_data first | ||
for k, v in pairs(new_data) do | for k, v in pairs(new_data) do | ||
if | if type(v) == "table" and tonumber(k) == nil then | ||
if prev_data[k] == nil then prev_data[k] = {} end | if prev_data[k] == nil then prev_data[k] = {} end | ||
-- iterate through attacks/abilities/subtowers | -- iterate through attacks/abilities/subtowers | ||
for kk, vv in pairs(v) do | for kk, vv in pairs(v) do | ||
if k == "subtowers" then tinsert(template[k], sformat(header, kk)) end | |||
if prev_data[k][kk] == nil then prev_data[k][kk] = {} end | if prev_data[k][kk] == nil then prev_data[k][kk] = {} end | ||
-- parse sub-table of table | -- parse sub-table of table | ||
| Line 184: | Line 196: | ||
return frame:expandTemplate{title = template_name, args = template} | return frame:expandTemplate{title = template_name, args = template} | ||
end | end | ||
-- stats of a single tower | -- stats of a single tower | ||
| Line 190: | Line 201: | ||
local data = mw.loadJsonData(string.format("Module:BTD6 stats/%s", frame.args[1])) | local data = mw.loadJsonData(string.format("Module:BTD6 stats/%s", frame.args[1])) | ||
return parse_tower(frame, data, my_data) | return parse_tower(frame, data, my_data, "===%s===") | ||
end | |||
-- stats of a paragon | |||
function p.paragon(frame) | |||
local data = mw.loadJsonData(string.format("Module:BTD6 stats/%s", frame.args[1])) | |||
return parse_paragon(frame, data, my_data, "===%s===") | |||
end | end | ||
| Line 204: | Line 222: | ||
-- calculate base tower stats for later comparison | -- calculate base tower stats for later comparison | ||
parse_tower(frame, data, my_data) | parse_tower(frame, data, my_data, "===%s===") | ||
for i = 2, 20 do | for i = 2, 20 do | ||
tinsert(ret, sformat("===Level %i===", i)) | tinsert(ret, sformat("===Level %i===", i)) | ||
tinsert(ret, parse_tower(frame, data[i], my_data)) | tinsert(ret, parse_tower(frame, data[i], my_data, "====%s====")) | ||
end | end | ||
| Line 225: | Line 243: | ||
-- calculate base tower stats for later comparison | -- calculate base tower stats for later comparison | ||
parse_tower(frame, data, my_data) | parse_tower(frame, data, my_data, "===%s===") | ||
for i = 2, 20 do | for i = 2, 20 do | ||
tinsert(ret, sformat("===Level %i===", i)) | tinsert(ret, sformat("===Level %i===", i)) | ||
tinsert(ret, parse_tower_full(frame, data[i], my_data)) | tinsert(ret, parse_tower_full(frame, data[i], my_data, "====%s====")) | ||
end | end | ||
Revision as of 20:19, 15 August 2024
Documentation for this module may be created at Module:BTD6 stats/doc
-- This code is copyrighted and licensed under the Creative Commons Attribution-NonCommercial-ShareAlike International license, version 4.0. You may reuse and adapt this code for other purposes if:
-- * You give appropriate credit
-- * You are not using this material for commercial purposes
-- * You are releasing it under the same license
-- The subpages of this page are adapted from internal data in Bloons TD 6, which is copyrighted by Ninja Kiwi Limited. Its usage on Blooncyclopedia is believed to be fair use.
-- Further information: https://www.bloonswiki.com/Blooncyclopedia:Copyrights
-- By editing this code, you agree to release your changes under the same terms.
local p = {}
local my_data = {}
local template_names = {
attacks = "BTD6 attack",
projectiles = "BTD6 projectile",
abilities = "BTD6 ability",
effects = "BTD6 effect",
zones = "BTD6 zone",
subtowers = "BTD6 tower"
}
function parse_tower(frame, new_data, prev_data, header)
local template = {}
-- local functions to improve performance
local tinsert = table.insert
local tconcat = table.concat
local sformat = string.format
-- search through tables
for k, v in pairs(new_data) do
if type(v) == "table" and tonumber(k) == nil then
template[k] = {}
if prev_data[k] == nil then prev_data[k] = {} end
-- iterate through attacks/abilities/subtowers
for kk, vv in pairs(v) do
if k == "subtowers" then tinsert(template[k], sformat(header, kk)) end
if prev_data[k][kk] == nil then prev_data[k][kk] = {} end
-- parse sub-table of table
tinsert(template[k], parse_stats(frame, kk, vv, prev_data[k][kk], template_names[k]))
end
template[k] = tconcat(template[k])
elseif type(v) ~= "table" then
-- if previous value exists, make it a comparison
if prev_data[k] ~= nil then
template[k] = prev_data[k]
template[k .. " after"] = v
else
template[k] = v
end
-- update previous value
prev_data[k] = v
end
end
return frame:expandTemplate{title = "BTD6 tower", args = template}
end
function parse_stats(frame, name, new_data, prev_data, template_name)
local template = {name = name}
-- local functions to improve performance
local tinsert = table.insert
local tconcat = table.concat
-- search through tables
for k, v in pairs(new_data) do
if type(v) == "table" then
template[k] = {}
if prev_data[k] == nil then prev_data[k] = {} end
-- iterate through attacks/abilities/subtowers
for kk, vv in pairs(v) do
if prev_data[k][kk] == nil then prev_data[k][kk] = {} end
-- parse sub-table of table
tinsert(template[k], parse_stats(frame, kk, vv, prev_data[k][kk], template_names[k]))
end
template[k] = tconcat(template[k])
else
-- if previous value exists, make it a comparison
if prev_data[k] ~= nil then
template[k] = prev_data[k]
template[k .. " after"] = v
else
template[k] = v
end
-- update previous value
prev_data[k] = v
end
end
return frame:expandTemplate{title = template_name, args = template}
end
function parse_tower_full(frame, new_data, prev_data, header)
local template = {}
-- local functions to improve performance
local tinsert = table.insert
local tconcat = table.concat
local sformat = string.format
-- update prev_data first
for k, v in pairs(new_data) do
if type(v) == "table" and tonumber(k) == nil then
if prev_data[k] == nil then prev_data[k] = {} end
-- iterate through attacks/abilities/subtowers
for kk, vv in pairs(v) do
if k == "subtowers" then tinsert(template[k], sformat(header, kk)) end
if prev_data[k][kk] == nil then prev_data[k][kk] = {} end
-- parse sub-table of table
parse_stats_full(frame, kk, vv, prev_data[k][kk], template_names[k])
end
elseif type(v) ~= "table" then
-- update previous value
prev_data[k] = v
end
end
-- update prev_data first
for k, v in pairs(prev_data) do
if k == "attacks" or k == "abilities" or k == "subtowers" or k == "zones" then
template[k] = {}
-- iterate through attacks/abilities/subtowers
for kk, vv in pairs(v) do
tinsert(template[k], parse_stats_full(frame, kk, nil, vv, template_names[k]))
end
template[k] = tconcat(template[k])
elseif type(v) ~= "table" then
-- update previous value
template[k] = v
end
end
return frame:expandTemplate{title = "BTD6 tower", args = template}
end
function parse_stats_full(frame, name, new_data, prev_data, template_name)
local template = {name = name}
-- local functions to improve performance
local tinsert = table.insert
local tconcat = table.concat
-- update prev_data first
if new_data ~= nil then
for k, v in pairs(new_data) do
if type(v) == "table" then
mw.logObject(k)
if prev_data[k] == nil then prev_data[k] = {} end
-- iterate through attacks/abilities/subtowers
for kk, vv in pairs(v) do
if prev_data[k][kk] == nil then prev_data[k][kk] = {} end
-- parse sub-table of table
parse_stats_full(frame, kk, vv, prev_data[k][kk], template_names[k])
end
else
prev_data[k] = v
end
end
end
for k, v in pairs(prev_data) do
if type(v) == "table" then
template[k] = {}
-- iterate through attacks/abilities/subtowers
for kk, vv in pairs(v) do
if prev_data[k][kk] == nil then prev_data[k][kk] = {} end
-- parse sub-table of table
tinsert(template[k], parse_stats_full(frame, kk, nil, vv, template_names[k]))
end
template[k] = tconcat(template[k])
else
template[k] = v
end
end
return frame:expandTemplate{title = template_name, args = template}
end
-- stats of a single tower
function p.base_stats(frame)
local data = mw.loadJsonData(string.format("Module:BTD6 stats/%s", frame.args[1]))
return parse_tower(frame, data, my_data, "===%s===")
end
-- stats of a paragon
function p.paragon(frame)
local data = mw.loadJsonData(string.format("Module:BTD6 stats/%s", frame.args[1]))
return parse_paragon(frame, data, my_data, "===%s===")
end
-- stat changes of a hero
function p.hero_level_changes(frame)
local data = mw.loadJsonData(string.format("Module:BTD6 stats/%s", frame.args[1]))
local ret = {}
-- local functions to improve performance
local tinsert = table.insert
local sformat = string.format
-- calculate base tower stats for later comparison
parse_tower(frame, data, my_data, "===%s===")
for i = 2, 20 do
tinsert(ret, sformat("===Level %i===", i))
tinsert(ret, parse_tower(frame, data[i], my_data, "====%s===="))
end
return table.concat(ret, "\n")
end
-- stat changes of a hero
function p.hero_level_stats(frame)
local data = mw.loadJsonData(string.format("Module:BTD6 stats/%s", frame.args[1]))
local ret = {}
-- local functions to improve performance
local tinsert = table.insert
local sformat = string.format
-- calculate base tower stats for later comparison
parse_tower(frame, data, my_data, "===%s===")
for i = 2, 20 do
tinsert(ret, sformat("===Level %i===", i))
tinsert(ret, parse_tower_full(frame, data[i], my_data, "====%s===="))
end
return table.concat(ret, "\n")
end
return p