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

Материал из Space Station 14 Вики
Нет описания правки
Нет описания правки
 
(не показана 31 промежуточная версия этого же участника)
Строка 1: Строка 1:
-- Загрузка данных
-- Загрузка данных
local data = mw.loadData("Module:Entity Sprite/data")
local JsonPaths = require('Module:JsonPaths')
local spriteData = mw.loadData(JsonPaths.get("prototype/sprite.json"))


local p = {}
local p = {}
local function normalizeSpritePath(path)
if path == nil then
return nil
end
path = mw.text.trim(tostring(path))
path = path:gsub("^/Textures/?", "")
return path
end
-- Функция получения таблицы данных
local function getIdTable()
if type(spriteData) == "table" and type(spriteData.id) == "table" then
return spriteData.id
end
return nil
end


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


-- Функция получение пути спрайта
-- Функция получения пути спрайта:
-- 1) сначала entry.sprite
-- 2) потом первый layers[*].sprite
local function getSpritePath(entry)
local function getSpritePath(entry)
    if entry.Sprite and entry.Sprite.sprite then
if not entry then
        return entry.Sprite.sprite
return nil
    elseif entry.Icon and entry.Icon.sprite then
end
        return entry.Icon.sprite
    elseif entry.Sprite and entry.Sprite.layers then
        for _, layer in pairs(entry.Sprite.layers) do
            if layer.sprite then
                return layer.sprite
            end
        end
    end
    return nil
end


-- Функция генерация шаблона по записи
if entry.sprite then
local function generateTemplate(entry, param, id, data)
return normalizeSpritePath(entry.sprite)
    local spritePath = getSpritePath(entry)
end
    if not entry.id or not spritePath then
        return nil
    end


    if param == "image" then
if type(entry.layers) == "table" then
        if id then
for _, layer in ipairs(entry.layers) do
            if tostring(entry.id) == tostring(id) then
if layer and layer.sprite then
                return spritePath
return normalizeSpritePath(layer.sprite)
            end
end
            return nil
end
        else
end
            return ""
        end
    elseif param == "path" then
        if id then
            for _, e in pairs(data) do
                if getSpritePath(e) == id then
                    return e.id
                end
            end
            return nil
        end
        return ""
    end


    return nil
return nil
end
end


local function generateDefaultTemplate(data, args)
-- Проверка visible
    return "Неверный параметр или отсутствует логика генерации шаблона по умолчанию."
local function isLayerVisible(layer)
if not layer then
return false
end
return layer.visible ~= false
end
end


-- Функция получение спрайта по ID
-- Функция получения списка состояний с учётом переопределяющего sprite в слое
function p.getSprite(frame)
local function getSpriteStates(entry)
    local id = frame.args[1]
local result = {}
    if not id then
local spritePath = getSpritePath(entry)
        return "Ошибка: не указан ID"
    end


    for _, entry in ipairs(data) do
if entry and type(entry.layers) == "table" then
        if entry.id == id then
for _, layer in ipairs(entry.layers) do
            return entry.Sprite and entry.Sprite.sprite or "Ошибка: спрайт не найден"
if isLayerVisible(layer) and layer.state then
        end
table.insert(result, {
    end
state = tostring(layer.state),
sprite = normalizeSpritePath(layer.sprite or spritePath)
})
end
end
elseif entry and entry.state and spritePath then
table.insert(result, {
state = tostring(entry.state),
sprite = spritePath
})
end


    return "Ошибка: ID не найден"
if #result == 0 and spritePath then
table.insert(result, {
state = "icon",
sprite = spritePath
})
end
 
return (#result > 0) and result or nil
end
end


-- Основная функция модуля
-- Функция генерации шаблона по записи (mode: image, path, state)
function p.main(frame)
function p.main(frame)
    local param = 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
return "Ошибка: отсутствует режим или ID"
end
 
local data = getIdTable()
if not data then
return "Ошибка: неверный формат JSON"
end
 
if mode == "image" or mode == "state" then
local entry = data[id]
if not entry then
return "Ошибка: ID не найден"
end
 
if mode == "image" then
local sprite = getSpritePath(entry)
return sprite or "Ошибка: спрайт не найден"
elseif mode == "state" then
local states = getSpriteStates(entry)
if not states then
return ""
end
 
local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
local links = {}
 
for _, item in ipairs(states) do
local spritePath = item.sprite
local stateName = item.state
 
if spritePath then
local url = baseUrl .. normalizeSpritePath(spritePath) .. "/" .. stateName .. ".png"
table.insert(links, "[" .. url .. " " .. stateName .. "]")
else
table.insert(links, stateName .. " Error: sprite not found")
end
end
 
return "(state: " .. table.concat(links, ", ") .. ")"
end
end
 
if mode == "path" then
local targetPath = normalizeSpritePath(id)
 
for entityId, entry in pairs(data) do
if getSpritePath(entry) == targetPath then
return entityId
end
end
 
return "Ошибка: путь не найден"
end


    if param == "image" or param == "path" then
return "Ошибка: неизвестный режим"
        local result = {}
        for _, entry in pairs(data) do
            local template = generateTemplate(entry, param, id, data)
            if template then
                table.insert(result, template)
            end
        end
        return table.concat(result, "\n")
    else
        return generateDefaultTemplate(data, frame.args)
    end
end
end


return p
return p

Текущая версия от 04:35, 23 марта 2026

Шаблон:Entity Sprite


-- Загрузка данных
local JsonPaths = require('Module:JsonPaths')
local spriteData = mw.loadData(JsonPaths.get("prototype/sprite.json"))

local p = {}

local function normalizeSpritePath(path)
	if path == nil then
		return nil
	end

	path = mw.text.trim(tostring(path))
	path = path:gsub("^/Textures/?", "")

	return path
end

-- Функция получения таблицы данных
local function getIdTable()
	if type(spriteData) == "table" and type(spriteData.id) == "table" then
		return spriteData.id
	end
	return nil
end

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

-- Функция получения пути спрайта:
-- 1) сначала entry.sprite
-- 2) потом первый layers[*].sprite
local function getSpritePath(entry)
	if not entry then
		return nil
	end

	if entry.sprite then
		return normalizeSpritePath(entry.sprite)
	end

	if type(entry.layers) == "table" then
		for _, layer in ipairs(entry.layers) do
			if layer and layer.sprite then
				return normalizeSpritePath(layer.sprite)
			end
		end
	end

	return nil
end

-- Проверка visible
local function isLayerVisible(layer)
	if not layer then
		return false
	end
	return layer.visible ~= false
end

-- Функция получения списка состояний с учётом переопределяющего sprite в слое
local function getSpriteStates(entry)
	local result = {}
	local spritePath = getSpritePath(entry)

	if entry and type(entry.layers) == "table" then
		for _, layer in ipairs(entry.layers) do
			if isLayerVisible(layer) and layer.state then
				table.insert(result, {
					state = tostring(layer.state),
					sprite = normalizeSpritePath(layer.sprite or spritePath)
				})
			end
		end
	elseif entry and entry.state and spritePath then
		table.insert(result, {
			state = tostring(entry.state),
			sprite = spritePath
		})
	end

	if #result == 0 and spritePath then
		table.insert(result, {
			state = "icon",
			sprite = spritePath
		})
	end

	return (#result > 0) and result or 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

	local data = getIdTable()
	if not data then
		return "Ошибка: неверный формат JSON"
	end

	if mode == "image" or mode == "state" then
		local entry = data[id]
		if not entry then
			return "Ошибка: ID не найден"
		end

		if mode == "image" then
			local sprite = getSpritePath(entry)
			return sprite or "Ошибка: спрайт не найден"
		elseif mode == "state" then
			local states = getSpriteStates(entry)
			if not states then
				return ""
			end

			local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
			local links = {}

			for _, item in ipairs(states) do
				local spritePath = item.sprite
				local stateName = item.state

				if spritePath then
					local url = baseUrl .. normalizeSpritePath(spritePath) .. "/" .. stateName .. ".png"
					table.insert(links, "[" .. url .. " " .. stateName .. "]")
				else
					table.insert(links, stateName .. " Error: sprite not found")
				end
			end

			return "(state: " .. table.concat(links, ", ") .. ")"
		end
	end

	if mode == "path" then
		local targetPath = normalizeSpritePath(id)

		for entityId, entry in pairs(data) do
			if getSpritePath(entry) == targetPath then
				return entityId
			end
		end

		return "Ошибка: путь не найден"
	end

	return "Ошибка: неизвестный режим"
end

return p