Module:Cosmetic items: Difference between revisions

From Blooncyclopedia, the independent Bloons knowledge base
Jump to navigation Jump to search
Created page with "local p = {} local parse = function(args, sourcesTable, tableHeader, tableColumns) local sFormat = string.format local ret = {tableHeader} -- get item sources local sources = mw.ext.cargo.query(sourcesTable, "CONCAT('<ul>', GROUP_CONCAT('<li>', name, '</li>' ORDER BY name DESC SEPARATOR ''), '</ul>') = name, item", { limit = 300, where = sFormat("(item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item =..."
 
Pymonkibot (talk | contribs)
m Text replacement - "[[Bloons TD Battles 2 v" to "[[Update history:Bloons TD Battles 2/Version "
 
(16 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local p = {}
local p = {}


local parse = function(args, sourcesTable, tableHeader, tableColumns)
local parse = function(args, sourcesTable, tableHeader, tableExtras, versionText, versionDefault)
local sFormat = string.format
local sFormat = string.format
local tConcat = table.concat
local ret = {tableHeader}
local ret = {tableHeader}
Line 9: Line 10:
local sources = mw.ext.cargo.query(sourcesTable, "CONCAT('<ul>', GROUP_CONCAT('<li>', name, '</li>' ORDER BY name DESC SEPARATOR ''), '</ul>') = name, item", {
local sources = mw.ext.cargo.query(sourcesTable, "CONCAT('<ul>', GROUP_CONCAT('<li>', name, '</li>' ORDER BY name DESC SEPARATOR ''), '</ul>') = name, item", {
limit = 300,
limit = 300,
where = sFormat("(item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s')",
where = sFormat("(item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s')", args["id 1"], args["id 2"], args["id 3"], args["id 4"], args["id 5"], args["id 6"], args["id 7"], args["id 8"], args["id 9"], args["id 10"], args["id 11"], args["id 12"], args["id 13"], args["id 14"], args["id 15"], args["id 16"], args["id 17"], args["id 18"], args["id 19"], args["id 20"], args["id 21"], args["id 22"], args["id 23"], args["id 24"], args["id 25"], args["id 26"], args["id 27"], args["id 28"], args["id 29"], args["id 30"], args["id 31"], args["id 32"], args["id 33"], args["id 34"], args["id 35"], args["id 36"], args["id 37"], args["id 38"], args["id 39"], args["id 40"], args["id 41"], args["id 42"], args["id 43"], args["id 44"], args["id 45"], args["id 46"], args["id 47"], args["id 48"], args["id 49"], args["id 50"], args["id 51"], args["id 52"], args["id 53"], args["id 54"], args["id 55"], args["id 56"], args["id 57"], args["id 58"], args["id 59"], args["id 60"], args["id 61"], args["id 62"], args["id 63"], args["id 64"], args["id 65"], args["id 66"], args["id 67"], args["id 68"], args["id 69"], args["id 70"], args["id 71"], args["id 72"], args["id 73"], args["id 74"], args["id 75"], args["id 76"], args["id 77"], args["id 78"], args["id 79"], args["id 80"], args["id 81"], args["id 82"], args["id 83"], args["id 84"], args["id 85"], args["id 86"], args["id 87"], args["id 88"], args["id 89"], args["id 90"], args["id 91"], args["id 92"], args["id 93"], args["id 94"], args["id 95"], args["id 96"], args["id 97"], args["id 98"], args["id 99"], args["id 100"], args["id 101"], args["id 102"], args["id 103"], args["id 104"], args["id 105"], args["id 106"], args["id 107"], args["id 108"], args["id 109"], args["id 110"], args["id 111"], args["id 112"], args["id 113"], args["id 114"], args["id 115"], args["id 116"], args["id 117"], args["id 118"], args["id 119"], args["id 120"]),
args["id 1"], args["id 2"], args["id 3"], args["id 4"], args["id 5"], args["id 6"], args["id 7"], args["id 8"], args["id 9"], args["id 10"], args["id 11"], args["id 12"], args["id 13"], args["id 14"], args["id 15"], args["id 16"], args["id 17"], args["id 18"], args["id 19"], args["id 20"], args["id 21"], args["id 22"], args["id 23"], args["id 24"], args["id 25"], args["id 26"], args["id 27"], args["id 28"], args["id 29"], args["id 30"], args["id 31"], args["id 32"], args["id 33"], args["id 34"], args["id 35"], args["id 36"], args["id 37"], args["id 38"], args["id 39"], args["id 40"], args["id 41"], args["id 42"], args["id 43"], args["id 44"], args["id 45"], args["id 46"], args["id 47"], args["id 48"], args["id 49"], args["id 50"], args["id 51"], args["id 52"], args["id 53"], args["id 54"], args["id 55"], args["id 56"], args["id 57"], args["id 58"], args["id 59"], args["id 60"], args["id 61"], args["id 62"], args["id 63"], args["id 64"], args["id 65"], args["id 66"], args["id 67"], args["id 68"], args["id 69"], args["id 70"], args["id 71"], args["id 72"], args["id 73"], args["id 74"], args["id 75"], args["id 76"], args["id 77"], args["id 78"], args["id 79"], args["id 80"], args["id 81"], args["id 82"], args["id 83"], args["id 84"], args["id 85"], args["id 86"], args["id 87"], args["id 88"], args["id 89"], args["id 90"], args["id 91"], args["id 92"], args["id 93"], args["id 94"], args["id 95"], args["id 96"], args["id 97"], args["id 98"], args["id 99"], args["id 100"], args["id 101"], args["id 102"], args["id 103"], args["id 104"], args["id 105"], args["id 106"], args["id 107"], args["id 108"], args["id 109"], args["id 110"], args["id 111"], args["id 112"], args["id 113"], args["id 114"], args["id 115"], args["id 116"], args["id 117"], args["id 118"], args["id 119"], args["id 120"]),
groupBy = "item"
groupBy = "item"
})
})


-- create {id: source} pairs for each item
sourcesById = {}
sourcesById = {}
for i = 1, #sources do
for i = 1, #sources do
Line 19: Line 20:
end
end
local index = 1
for i = 1, 120 do
for i = 1, 120 do
local id = args[sFormat("id %i", index)]
local id = args[sFormat("id %i", i)]
if id == "" then break end
if id == "" then break end
ret[index+1] = tableColumns(index, sourcesById[id] ~= nil and sources[sourcesById[id]].name or  "''To be added''")
-- any extra table columns to insert between the standard ones
local extras = {}
for ii, str in ipairs(tableExtras) do
extras[ii] = args[sFormat(str, i)]
end
extras = tConcat(extras, "||") .. "||"
-- insert table row
ret[i+1] = sFormat(
[=[|style="text-align:center" id="%s"|[[File:%s|50x50px]]
|'''%s'''%s||%s%s||%s||%s]=],
args[sFormat("name %i", i)],
args[sFormat("image %i", i)],
args[sFormat("name %i", i)],
args[sFormat("description %i", i)] ~= "" and ("<br>" .. args[sFormat("description %i", i)]) or "",
extras == "||" and "" or extras,
sourcesById[id] ~= nil and sources[sourcesById[id]].name or  "''To be added''",
args[sFormat("introduced %i", i)] ~= "" and sFormat(versionText, args[sFormat("introduced %i", i)], args[sFormat("introduced %i", i)]) or versionDefault,
args[sFormat("notes %i", i)]
)
end
end
ret[#ret+1] = "|}"
ret[#ret+1] = "|}"
return table.concat(ret, "\n|-\n")
return tConcat(ret, "\n|-\n")
end
end


-- trophy store items
p["BTD6"] = function(frame)
p["BTD6"] = function(frame)
return parse(
return parse(
Line 38: Line 58:
[[{|class='wikitable sortable'
[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
function(index, sources) -- lambda for inserting table rows
{},
return sFormat("|style='text-align:center' id='%s'|[[File:%s|50x50px]]||'''%s'''<br>%s||%s||%s||%s",
"[[Update history:Bloons TD 6/Version %s|Version %s]]",
frame.args[sFormat("name %i", index)],
"''To be added''"
frame.args[sFormat("image %i", index)],
)
frame.args[sFormat("name %i", index)],
frame.args[sFormat("description %i", index)],
sources,
frame.args[sFormat("introduced %i", index)] ~= "" and sFormat("[[Bloons TD 6 v%s|Version %s]]", frame.args[sFormat("introduced %i", index)], frame.args[sFormat("introduced %i", index)]) or "''To be added''",
frame.args[sFormat("notes %i", index)]
)
end)
end
end


-- team flair items
p["BTD6 teams"] = function(frame)
p["BTD6 teams"] = function(frame)
return parse(
return parse(
Line 57: Line 71:
[[{|class='wikitable sortable'
[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
function(index, sources) -- lambda for inserting table rows
{},
return sFormat("|style='text-align:center' id='%s'|[[File:%s|50x50px]]||'''%s'''<br>%s||%s||%s||%s",
"[[Update history:Bloons TD 6/Version %s|Version %s]]",
frame.args[sFormat("name %i", index)],
"''To be added''"
frame.args[sFormat("image %i", index)],
)
frame.args[sFormat("name %i", index)],
frame.args[sFormat("description %i", index)],
sources,
frame.args[sFormat("introduced %i", index)] ~= "" and sFormat("[[Bloons TD 6 v%s|Version %s]]", frame.args[sFormat("introduced %i", index)], frame.args[sFormat("introduced %i", index)]) or "''To be added''",
frame.args[sFormat("notes %i", index)]
)
end)
end
end


-- bling items
p["BTDB2 bling"] = function(frame)
p["BTDB2 bling"] = function(frame)
return parse(
return parse(
Line 76: Line 84:
[[{|class='wikitable sortable'
[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
function(index, sources) -- lambda for inserting table rows
{},
return sFormat("|style='text-align:center' id='%s'|[[File:%s|50x50px]]||'''%s'''<br>%s||%s||%s||%s",
"[[Update history:Bloons TD Battles 2/Version %s|Version %s]]",
frame.args[sFormat("name %i", index)],
"Launch"
frame.args[sFormat("image %i", index)],
)
frame.args[sFormat("name %i", index)],
frame.args[sFormat("description %i", index)],
sources,
frame.args[sFormat("introduced %i", index)] ~= "" and sFormat("[[Bloons TD Battles 2 v%s|Version %s]]", frame.args[sFormat("introduced %i", index)], frame.args[sFormat("introduced %i", index)]) or "''To be added''",
frame.args[sFormat("notes %i", index)]
)
end)
end
end


-- tower customization items
p["BTDB2 customization"] = function(frame)
p["BTDB2 customization"] = function(frame)
return parse(
return parse(
frame.args,
frame.args,
"btdb2_cosmetic_sources",
"btdb2_cosmetic_sources",
[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Tower!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
{"tower %i"},
"[[Update history:Bloons TD Battles 2/Version %s|Version %s]]",
"Launch"
)
end
-- general items
p["BCS"] = function(frame)
return parse(
frame.args,
"bcs_rewards",
[[{|class='wikitable sortable'
[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
function(index, sources) -- lambda for inserting table rows
{},
return sFormat("|style='text-align:center' id='%s'|[[File:%s|50x50px]]||'''%s'''<br>%s||%s||%s||%s",
"[[Update history:Bloons Card Storm/Version %s|Version %s]]",
frame.args[sFormat("name %i", index)],
"Launch"
frame.args[sFormat("image %i", index)],
)
frame.args[sFormat("name %i", index)],
end
frame.args[sFormat("description %i", index)],
 
frame.args[sFormat("tower %i", index)],
-- hero items
sources,
p["BCS hero"] = function(frame)
frame.args[sFormat("introduced %i", index)] ~= "" and sFormat("[[Bloons TD Battles 2 v%s|Version %s]]", frame.args[sFormat("introduced %i", index)], frame.args[sFormat("introduced %i", index)]) or "''To be added''",
return parse(
frame.args[sFormat("notes %i", index)]
frame.args,
)
"bcs_rewards",
end)
[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Hero!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
{"hero %i"},
"[[Update history:Bloons Card Storm/Version %s|Version %s]]",
"Launch"
)
end
end


return p
return p

Latest revision as of 01:01, 24 April 2026

Module for displaying formatted tables of cosmetic items.


local p = {}

local parse = function(args, sourcesTable, tableHeader, tableExtras, versionText, versionDefault)
	local sFormat = string.format
	local tConcat = table.concat
	
	local ret = {tableHeader}
	
	-- get item sources
	local sources = mw.ext.cargo.query(sourcesTable, "CONCAT('<ul>', GROUP_CONCAT('<li>', name, '</li>' ORDER BY name DESC SEPARATOR ''), '</ul>') = name, item", {
		limit = 300,
		where = sFormat("(item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s' OR item = '%s')",			args["id 1"], args["id 2"], args["id 3"], args["id 4"], args["id 5"], args["id 6"], args["id 7"], args["id 8"], args["id 9"], args["id 10"], args["id 11"], args["id 12"], args["id 13"], args["id 14"], args["id 15"], args["id 16"], args["id 17"], args["id 18"], args["id 19"], args["id 20"], args["id 21"], args["id 22"], args["id 23"], args["id 24"], args["id 25"], args["id 26"], args["id 27"], args["id 28"], args["id 29"], args["id 30"], args["id 31"], args["id 32"], args["id 33"], args["id 34"], args["id 35"], args["id 36"], args["id 37"], args["id 38"], args["id 39"], args["id 40"], args["id 41"], args["id 42"], args["id 43"], args["id 44"], args["id 45"], args["id 46"], args["id 47"], args["id 48"], args["id 49"], args["id 50"], args["id 51"], args["id 52"], args["id 53"], args["id 54"], args["id 55"], args["id 56"], args["id 57"], args["id 58"], args["id 59"], args["id 60"], args["id 61"], args["id 62"], args["id 63"], args["id 64"], args["id 65"], args["id 66"], args["id 67"], args["id 68"], args["id 69"], args["id 70"], args["id 71"], args["id 72"], args["id 73"], args["id 74"], args["id 75"], args["id 76"], args["id 77"], args["id 78"], args["id 79"], args["id 80"], args["id 81"], args["id 82"], args["id 83"], args["id 84"], args["id 85"], args["id 86"], args["id 87"], args["id 88"], args["id 89"], args["id 90"], args["id 91"], args["id 92"], args["id 93"], args["id 94"], args["id 95"], args["id 96"], args["id 97"], args["id 98"], args["id 99"], args["id 100"], args["id 101"], args["id 102"], args["id 103"], args["id 104"], args["id 105"], args["id 106"], args["id 107"], args["id 108"], args["id 109"], args["id 110"], args["id 111"], args["id 112"], args["id 113"], args["id 114"], args["id 115"], args["id 116"], args["id 117"], args["id 118"], args["id 119"], args["id 120"]),
		groupBy = "item"
	})

	-- create {id: source} pairs for each item 
	sourcesById = {}
	for i = 1, #sources do
		sourcesById[sources[i].item] = i
	end
	
	for i = 1, 120 do
		local id = args[sFormat("id %i", i)]
		if id == "" then break end
		
		-- any extra table columns to insert between the standard ones
		local extras = {}
		for ii, str in ipairs(tableExtras) do
			extras[ii] = args[sFormat(str, i)]
		end
		extras = tConcat(extras, "||") .. "||"
		
		-- insert table row
		ret[i+1] = sFormat(
[=[|style="text-align:center" id="%s"|[[File:%s|50x50px]]
|'''%s'''%s||%s%s||%s||%s]=],
			args[sFormat("name %i", i)],
			args[sFormat("image %i", i)],
			args[sFormat("name %i", i)],
			args[sFormat("description %i", i)] ~= "" and ("<br>" .. args[sFormat("description %i", i)]) or "",
			extras == "||" and "" or extras,
			sourcesById[id] ~= nil and sources[sourcesById[id]].name or  "''To be added''",
			args[sFormat("introduced %i", i)] ~= "" and sFormat(versionText, args[sFormat("introduced %i", i)], args[sFormat("introduced %i", i)]) or versionDefault,
			args[sFormat("notes %i", i)]
		)
	end
	
	ret[#ret+1] = "|}"
	
	return tConcat(ret, "\n|-\n")
end

-- trophy store items
p["BTD6"] = function(frame)
	return parse(
		frame.args,
		"btd6_cosmetic_sources",
		[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
		{},
		"[[Update history:Bloons TD 6/Version %s|Version %s]]",
		"''To be added''"
	)
end

-- team flair items
p["BTD6 teams"] = function(frame)
	return parse(
		frame.args,
		"btd6_team_cosmetic_sources",
		[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
		{},
		"[[Update history:Bloons TD 6/Version %s|Version %s]]",
		"''To be added''"
	)
end

-- bling items
p["BTDB2 bling"] = function(frame)
	return parse(
		frame.args,
		"btdb2_cosmetic_sources",
		[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
		{},
		"[[Update history:Bloons TD Battles 2/Version %s|Version %s]]",
		"Launch"
	)
end

-- tower customization items
p["BTDB2 customization"] = function(frame)
	return parse(
		frame.args,
		"btdb2_cosmetic_sources",
		[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Tower!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
		{"tower %i"},
		"[[Update history:Bloons TD Battles 2/Version %s|Version %s]]",
		"Launch"
	)
end

-- general items
p["BCS"] = function(frame)
	return parse(
		frame.args,
		"bcs_rewards",
		[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
		{},
		"[[Update history:Bloons Card Storm/Version %s|Version %s]]",
		"Launch"
	)
end

-- hero items
p["BCS hero"] = function(frame)
	return parse(
		frame.args,
		"bcs_rewards",
		[[{|class='wikitable sortable'
!class='unsortable'|Icon!!Text!!Hero!!Unlock method(s)!!Introduced!!class='unsortable'|Notes]],
		{"hero %i"},
		"[[Update history:Bloons Card Storm/Version %s|Version %s]]",
		"Launch"
	)
end

return p