Module:BTD6 stats: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
mNo edit summary |
||
| Line 20: | Line 20: | ||
-- search through tables | -- search through tables | ||
for k, v in pairs(new_data) do | for k, v in pairs(new_data) do | ||
if k == | if tonumber(k) == nil then | ||
template[k] = {} | template[k] = {} | ||
Revision as of 17:50, 14 August 2024
Documentation for this module may be created at Module:BTD6 stats/doc
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)
local template = {}
-- 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 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 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)
local template = {}
-- local functions to improve performance
local tinsert = table.insert
local tconcat = table.concat
-- update prev_data first
for k, v in pairs(new_data) do
if k == "attacks" or k == "abilities" or k == "subtowers" or k == "zones" then
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
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)
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)
for i = 2, 20 do
tinsert(ret, sformat("===Level %i===", i))
tinsert(ret, parse_tower(frame, data[i], my_data))
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)
for i = 2, 20 do
tinsert(ret, sformat("===Level %i===", i))
tinsert(ret, parse_tower_full(frame, data[i], my_data))
end
return table.concat(ret, "\n")
end
return p