Module:BTD6 stats: Difference between revisions

From Blooncyclopedia, the independent Bloons knowledge base
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 == "attacks" or k == "abilities" or k == "subtowers" or k == "zones" then
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