Модуль:Entity Sprite: различия между версиями

Материал из Space Station 14 Вики
мНет описания правки
мНет описания правки
Строка 6: Строка 6:
-- Функция для получения таблицы данных
-- Функция для получения таблицы данных
function p.getData()
function p.getData()
    return spriteData
return spriteData
end
end


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


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


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


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


    return nil
return nil
end
end


-- Функция получения state
local function firstKey(tbl)
local function getSpriteState(entry)
for k,_ in pairs(tbl) do
    local iconBlock = findFieldInsensitive(entry, "Icon")
return k
    if iconBlock and iconBlock.state then
end
        return iconBlock.state
    end
 
    local spriteBlock = findFieldInsensitive(entry, "Sprite")
    if spriteBlock then
        if spriteBlock.state then
            return spriteBlock.state
        elseif spriteBlock.layers then
            for _, layer in pairs(spriteBlock.layers) do
                if layer.state then
                    return layer.state
                end
            end
        end
    end
 
    return nil
end
end


 
-- Новая функция получения списка состояний (множественных) из layers
-- Функция генерации шаблона по записи
local function getSpriteStates(entry)
function p.getSprite(frame)
local states = {}
    local id = frame.args[1]
local spriteBlock = findFieldInsensitive(entry, "Sprite")
    if not id then return "Ошибка: не указан ID" end
if spriteBlock and spriteBlock.layers then
 
for _, layer in ipairs(spriteBlock.layers) do
    for _, entry in ipairs(spriteData) do
if not (layer.visible == false)
        if entry.id == id then
  and layer.state
            return getSpritePath(entry) or "Ошибка: спрайт не найден"
  and firstKey(layer) == "state"
        end
then
    end
table.insert(states, layer.state)
 
end
    return "Ошибка: ID не найден"
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
end


-- Основная функция модуля
-- Функция генерации шаблона по записи (mode: image, path, state)
function p.main(frame)
function p.main(frame)
    local mode = frame.args[1]
local mode = frame.args[1]
    local id = frame.args[2]
local id = frame.args[2]
    if not mode or not id then
if not mode or not id then
        return "Ошибка: отсутствует режим или ID"
return "Ошибка: отсутствует режим или ID"
    end
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 == "image" then
if mode == "path" then
        for _, entry in ipairs(spriteData) do
return "Ошибка: путь не найден"
            if entry.id == id then
elseif mode == "image" then
                local sprite = getSpritePath(entry)
return "Ошибка: ID не найден"
                if sprite then
elseif mode == "state" then
                    return sprite
return "Ошибка: ID не найден"
                else
end
                    return "Ошибка: спрайт не найден"
return "Ошибка: неизвестный режим"
                end
            end
        end
        return "Ошибка: ID не найден"
    elseif mode == "path" then
        for _, entry in ipairs(spriteData) do
            if getSpritePath(entry) == id then
                return entry.id
            end
        end
        return "Ошибка: путь не найден"
    elseif mode == "state" then
        for _, entry in ipairs(spriteData) do
            if entry.id == id then
                local state = getSpriteState(entry)
                if state then
                    return "(state: " .. state .. ")"
                else
                    return ""
                end
            end
        end
        return "Ошибка: ID не найден"
    else
        return "Ошибка: неизвестный режим"
    end
end
end


return p
return p

Версия от 16:59, 10 июня 2025

Шаблон: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