Шаблон:Entity Sprite


-- Загрузка данных
local spriteData = mw.loadData("Модуль:IanComradeBot/prototypes/entity sprite.json/data")

local p = {}

-- Функция для получения таблицы данных
function p.getData()
	return spriteData
end

-- Общая функция нечувствительного к регистру поиска поля
local function findFieldInsensitive(tbl, fieldName)
	for key, value in pairs(tbl) do
		if type(key) == "string" and mw.ustring.lower(key) == mw.ustring.lower(fieldName) then
			return value
		end
	end
	return nil
end

-- Функция получения пути спрайта
local function getSpritePath(entry)
	local spriteBlock = findFieldInsensitive(entry, "Icon")
					   or findFieldInsensitive(entry, "Sprite")
	if not spriteBlock then
		return nil
	end

	if type(spriteBlock) == "string" then
		return spriteBlock
	end

	if spriteBlock.sprite then
		return spriteBlock.sprite
	elseif spriteBlock.layers then
		for _, layer in pairs(spriteBlock.layers) do
			if layer.sprite then
				return layer.sprite
			end
		end
	end

	return nil
end

local function firstKey(tbl)
	for k,_ in pairs(tbl) do
		return k
	end
end

-- Новая функция получения списка состояний (множественных) из layers
local function getSpriteStates(entry)
	local states = {}
	local spriteBlock = findFieldInsensitive(entry, "Sprite")
	if spriteBlock and spriteBlock.layers then
		for _, layer in ipairs(spriteBlock.layers) do
			if not (layer.visible == false)
			   and layer.state
			   and firstKey(layer) == "state"
			then
				table.insert(states, layer.state)
			end
		end
		if #states > 0 then
			return states
		end
	end
	local iconBlock = findFieldInsensitive(entry, "Icon")
	if iconBlock and iconBlock.state then
		return { iconBlock.state }
	end
	if spriteBlock and spriteBlock.state then
		return { spriteBlock.state }
	end
	return nil
end

-- Функция генерации шаблона по записи (mode: image, path, state)
function p.main(frame)
	local mode = frame.args[1]
	local id = frame.args[2]
	if not mode or not id then
		return "Ошибка: отсутствует режим или ID"
	end

	for _, entry in ipairs(spriteData) do
		if entry.id == id then
			if mode == "image" then
				local sprite = getSpritePath(entry)
				return sprite or "Ошибка: спрайт не найден"
			elseif mode == "path" then
				if getSpritePath(entry) == id then
					return entry.id
				end
			elseif mode == "state" then
				local states = getSpriteStates(entry)
				if not states then
					return ""
				end
			
				local joined = table.concat(states, ", ")
				local base = "https://github.com/space-syndicate/space-station-14/blob/master/Resources/Textures/"
							  .. getSpritePath(entry) .. "/"
				joined = mw.ustring.gsub(joined, "([%w_]+)",
					"[" .. base .. "%1.png %1]")
			
				return "(state: " .. joined .. ")"
			end
		end
	end

	if mode == "path" then
		return "Ошибка: путь не найден"
	elseif mode == "image" then
		return "Ошибка: ID не найден"
	elseif mode == "state" then
		return "Ошибка: ID не найден"
	end
	return "Ошибка: неизвестный режим"
end

return p