Module:Sprite: Difference between revisions
Jump to navigation
Jump to search
(Remove sprite level inline support) |
(Added Custom Sprite Support) |
||
Line 14: | Line 14: | ||
align = 'text-top' | align = 'text-top' | ||
} | } | ||
function getImage( image ) | |||
if not(image) then return nil end | |||
local file = mw.title.new(image,"File").file | |||
if not(file.exists) then return nil end | |||
local f = mw.getCurrentFrame() | |||
local t = { | |||
url = f:expandTemplate{ | |||
title = 'FileUrl', | |||
args = { image} | |||
} | |||
} | |||
setmetatable(t, {__index = file}) | |||
return t | |||
end | |||
function Sprite:new (type) | function Sprite:new (type) | ||
source = types[type] | local source = types[type] | ||
if not(source) then | if not(source) then | ||
error("Unknown type: " .. tostring(type)) | error("Unknown type: " .. tostring(type)) | ||
end | end | ||
o = { | o = { | ||
__source = require(source), | |||
} | |||
setmetatable(o, {__index = self}) | |||
o:load() | |||
return o | |||
end | |||
Sprite.Custom = {} | |||
setmetatable(Sprite.Custom, {__index = Sprite}) | |||
local CustomSprite = Sprite.Custom | |||
function CustomSprite:new(name, imagename) | |||
local image = getImage(imagename) | |||
if not(image) then | |||
error("Couldn't find image: " .. tostring(imagename)) | |||
end | |||
local size = image.width | |||
o = { | |||
__source = { | |||
settings={ | |||
ids={[name]=1}, | |||
size = size, | |||
sheetsize = size, | |||
image = image | |||
} | |||
} | |||
} | } | ||
setmetatable(o, {__index = self}) | setmetatable(o, {__index = self}) | ||
Line 36: | Line 82: | ||
scale = settings.scale, | scale = settings.scale, | ||
autoScale = settings.autoscale, | autoScale = settings.autoscale, | ||
image = settings.image or getImage(settings.imagename) | |||
} | } | ||
Line 77: | Line 124: | ||
function Sprite:calculateStyles() | function Sprite:calculateStyles() | ||
styles = {} | styles = {} | ||
function append(key, value) styles[#styles+1]=key .. ": " .. value | function append(key, value) if value ~= nil then styles[#styles+1]=key .. ": " .. value end end | ||
local settings = self.__settings | local settings = self.__settings | ||
Line 92: | Line 139: | ||
local top = math.floor( pos / settings.tiles ) * settings.size * settings.scale | local top = math.floor( pos / settings.tiles ) * settings.size * settings.scale | ||
append("background-position", '-' .. left .. 'px -' .. top .. 'px') | append("background-position", '-' .. left .. 'px -' .. top .. 'px') | ||
if settings.image then | |||
append("background", "url(" .. settings.image.url .. ")") | |||
end | |||
return table.concat( styles, "; " ) | return table.concat( styles, "; " ) | ||
Line 99: | Line 149: | ||
local sprite | local sprite | ||
if html then | if html then | ||
sprite = html:tag("div") | if type(html) == "string" then | ||
sprite = mw.html.create(html) | |||
else | |||
sprite = html:tag("div") | |||
end | |||
else | else | ||
sprite = mw.html.create("div") | sprite = mw.html.create("div") |
Revision as of 16:59, 2 July 2019
See Also
-- Based on work by the MC wiki: https://minecraft.gamepedia.com/ and https://minecraft.gamepedia.com/Module:Sprite
local Sprite = {}
local types = {
inventory = [[Module:InvSprite]],
}
local defaultSettings = {
scale = 1,
sheetsize = 256,
size = 16,
pos = 1,
align = 'text-top'
}
function getImage( image )
if not(image) then return nil end
local file = mw.title.new(image,"File").file
if not(file.exists) then return nil end
local f = mw.getCurrentFrame()
local t = {
url = f:expandTemplate{
title = 'FileUrl',
args = { image}
}
}
setmetatable(t, {__index = file})
return t
end
function Sprite:new (type)
local source = types[type]
if not(source) then
error("Unknown type: " .. tostring(type))
end
o = {
__source = require(source),
}
setmetatable(o, {__index = self})
o:load()
return o
end
Sprite.Custom = {}
setmetatable(Sprite.Custom, {__index = Sprite})
local CustomSprite = Sprite.Custom
function CustomSprite:new(name, imagename)
local image = getImage(imagename)
if not(image) then
error("Couldn't find image: " .. tostring(imagename))
end
local size = image.width
o = {
__source = {
settings={
ids={[name]=1},
size = size,
sheetsize = size,
image = image
}
}
}
setmetatable(o, {__index = self})
o:load()
return o
end
function Sprite:load()
local settings = self.__source.settings
self.__settings = {
size = settings.size,
sheetWidth = settings.sheetsize,
tiles = settings.sheetsize / settings.size,
scale = settings.scale,
autoScale = settings.autoscale,
image = settings.image or getImage(settings.imagename)
}
setmetatable(self.__settings, {__index=defaultSettings})
end
function Sprite:setItem(item)
self.__settings.name = item;
if self.__source.ids[item] then
self:setPosition(self.__source.ids[item].pos)
else
self:setPosition(nil) --will use default
end
return self
end
function Sprite:Item(item)
local sprite = {}
setmetatable(sprite, {__index = self})
local settings = {}
setmetatable(settings, {__index = self.__settings})
sprite.__settings = settings
return sprite:setItem(item)
end
function Sprite:setPosition(pos)
self.__settings.pos = pos or self.__settings.pos
return self
end
function Sprite:SetScale(scale)
self.__settings.scale = scale
return self
end
function Sprite:SetSize(size)
self.__settings.scale = size / self.__settings.size
return self
end
function Sprite:calculateStyles()
styles = {}
function append(key, value) if value ~= nil then styles[#styles+1]=key .. ": " .. value end end
local settings = self.__settings
append ("background-size", settings.sheetWidth * settings.scale .. 'px auto')
local t = settings.size * settings.scale .. 'px'
append ("height", t)
append ("width", t)
append ("vertical-align", settings.align)
local pos = self.__settings.pos - 1
local left = pos % settings.tiles * settings.size * settings.scale
local top = math.floor( pos / settings.tiles ) * settings.size * settings.scale
append("background-position", '-' .. left .. 'px -' .. top .. 'px')
if settings.image then
append("background", "url(" .. settings.image.url .. ")")
end
return table.concat( styles, "; " )
end
function Sprite:GenerateHTML (html)
local sprite
if html then
if type(html) == "string" then
sprite = mw.html.create(html)
else
sprite = html:tag("div")
end
else
sprite = mw.html.create("div")
end
sprite:addClass("sprite")
local source = self.__source
sprite:addClass(source.settings.classname)
sprite:attr( "title", self.__settings.name )
sprite:cssText( self:calculateStyles() )
return sprite
end
return Sprite