Module:CraftingTable

From Pixelrus
Revision as of 23:07, 14 June 2025 by NewAdmin (talk | contribs) (Created page with "-- 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')...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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