Module:TowerCard
Documentation for this module may be created at Module:TowerCard/doc
local p = {}
local ICON = {
coins = '[[File:CoinV2.png|24px|link=|Coins]]',
gems = '[[File:GemV3.png|24px|link=|Gems]]',
robux = '[[File:RobuxIcon.svg|24px|link=|Robux]]',
none = '',
}
ICON.coin, ICON.gem = ICON.coins, ICON.gems
local RAAAAAAAH = {
starter = 'colour-common', intermediate = 'colour-uncommon', advanced = 'colour-rare',
hardcore = 'colour-hardcoremode', evolved = 'colour-rare', golden = 'colour-golden',
exclusive = 'colour-ultimate', unavailable = 'colour-event',
}
local EXTRA_SLOTS = { '2', '3' }
local lower, trim = mw.ustring.lower, mw.text.trim
local function val(v)
if v and v ~= '' then return v end
end
local function icon(currency)
return ICON[lower(val(currency) or 'coins')] or ICON.coins
end
local function costs(a, s)
local list, cost = {}, val(a['cost' .. s])
if cost then
for part in mw.text.gsplit(cost, '+', true) do
local amount, currency = trim(part):match('^(%S+)%s*(.*)$')
if amount then list[#list + 1] = { amount, currency } end
end
else
local price = 'price' .. s
list[1] = { a[price] or '', a['currency' .. s] }
if val(a[price .. '_b']) then
list[2] = { a[price .. '_b'], a['currency' .. s .. '_b'] }
end
end
return list
end
local function method(row, a, s)
local m = row:tag('span'):addClass('tower-card-method')
local unlock = val(a['unlock' .. s])
if unlock then
m:tag('span'):addClass('tower-card-amount'):wikitext(unlock)
return
end
local list = costs(a, s)
local combo = #list > 1
if combo then m:addClass('combo') end
for _, c in ipairs(list) do
local box = combo and m:tag('span'):addClass('tower-card-cost') or m
box:wikitext(icon(c[2])):tag('span'):addClass('tower-card-amount'):wikitext(c[1])
end
end
local function hasMethod(a, s)
return val(a['price' .. s]) or val(a['unlock' .. s]) or val(a['cost' .. s])
end
function p._card(a)
local name = trim(a.name or a[1] or '')
if name == '' then return '' end
local tier = val(a.tier) or 'Starter'
local tkey = lower(tier)
local link = val(a.link) or name
local note, req = val(a.note), val(a.req)
local card = mw.html.create('div')
:addClass('tower-card')
:addClass('tier-' .. tkey)
:addClass(RAAAAAAAH[tkey] or 'colour-common')
:addClass(note and 'has-note' or nil)
:addClass(req and 'has-req' or nil)
card:tag('span'):addClass('tower-card-link'):wikitext('[[', link, '|​]]')
card:tag('div'):addClass('tower-card-render')
:wikitext('[[File:', val(a.image) or (name .. 'Icon.png'), '|256px|link=|alt=', name, ']]')
card:tag('div'):addClass('tower-card-name'):css('--tc-len', mw.ustring.len(name)):wikitext(name)
card:tag('div'):addClass('tower-card-tier'):wikitext(val(a.label) or tier)
if req then
local reqs = card:tag('div'):addClass('tower-card-reqs')
reqs:tag('span'):addClass('tower-card-req')
:tag('span'):addClass('ego-i i-lock-fill'):attr('aria-hidden', 'true'):done()
:wikitext(req)
if val(a.req2) then reqs:tag('span'):addClass('tower-card-req'):wikitext(a.req2) end
end
local row, n = card:tag('div'):addClass('tower-card-price'), 1
method(row, a, '')
for _, s in ipairs(EXTRA_SLOTS) do
if hasMethod(a, s) then
n = n + 1
method(row, a, s)
end
end
row:addClass('n' .. n)
if note then
card:tag('span'):addClass('tower-card-info')
:attr({ tabindex = '0', role = 'button', ['aria-label'] = 'Notes for ' .. name })
:tag('span'):addClass('ego-i i-info-lg'):attr('aria-hidden', 'true')
card:tag('div'):addClass('tower-card-note'):wikitext(note)
end
return tostring(card)
end
function p.heeho(frame)
return p._card(frame:getParent().args)
end
return p