Module:CraftingTable
Documentation for this module may be created at Module:CraftingTable/doc
-- Module:CraftingTable – animated crafting-grid slots
local p = {}
local getArgs = require('Module:Arguments').getArgs
----------------------------------------------------------------------
-- helper : 32-px inventory-slot image
----------------------------------------------------------------------
local function slotImage(label, image, link)
if not label or label == '' then return '' end
local file = (image ~= '' and image) or ('Grid_' .. label .. '.png')
local tgt = (link ~= '' and link ) or ('Special:MyLanguage/' .. label)
return string.format(
'[[File:%s|32px|class=pixelated|link=%s|alt=%s]]',
file, tgt, label
)
end
----------------------------------------------------------------------
-- public entry – {{#invoke:CraftingTable|grid|…}}
----------------------------------------------------------------------
function p.grid(frame)
local args = getArgs(frame, {removeBlanks = false})
-- slot coordinates (input 3×3 + output)
local slots = {
A1 = {left='14px', top='14px'}, A2 = {left='14px', top='50px'},
A3 = {left='14px', top='86px'}, B1 = {left='50px', top='14px'},
B2 = {left='50px', top='50px'}, B3 = {left='50px', top='86px'},
C1 = {left='86px', top='14px'}, C2 = {left='86px', top='50px'},
C3 = {left='86px', top='86px'}, Output = {left='202px', top='50px'},
}
-- outer <div> collects everything
local root = mw.html.create()
------------------------------------------------------------------
-- helper to collect *all* numbered parameters for one slot
------------------------------------------------------------------
local function collectItems(base)
local out = {}
local idx = 1
while true do
local lblKey = (idx == 1) and base or (base .. '-' .. idx)
local label = args[lblKey]
if not label or label == '' then break end -- finished
local imgKey = lblKey .. '-image'
local lnkKey = lblKey .. '-link'
table.insert(out, {
label = label,
image = args[imgKey] or '',
link = args[lnkKey] or '',
})
idx = idx + 1
end
return out
end
-- build every slot that has at least one item
for slot, pos in pairs(slots) do
local items = collectItems(slot)
if #items > 0 then
-- wrapper positioned at correct GUI coords
local holder = root:tag('div')
:css('position','absolute')
:css('left', pos.left):css('top', pos.top)
:css('width','32px'):css('height','32px')
if #items == 1 then
-- static single image
holder:wikitext(slotImage(items[1].label, items[1].image, items[1].link))
else
-- multiple frames → animation
for i, itm in ipairs(items) do
holder:tag('div')
:addClass('slot-frame')
:css('animation-duration', (#items * 4) .. 's')
:css('animation-delay', ((i - 1) * 4) .. 's')
:wikitext(slotImage(itm.label, itm.image, itm.link))
end
end
end
end
-- shapeless icon
if args.shapeless and args.shapeless ~= '' then
root:tag('div')
:css('position','absolute')
:css('left','135px'):css('top','96px')
:css('width','19px'):css('height','15px')
:wikitext('{{tt|[[File:Shapeless.png|link=]]|This recipe is shapeless; the ingredients may be placed in any arrangement in the crafting grid.}}')
end
-- output-amount overlay
if args.OA and args.OA ~= '' then
root:tag('div')
:css('position','absolute')
:css('left','201px'):css('top','71px')
:css('width','64px'):css('height','24px')
:css('overflow','hidden')
:wikitext(string.format('{{GridText|white|%s}}', args.OA))
end
return tostring(root)
end
return p