Module:Cards: Difference between revisions
m (docs) |
(oops) |
||
(28 intermediate revisions by 2 users not shown) | |||
Line 3: | Line 3: | ||
--local KeyData = mw.loadData( 'Module:Code/data') | --local KeyData = mw.loadData( 'Module:Code/data') | ||
local all_cards = require("Module:Cards/data").cards | local all_cards = require("Module:Cards/data").cards | ||
local all_langs = require("Module:Other_Languages/data").cards | |||
--[[ | --[[ | ||
Line 8: | Line 9: | ||
returns the respective stat of the card. | returns the respective stat of the card. | ||
possible values for <stat>: name health scrap attack counter other desc summoncon tribes price | possible values for <stat>: name health scrap attack counter other desc summoncon tribes price challenge | ||
]] | ]] | ||
function p.GetStat(frame) | function p.GetStat(frame) | ||
Line 17: | Line 18: | ||
local stat = frame.args.stat or frame.args[2] | local stat = frame.args.stat or frame.args[2] | ||
stat = trim(stat) | stat = trim(stat) | ||
return frame:preprocess(_getStat(card, stat)) | local langCode = frame:expandTemplate{ title = 'USERLANG' } or 'en' | ||
return frame:preprocess(_getStat(card, stat, langCode)) | |||
end | end | ||
function _getStat(card, stat) | function _getStat(card, stat, langCode) | ||
local langCode = langCode or mw.getCurrentFrame():expandTemplate{ title = 'USERLANG' } or 'en' | |||
stat = string.lower(stat) | stat = string.lower(stat) | ||
if stat == "name" then | if stat == "name" then | ||
return card | return _getName(card, langCode) or "" | ||
elseif stat == "health" then | elseif stat == "health" then | ||
return card.Health or "" | return card.Health or "" | ||
Line 35: | Line 38: | ||
return card.Other or "" | return card.Other or "" | ||
elseif stat == "description" or stat == "desc" then | elseif stat == "description" or stat == "desc" then | ||
return card | return _getDesc(card, langCode) or "" | ||
elseif stat == "summoncon" then | elseif stat == "summoncon" then | ||
return card.SummonCon or "" | return card.SummonCon or "" | ||
Line 47: | Line 50: | ||
end | end | ||
return out | return out | ||
elseif stat == "gold" then | |||
return card.Gold or "" | |||
elseif stat == "price" then | elseif stat == "price" then | ||
return card.Price or "" | return card.Price or "" | ||
elseif stat == "unlock" then | |||
return card.Unlock or "" | |||
elseif stat == "challenge" then | |||
return card.Challenge or "" | |||
else | else | ||
error("Argument Invalid:" .. stat) | error("Argument Invalid:" .. stat) -- why is this necessary | ||
end | end | ||
end | |||
function _getOtherLangs(card) | |||
if all_langs[card.UniqueName] then | |||
return all_langs[card.UniqueName] | |||
end | |||
if all_langs[card.Name] then | |||
return all_langs[card.Name] | |||
end | |||
for _, langs in pairs(all_langs) do | |||
if langs.en.Name == card.Name then | |||
return langs | |||
end | |||
end | |||
-- if no matches, the parent functions default to en | |||
end | |||
function _getName(card, langCode) | |||
local target = langCode or mw.getCurrentFrame():expandTemplate{ title = 'USERLANG' } or "en" | |||
if target ~= "en" and _getOtherLangs(card) and _getOtherLangs(card)[target] then | |||
return _getOtherLangs(card)[target].Name or "" | |||
end | |||
return card.Name or "" | |||
end | |||
function _getDesc(card, langCode) | |||
local target = langCode or mw.getCurrentFrame():expandTemplate{ title = 'USERLANG' } or "en" | |||
if target ~= "en" and _getOtherLangs(card) and _getOtherLangs(card)[target] then | |||
return _getOtherLangs(card)[target].Desc or "" | |||
end | |||
return card.Desc or "" | |||
end | |||
function p.testlang(name) | |||
mw.log(_getStat(all_cards[name], "name"), _getName(all_cards[name], "ja")) | |||
end | end | ||
Line 60: | Line 104: | ||
returns a table based on the given paramenters. | returns a table based on the given paramenters. | ||
<entry> is either a card name or type. | <entry> is either a card name or type. | ||
Types include: Boss Pet NonPetCompanion Companion Item Shade Clunker EnemyClunker Enemy Miniboss Boss | Types include: Boss Pet NonPetCompanion Companion Item Shade Clunker EnemyClunker Enemy Miniboss Boss ShopItem | ||
Append a tribename before the type to filter cards exclusive to that tribe, eg "SnowdwellersCompanion" | |||
<entry_list> is a list of valid <entry> values, input as multiple parameters, ie <entry1>|<entry2>|... etc. | <entry_list> is a list of valid <entry> values, input as multiple parameters, ie <entry1>|<entry2>|... etc. | ||
<header_list> is a list of valid stats, input as multiple parameters, ie <stat1>|<stat2>|... etc. | <header_list> is a list of valid stats, input as multiple parameters, ie <stat1>|<stat2>|... etc. | ||
stats include: name health scrap attack counter other desc summoncon tribes price | stats include: name health scrap attack counter other desc summoncon tribes price | ||
The first usage option is used when only 1 entry is needed, eg the only entry is a type category. otherwise, use the second option. | The first usage option is used when only 1 entry is needed, eg the only entry is a type category. otherwise, use the second option. | ||
Line 89: | Line 135: | ||
end | end | ||
return frame:preprocess(_table(arr[1], arr[2])) | return frame:preprocess(_table(arr[1], arr[2])) | ||
end | |||
function p.testy() | |||
return _table({"Pet", "SnowdwellersNonPetCompanion"}, {"name", "desc", "challenge"}) | |||
end | end | ||
function _table(entries, headers) | function _table(entries, headers) | ||
local sortByChallenge = false | |||
local out = '{| class="wikitable sortable" style="text-align:center;"\n' | local out = '{| class="wikitable sortable" style="text-align:center;"\n' | ||
for i, header in ipairs(headers) do | for i, header in ipairs(headers) do | ||
Line 105: | Line 157: | ||
elseif header == "summoncon" then | elseif header == "summoncon" then | ||
out = out .. "!Summon conditions\n" | out = out .. "!Summon conditions\n" | ||
elseif header == "challenge" then | |||
out = out .. "!Challenge\n" | |||
sortByChallenge = true | |||
else | else | ||
out = out .. "!" .. header:gsub("^%l", string.upper) .. "\n" --Covers all cases where the stat name and intended header are equal | out = out .. "!" .. header:gsub("^%l", string.upper) .. "\n" --Covers all cases where the stat name and intended header are equal | ||
Line 115: | Line 170: | ||
all_cards[entry].UniqueName = entry | all_cards[entry].UniqueName = entry | ||
table.insert(entryList, all_cards[entry]) | table.insert(entryList, all_cards[entry]) | ||
else | else -- entry is a type category | ||
local tribe = nil | |||
for _, tribename in ipairs({"Snowdwellers", "Shademancers", "Clunkmasters"}) do | |||
if entry:sub(1, #tribename) == tribename then | |||
tribe = tribename | |||
entry = entry:sub(1+#tribename) | |||
end | |||
end | |||
for i, card in ipairs(sortedCards()) do | for i, card in ipairs(sortedCards()) do | ||
if card.Types and card.Types[entry] then | if card.Types and card.Types[entry] | ||
and (tribe == nil or (tribe and card.Tribes and tableContains(card.Tribes, tribe))) | |||
then | |||
table.insert(entryList, card) | table.insert(entryList, card) | ||
end | end | ||
end | end | ||
end | end | ||
end | |||
if sortByChallenge then | |||
table.sort(entryList, function(a,b) | |||
if a.ChallengeOrder and b.ChallengeOrder then | |||
return a.ChallengeOrder and b.ChallengeOrder and a.ChallengeOrder < b.ChallengeOrder | |||
elseif a.ChallengeOrder ~= b.ChallengeOrder then | |||
return a.ChallengeOrder and true | |||
else | |||
return a.Name < b.Name | |||
end | |||
end) | |||
end | end | ||
Line 129: | Line 205: | ||
out = out.."|" | out = out.."|" | ||
if header == "image" then | if header == "image" then | ||
out = out.."{{CardArt|".. (card.Image or card.UniqueName) .."}}" | if card.Types and (card.Types["Charm"] or card.Types["CursedCharm"]) then | ||
out = out.."{{CharmArt|" | |||
else | |||
out = out.."{{CardArt|" | |||
end | |||
out = out.. (card.Image or card.UniqueName) .."}}" | |||
elseif header == "name" then | elseif header == "name" then | ||
local link = card.Link or card.UniqueName | local link = card.Link or card.UniqueName | ||
out = out.."style=\"text-align:center;\"|[[".. link .. "|" .. card | out = out.."style=\"text-align:center;\"|[[".. link .. "|" .. _getName(card) .."]]" | ||
elseif header == "description" or header == "desc" or header == "summoncon" then | elseif header == "description" or header == "desc" or header == "summoncon" then | ||
out = out.."style=\"text-align:center;\"|".. (_getStat(card, header) or "") | out = out.."style=\"text-align:center;\"|".. (_getStat(card, header) or "") | ||
Line 153: | Line 234: | ||
end | end | ||
table.sort(sortedTable, function(a,b) | table.sort(sortedTable, function(a,b) | ||
return a. | return a.Name < b.Name | ||
end) | end) | ||
return sortedTable | return sortedTable | ||
end | end | ||
function tableContains(table, value) | |||
for i = 1,#table do | |||
if (table[i] == value) then | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
--[[ | |||
Usage: {{#invoke:Cards|CardInfobox|<card>|<template_params>}} | |||
returns the infobox of the card. | |||
<template_params> is a list of template parameters input as multiple parameters, ie <p1>=<data1>|<p2>=<data2>|... etc. | |||
These parameters are the same parameters used by Template:Infobox | |||
Parameters without inputs are autofilled with fitting module data, to the best of its ability. | |||
]] | |||
function p.CardInfobox(frame) | function p.CardInfobox(frame) | ||
local card = frame.args[1] | local card = frame.args[1] | ||
Line 166: | Line 264: | ||
function _cardInfobox(card, params) | function _cardInfobox(card, params) | ||
local out = "{{infobox|category=Card" | local out = "{{infobox|category=Card" | ||
out = out .. "|name=" .. (params.name or card.Name or "") | out = out .. "|name=" .. (params.name or _getName(card) or card.Name or "<br>") | ||
out = out .. "|image=" .. (params.image or "") | out = out .. "|image=" .. (params.image or "") | ||
out = out .. "|width=" .. (params.width or "") | out = out .. "|width=" .. (params.width or "") | ||
Line 174: | Line 272: | ||
out = out .. "|hpType=scrap" | out = out .. "|hpType=scrap" | ||
end | end | ||
out = out .. "|health=" .. (params.health or card.Health or card.Scrap or "") | out = out .. "|health=" .. (params.health or card.Health or card.Scrap or "<br>") | ||
out = out .. "|attack=" .. (params.attack or card.Attack or "") | out = out .. "|attack=" .. (params.attack or card.Attack or "<br>") | ||
out = out .. "|counter=" .. (params.counter or card.Counter or "") | out = out .. "|counter=" .. (params.counter or card.Counter or "<br>") | ||
out = out .. "|other=<div style=\"text-align: center;\">" .. (params.other or card.Other or "") .. "</div>" | out = out .. "|other=<div style=\"text-align: center;\">" .. (params.other or card.Other or "<br>") .. "</div>" | ||
out = out .. "|description=" .. (params.description or card.Desc or "") | out = out .. "|description=" .. (params.description or _getDesc(card) or card.Desc or "<br>") | ||
out = out .. "|desCol=" .. (params.desCol or "") | |||
if params.art then | |||
out = out .. "|art=" .. params.art | |||
else | |||
out = out .. "|art=" .. (card.Image or card.UniqueName or card.Name) .. ".png" | |||
end | |||
out = out .. "}}" | out = out .. "}}" | ||
return out | return out | ||
Line 185: | Line 289: | ||
function trim(str) | function trim(str) | ||
return str:match( "^%s*(.-)%s*$" ) | return str:match( "^%s*(.-)%s*$" ) | ||
end | |||
--[[ | |||
Usage: {{#invoke:Cards|CharmInfobox|<card>|<template_params>}} | |||
returns the infobox of the charm. | |||
<template_params> is a list of template parameters input as multiple parameters, ie <p1>=<data1>|<p2>=<data2>|... etc. | |||
These parameters are the same parameters used by Template:Infobox | |||
Parameters without inputs are autofilled with fitting module data, to the best of its ability. | |||
]] | |||
function p.CharmInfobox(frame) | |||
local card = frame.args[1] | |||
card = trim(card) | |||
return frame:preprocess(_charmInfobox(all_cards[card], frame.args)) | |||
end | |||
function _charmInfobox(card, params) | |||
local out = "{{infobox|category=Charm" | |||
out = out .. "|name=" .. (params.name or _getName(card) or card.Name or "<br>") | |||
out = out .. "|image=" .. (params.image or "") | |||
out = out .. "|width=" .. (params.width or "") | |||
out = out .. "|description=" .. (params.description or _getDesc(card) or card.Desc or "<br>") | |||
out = out .. "}}" | |||
return out | |||
end | |||
--[[ | |||
Usage: {{#invoke:Cards|Itembox|<card>|<template_params>}} | |||
returns the itembox of the card. | |||
<template_params> is a list of template parameters input as multiple parameters, ie <p1>=<data1>|<p2>=<data2>|... etc. | |||
These parameters are the same parameters used by Template:Itembox | |||
Parameters without inputs are autofilled with fitting module data, to the best of its ability. | |||
]] | |||
function p.Itembox(frame) | |||
local card = frame.args[1] | |||
card = trim(card) | |||
return frame:preprocess(_itembox(all_cards[card], frame.args)) | |||
end | |||
function _itembox(card, params) | |||
local out = "{{itembox|category=Card" | |||
out = out .. "|name=" .. (params.name or _getName(card) or card.Name or "<br>") | |||
out = out .. "|image=" .. (params.image or "") | |||
out = out .. "|attack=" .. (params.attack or card.Attack or "<br>") | |||
out = out .. "|other=<div style=\"text-align: center;\">" .. (params.other or card.Other or "<br>") .. "</div>" | |||
out = out .. "|description=" .. (params.description or _getDesc(card) or card.Desc or "<br>") | |||
out = out .. "|desCol=" .. (params.desCol or "") | |||
if params.art then | |||
out = out .. "|art=" .. params.art | |||
else | |||
out = out .. "|art=" .. (card.Image or card.UniqueName or card.Name) .. ".png" | |||
end | |||
out = out .. "}}" | |||
return out | |||
end | end | ||
Line 191: | Line 350: | ||
returns a list of links for cards of a certain type. For use in navboxes. | returns a list of links for cards of a certain type. For use in navboxes. | ||
possible values for <type>: Boss Pet NonPetCompanion Companion Item Shade Clunker EnemyClunker Enemy Miniboss Boss | possible values for <type>: Boss Pet NonPetCompanion Companion Item Shade Clunker EnemyClunker Enemy Miniboss Boss ShopItem | ||
]] | ]] | ||
function p.NavBoxSection(frame) | function p.NavBoxSection(frame) | ||
Line 208: | Line 367: | ||
out = out .. " • " | out = out .. " • " | ||
end | end | ||
out = out.. "[[" .. (card.Link or card.UniqueName) .. "|" .. card | out = out.. "<div style=\"display: inline-block;\">[[" .. (card.Link or card.UniqueName) .. "|" .. _getName(card) .. "]]</div>" | ||
end | end | ||
end | end |
Latest revision as of 09:33, 13 June 2024
To edit card information, see Module:Cards/data
GetStat
Usage: {{#invoke:Cards|GetStat|<card>|<stat>}}
Returns the respective stat of the card.
Possible values for <stat>
: name health scrap attack counter other desc summoncon tribes price gold challenge unlock
Table
Usage: {{#invoke:Cards|Table|<entry>|<header_list>}}
OR
{{#invoke:Cards|Table|<entry_list>|*|<header_list>}}
Returns a table based on the given paramenters.
<entry>
is either a card name or type.
Types include: Boss Pet NonPetCompanion Companion Item Shade Clunker EnemyClunker Enemy Miniboss Boss ShopItem InventorsHut HotSpring Charm CursedCharm
Append a tribename before the type to filter cards exclusive to that tribe, eg SnowdwellersCompanion
<entry_list>
is a list of valid <entry>
values, input as multiple parameters, i.e. <entry1>|<entry2>|... etc.
.
<header_list>
is a list of valid stats, input as multiple parameters, i.e. <stat1>|<stat2>|... etc.
.
Stats include: name health scrap attack counter other desc summoncon tribes price challenge
The first usage option is used when only 1 entry is needed, e.g. the only entry is a type category. Otherwise, use the second option.
If challenge
is among the header stats, the table will be sorted based off the entry's ChallengeOrder
value, if it exists.
CardInfobox
Usage: {{#invoke:Cards|CardInfobox|<card>|<template_params>}}
Returns the infobox of the card.
<template_params>
is a list of template parameters input as multiple parameters, i.e. <p1>=<data1>|<p2>=<data2>|... etc.
.
These parameters are the same parameters used by Template:Infobox.
Parameters without inputs are autofilled with fitting module data, to the best of its ability.
CharmInfobox
Usage: {{#invoke:Cards|CharmInfobox|<charm>|<template_params>}}
Returns the infobox of the charm.
<template_params>
is a list of template parameters input as multiple parameters, i.e. <p1>=<data1>|<p2>=<data2>|... etc.
.
These parameters are the same parameters used by Template:Infobox.
Parameters without inputs are autofilled with fitting module data, to the best of its ability.
Itembox
Usage: {{#invoke:Cards|Itembox|<card>|<template_params>}}
Returns the itembox of the card.
<template_params>
is a list of template parameters input as multiple parameters, i.e. <p1>=<data1>|<p2>=<data2>|... etc.
.
These parameters are the same parameters used by Template:Itembox.
Parameters without inputs are autofilled with fitting module data, to the best of its ability.
Usage: {{#invoke:Cards|NavBoxSection|<type>}}
Returns a list of links for cards of a certain type, for use in Template:NavboxCards.
suggested values for <type>
: Boss Pet NonPetCompanion Item Shade Clunker EnemyClunker Enemy Miniboss Boss
local p = {} --local KeyData = mw.loadData( 'Module:Code/data') local all_cards = require("Module:Cards/data").cards local all_langs = require("Module:Other_Languages/data").cards --[[ Usage: {{#invoke:Cards|GetStat|<card>|<stat>}} returns the respective stat of the card. possible values for <stat>: name health scrap attack counter other desc summoncon tribes price challenge ]] function p.GetStat(frame) local card = all_cards[frame.args.name or frame.args[1]] if card == nil then return "" end local stat = frame.args.stat or frame.args[2] stat = trim(stat) local langCode = frame:expandTemplate{ title = 'USERLANG' } or 'en' return frame:preprocess(_getStat(card, stat, langCode)) end function _getStat(card, stat, langCode) local langCode = langCode or mw.getCurrentFrame():expandTemplate{ title = 'USERLANG' } or 'en' stat = string.lower(stat) if stat == "name" then return _getName(card, langCode) or "" elseif stat == "health" then return card.Health or "" elseif stat == "scrap" then return card.Scrap or "" elseif stat == "attack" then return card.Attack or "" elseif stat == "counter" then return card.Counter or "" elseif stat == "other" then return card.Other or "" elseif stat == "description" or stat == "desc" then return _getDesc(card, langCode) or "" elseif stat == "summoncon" then return card.SummonCon or "" elseif stat == "tribes" then local out = "" for i, tribe in ipairs(card.Tribes) do out = out .. "[[Tribes#" .. tribe .. "|".. tribe.."]]" if i < #card.Tribes then out = out .. ",<br>" end end return out elseif stat == "gold" then return card.Gold or "" elseif stat == "price" then return card.Price or "" elseif stat == "unlock" then return card.Unlock or "" elseif stat == "challenge" then return card.Challenge or "" else error("Argument Invalid:" .. stat) -- why is this necessary end end function _getOtherLangs(card) if all_langs[card.UniqueName] then return all_langs[card.UniqueName] end if all_langs[card.Name] then return all_langs[card.Name] end for _, langs in pairs(all_langs) do if langs.en.Name == card.Name then return langs end end -- if no matches, the parent functions default to en end function _getName(card, langCode) local target = langCode or mw.getCurrentFrame():expandTemplate{ title = 'USERLANG' } or "en" if target ~= "en" and _getOtherLangs(card) and _getOtherLangs(card)[target] then return _getOtherLangs(card)[target].Name or "" end return card.Name or "" end function _getDesc(card, langCode) local target = langCode or mw.getCurrentFrame():expandTemplate{ title = 'USERLANG' } or "en" if target ~= "en" and _getOtherLangs(card) and _getOtherLangs(card)[target] then return _getOtherLangs(card)[target].Desc or "" end return card.Desc or "" end function p.testlang(name) mw.log(_getStat(all_cards[name], "name"), _getName(all_cards[name], "ja")) end --[[ Usage: {{#invoke:Cards|Table|<entry>|<header_list>}} OR {{#invoke:Cards|Table|<entry_list>|*|<header_list>}} returns a table based on the given paramenters. <entry> is either a card name or type. Types include: Boss Pet NonPetCompanion Companion Item Shade Clunker EnemyClunker Enemy Miniboss Boss ShopItem Append a tribename before the type to filter cards exclusive to that tribe, eg "SnowdwellersCompanion" <entry_list> is a list of valid <entry> values, input as multiple parameters, ie <entry1>|<entry2>|... etc. <header_list> is a list of valid stats, input as multiple parameters, ie <stat1>|<stat2>|... etc. stats include: name health scrap attack counter other desc summoncon tribes price The first usage option is used when only 1 entry is needed, eg the only entry is a type category. otherwise, use the second option. ]] function p.Table(frame) local arr = {{}, {}} local i = 1 while frame.args[i] ~= nil and trim(frame.args[i]) ~= "*" do table.insert(arr[1], trim(frame.args[i]) or "") i = i + 1 end if frame.args[i] ~= nil then i = i + 1 while frame.args[i] ~= nil do table.insert(arr[2], string.lower(trim(frame.args[i]) or "")) i = i + 1 end else for i=2,#arr[1] do arr[2][i-1] = string.lower(arr[1][i]) end arr[1] = {arr[1][1]} end return frame:preprocess(_table(arr[1], arr[2])) end function p.testy() return _table({"Pet", "SnowdwellersNonPetCompanion"}, {"name", "desc", "challenge"}) end function _table(entries, headers) local sortByChallenge = false local out = '{| class="wikitable sortable" style="text-align:center;"\n' for i, header in ipairs(headers) do if header == "scrap" or header == "health" or header == "attack" or header == "counter" then local statname = header:gsub("^%l", string.upper) out = out .. "![[File:"..statname..".png|20px|link=Stats#Primary Stats]] "..statname.."\n" elseif header == "tribes" then out = out .. "!Tribe-exclusive?\n" elseif header == "name" then out = out .. "!Card Name\n" elseif header == "desc" then out = out .. "!Description\n" elseif header == "summoncon" then out = out .. "!Summon conditions\n" elseif header == "challenge" then out = out .. "!Challenge\n" sortByChallenge = true else out = out .. "!" .. header:gsub("^%l", string.upper) .. "\n" --Covers all cases where the stat name and intended header are equal end end local entryList = {} for i, entry in ipairs(entries) do if all_cards[entry] then all_cards[entry].UniqueName = entry table.insert(entryList, all_cards[entry]) else -- entry is a type category local tribe = nil for _, tribename in ipairs({"Snowdwellers", "Shademancers", "Clunkmasters"}) do if entry:sub(1, #tribename) == tribename then tribe = tribename entry = entry:sub(1+#tribename) end end for i, card in ipairs(sortedCards()) do if card.Types and card.Types[entry] and (tribe == nil or (tribe and card.Tribes and tableContains(card.Tribes, tribe))) then table.insert(entryList, card) end end end end if sortByChallenge then table.sort(entryList, function(a,b) if a.ChallengeOrder and b.ChallengeOrder then return a.ChallengeOrder and b.ChallengeOrder and a.ChallengeOrder < b.ChallengeOrder elseif a.ChallengeOrder ~= b.ChallengeOrder then return a.ChallengeOrder and true else return a.Name < b.Name end end) end for i, card in ipairs(entryList) do out = out.."|-\n" for i, header in ipairs(headers) do out = out.."|" if header == "image" then if card.Types and (card.Types["Charm"] or card.Types["CursedCharm"]) then out = out.."{{CharmArt|" else out = out.."{{CardArt|" end out = out.. (card.Image or card.UniqueName) .."}}" elseif header == "name" then local link = card.Link or card.UniqueName out = out.."style=\"text-align:center;\"|[[".. link .. "|" .. _getName(card) .."]]" elseif header == "description" or header == "desc" or header == "summoncon" then out = out.."style=\"text-align:center;\"|".. (_getStat(card, header) or "") elseif header == "health" and card.Health == nil and card.Scrap then out = out.. card.Scrap .." {{Stat|Scrap}}" else out = out .. _getStat(card, header) end out = out.."\n" end end return out .. "|}" end function sortedCards() local sortedTable = {} for name, card in pairs(all_cards) do card.UniqueName = name table.insert(sortedTable, card) end table.sort(sortedTable, function(a,b) return a.Name < b.Name end) return sortedTable end function tableContains(table, value) for i = 1,#table do if (table[i] == value) then return true end end return false end --[[ Usage: {{#invoke:Cards|CardInfobox|<card>|<template_params>}} returns the infobox of the card. <template_params> is a list of template parameters input as multiple parameters, ie <p1>=<data1>|<p2>=<data2>|... etc. These parameters are the same parameters used by Template:Infobox Parameters without inputs are autofilled with fitting module data, to the best of its ability. ]] function p.CardInfobox(frame) local card = frame.args[1] card = trim(card) return frame:preprocess(_cardInfobox(all_cards[card], frame.args)) end function _cardInfobox(card, params) local out = "{{infobox|category=Card" out = out .. "|name=" .. (params.name or _getName(card) or card.Name or "<br>") out = out .. "|image=" .. (params.image or "") out = out .. "|width=" .. (params.width or "") if params.hpType then out = out .. "|hpType=" .. params.hpType elseif card.Health == nil and card.Scrap then out = out .. "|hpType=scrap" end out = out .. "|health=" .. (params.health or card.Health or card.Scrap or "<br>") out = out .. "|attack=" .. (params.attack or card.Attack or "<br>") out = out .. "|counter=" .. (params.counter or card.Counter or "<br>") out = out .. "|other=<div style=\"text-align: center;\">" .. (params.other or card.Other or "<br>") .. "</div>" out = out .. "|description=" .. (params.description or _getDesc(card) or card.Desc or "<br>") out = out .. "|desCol=" .. (params.desCol or "") if params.art then out = out .. "|art=" .. params.art else out = out .. "|art=" .. (card.Image or card.UniqueName or card.Name) .. ".png" end out = out .. "}}" return out end function trim(str) return str:match( "^%s*(.-)%s*$" ) end --[[ Usage: {{#invoke:Cards|CharmInfobox|<card>|<template_params>}} returns the infobox of the charm. <template_params> is a list of template parameters input as multiple parameters, ie <p1>=<data1>|<p2>=<data2>|... etc. These parameters are the same parameters used by Template:Infobox Parameters without inputs are autofilled with fitting module data, to the best of its ability. ]] function p.CharmInfobox(frame) local card = frame.args[1] card = trim(card) return frame:preprocess(_charmInfobox(all_cards[card], frame.args)) end function _charmInfobox(card, params) local out = "{{infobox|category=Charm" out = out .. "|name=" .. (params.name or _getName(card) or card.Name or "<br>") out = out .. "|image=" .. (params.image or "") out = out .. "|width=" .. (params.width or "") out = out .. "|description=" .. (params.description or _getDesc(card) or card.Desc or "<br>") out = out .. "}}" return out end --[[ Usage: {{#invoke:Cards|Itembox|<card>|<template_params>}} returns the itembox of the card. <template_params> is a list of template parameters input as multiple parameters, ie <p1>=<data1>|<p2>=<data2>|... etc. These parameters are the same parameters used by Template:Itembox Parameters without inputs are autofilled with fitting module data, to the best of its ability. ]] function p.Itembox(frame) local card = frame.args[1] card = trim(card) return frame:preprocess(_itembox(all_cards[card], frame.args)) end function _itembox(card, params) local out = "{{itembox|category=Card" out = out .. "|name=" .. (params.name or _getName(card) or card.Name or "<br>") out = out .. "|image=" .. (params.image or "") out = out .. "|attack=" .. (params.attack or card.Attack or "<br>") out = out .. "|other=<div style=\"text-align: center;\">" .. (params.other or card.Other or "<br>") .. "</div>" out = out .. "|description=" .. (params.description or _getDesc(card) or card.Desc or "<br>") out = out .. "|desCol=" .. (params.desCol or "") if params.art then out = out .. "|art=" .. params.art else out = out .. "|art=" .. (card.Image or card.UniqueName or card.Name) .. ".png" end out = out .. "}}" return out end --[[ Usage: {{#invoke:Cards|NavBoxSection|<type>}} returns a list of links for cards of a certain type. For use in navboxes. possible values for <type>: Boss Pet NonPetCompanion Companion Item Shade Clunker EnemyClunker Enemy Miniboss Boss ShopItem ]] function p.NavBoxSection(frame) local type = frame.args[1] return frame:preprocess(_navBoxSection(type)) end function _navBoxSection(type) local out = "" local first = true for i, card in ipairs(sortedCards()) do if card.Types and card.Types[type] then if first then first = false else out = out .. " • " end out = out.. "<div style=\"display: inline-block;\">[[" .. (card.Link or card.UniqueName) .. "|" .. _getName(card) .. "]]</div>" end end return out end return p