Module:Sprite

From Official Gamemode 4 Wiki
Revision as of 13:31, 8 November 2018 by Kroppeb (talk | contribs) (Was confused by local scope)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
-- 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 Sprite:new (type)
	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

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,
	}
	local lSet = self.__settings

	setmetatable(lSet, {__index=defaultSettings})


	styles = {}
	--[[styles["background-image"] = (settings.url and "url(" .. settings.url .. ")") or mw.getCurrentFrame():expandTemplate{
			title = 'FileUrl',
			args = { settings.image}
		} ]]
	styles["background-size"] = lSet.sheetWidth * lSet.scale .. 'px auto'

	local t = lSet.size * lSet.scale .. 'px'

	styles.height = t
	styles.width = t
	styles["vertical-align"] = lSet.align
	self.__styles = styles
end

function Sprite:setItem(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})
	return sprite:setItem(item)
end

function Sprite:setPosition(pos)
	local settings = self.__settings

	local pos = (pos or settings.pos) - 1

	local left = pos % settings.tiles * settings.size * settings.scale
	local top = math.floor( pos / settings.tiles ) * settings.size * settings.scale
	self.__styles["background-position"] = '-' .. left .. 'px -' .. top .. 'px'

	settings.pos = pos
	return self
end

function Sprite:GenerateHTML (html)
	local sprite
	if html then
		sprite = html:tag("div")
	else
		sprite = mw.html.create("div")
	end

	sprite:addClass("sprite")

	local source = self.__source
	sprite:addClass(source.settings.classname)

	local styles = {}
	for k,v in pairs(self.__styles) do
		styles[#styles + 1] = k .. ":" .. v
	end

	sprite:cssText( table.concat( styles, "; " ) )

	return sprite
end

return Sprite