Module:Cards
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 == "challenge" then return card.Challenge or "" else error("Argument Invalid:" .. stat) 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 <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", "EnemyClunker"}, {"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 for i, card in ipairs(sortedCards()) do if card.Types and card.Types[entry] 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 out = out.."{{CardArt|".. (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 --[[ 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 elseif card.Image ~= nil or card.UniqueName ~= nil then out = out .. "|art=" .. (card.Image or card.UniqueName) .. ".png" end out = out .. "}}" return out end function _cardArt(card, title) end function trim(str) return str:match( "^%s*(.-)%s*$" ) 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 "") 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