Module:Stonecutting: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 6: | Line 6: | ||
local trim = mw.text.trim | local trim = mw.text.trim | ||
-- helper: 32-px inventory slot image | ------------------------------------------------------------ | ||
-- helper: 32-px inventory-slot image | |||
------------------------------------------------------------ | |||
local function slotImage(label, image, link) | local function slotImage(label, image, link) | ||
if not label or label == '' then return '' end | if not label or label == '' then return '' end | ||
| Line 17: | Line 19: | ||
end | end | ||
-- one GUI frame | ------------------------------------------------------------ | ||
-- build one GUI frame | |||
------------------------------------------------------------ | |||
local function buildFrame(args, idx, count) | local function buildFrame(args, idx, count) | ||
local inL = args.input or args[1] or '' | local inL = args.input or args[1] or '' | ||
| Line 29: | Line 33: | ||
local frame = mw.html.create('div'):addClass('sc-frame') | local frame = mw.html.create('div'):addClass('sc-frame') | ||
if count | if count == 1 then | ||
frame: | frame:addClass('sc-static') -- no animation | ||
else | else | ||
frame: | -- every frame runs the same 4-second “step” once per full cycle | ||
-- total cycle = 4 s × #outputs | |||
frame:css('animation-duration', (count * 4) .. 's') | |||
:css('animation-delay', (idx - 1) * 4 .. 's') | |||
end | end | ||
| Line 53: | Line 59: | ||
end | end | ||
-- main entry | ------------------------------------------------------------ | ||
-- main entry – {{#invoke:Stonecutting|carousel}} | |||
------------------------------------------------------------ | |||
function p.carousel(frame) | function p.carousel(frame) | ||
local args = getArgs(frame, {removeBlanks = false}) | local args = getArgs(frame, {removeBlanks = false}) | ||
| Line 59: | Line 67: | ||
-- how many outputs? | -- how many outputs? | ||
local count = 0 | local count = 0 | ||
while (args['output' .. (count+1)] or args[count+2]) | while (args['output' .. (count+1)] or args[count+2]) | ||
trim(tostring(args['output' .. (count+1)] or args[count+2])) ~= '' do | and trim(tostring(args['output' .. (count+1)] or args[count+2])) ~= '' do | ||
count = count + 1 | count = count + 1 | ||
end | end | ||
| Line 67: | Line 75: | ||
end | end | ||
local outer = mw.html.create('div') | local outer = mw.html.create('div') | ||
:addClass('stonecutting-carousel') | :addClass('stonecutting-carousel') | ||
| Line 76: | Line 83: | ||
end | end | ||
-- static stylesheet | -- static stylesheet is included once from the template, so nothing here | ||
return tostring(outer) | return tostring(outer) | ||
end | end | ||
return p | return p | ||
Latest revision as of 04:31, 14 June 2025
Documentation for this module may be created at Module:Stonecutting/doc
------------------------------------------------------------
-- Module:Stonecutting – animated stone-cutter carousel
------------------------------------------------------------
local p = {}
local getArgs = require('Module:Arguments').getArgs
local trim = mw.text.trim
------------------------------------------------------------
-- 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 label
return string.format(
'[[File:%s|32px|class=pixelated|link=%s|alt=%s]]',
file, tgt, label
)
end
------------------------------------------------------------
-- build one GUI frame
------------------------------------------------------------
local function buildFrame(args, idx, count)
local inL = args.input or args[1] or ''
local inI = args['input-image'] or ''
local inLn = args['input-link'] or ''
local outL = args['output' .. idx] or args[idx+1] or ''
local outI = args['output' .. idx .. '-image'] or ''
local outLn = args['output' .. idx .. '-link'] or ''
local frame = mw.html.create('div'):addClass('sc-frame')
if count == 1 then
frame:addClass('sc-static') -- no animation
else
-- every frame runs the same 4-second “step” once per full cycle
-- total cycle = 4 s × #outputs
frame:css('animation-duration', (count * 4) .. 's')
:css('animation-delay', (idx - 1) * 4 .. 's')
end
frame:wikitext('[[File:StonecutterGUI.png|180px|link=|alt=]]')
frame:tag('div'):addClass('sc-slot')
:css{left='11px', top='50px'}
:wikitext(slotImage(inL, inI, inLn))
frame:tag('div'):addClass('sc-slot')
:css{left='56.5px', top='23px'}
:wikitext(slotImage(outL, outI, outLn))
frame:tag('div'):addClass('sc-slot')
:css{left='127px', top='50px'}
:wikitext(slotImage(outL, outI, outLn))
return tostring(frame)
end
------------------------------------------------------------
-- main entry – {{#invoke:Stonecutting|carousel}}
------------------------------------------------------------
function p.carousel(frame)
local args = getArgs(frame, {removeBlanks = false})
-- how many outputs?
local count = 0
while (args['output' .. (count+1)] or args[count+2])
and trim(tostring(args['output' .. (count+1)] or args[count+2])) ~= '' do
count = count + 1
end
if count == 0 then
return '<span style="color:red">Stonecutting: no outputs supplied</span>'
end
local outer = mw.html.create('div')
:addClass('stonecutting-carousel')
:css{width='180px', height='131px', position='relative'}
for i = 1, count do
outer:wikitext(buildFrame(args, i, count))
end
-- static stylesheet is included once from the template, so nothing here
return tostring(outer)
end
return p