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

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


-- Загрузка данных
local function normalizeSpritePath(path)
local function loadData(filePath)
if path == nil then
    local page = mw.title.new(filePath)
return nil
    local content = page and page:getContent()
end
    return content and mw.text.jsonDecode(content) or nil
end


-- Проверка равенства двух таблиц
path = mw.text.trim(tostring(path))
local function deepEqual(t1, t2)
path = path:gsub("^/Textures/?", "")
    if t1 == t2 then return true end
    if type(t1) ~= "table" or type(t2) ~= "table" then return false end


    for k, v in pairs(t1) do
return path
        if not deepEqual(v, t2[k]) then return false end
end
    end


    for k, v in pairs(t2) do
-- Функция получения таблицы данных
        if not deepEqual(v, t1[k]) then return false end
local function getIdTable()
    end
if type(spriteData) == "table" and type(spriteData.id) == "table" then
return spriteData.id
end
return nil
end


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


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


    for _, entry in ipairs(data) do
if entry.sprite then
        if entry.Sprite and entry.EntityStorageVisuals then
return normalizeSpritePath(entry.sprite)
            local key = mw.text.jsonEncode({ Sprite = entry.Sprite, EntityStorageVisuals = entry.EntityStorageVisuals })
end
            spriteGroups[key] = spriteGroups[key] or {}
            table.insert(spriteGroups[key], entry.id)
        end
    end


    local result = {}
if type(entry.layers) == "table" then
    for _, ids in pairs(spriteGroups) do
for _, layer in ipairs(entry.layers) do
        if #ids > 1 then
if layer and layer.sprite then
            local idLinks = {}
return normalizeSpritePath(layer.sprite)
            for _, id in ipairs(ids) do
end
                table.insert(idLinks, "[[:Файл:" .. id .. ".png]]")
end
            end
end
            local firstId = ids[1]
            table.insert(result, mw.getCurrentFrame():preprocess("{{Entity Sprite/Repeat|" .. table.concat(idLinks, " ") .. "|" .. firstId .. "}}"))
        end
    end


    return table.concat(result, "\n")
return nil
end
end


-- Генерация текста для элемента JSON
-- Проверка visible
local function generateTemplate(entry, param)
local function isLayerVisible(layer)
    if not entry.id or not entry.Sprite or not entry.Sprite.sprite then
if not layer then
        return nil
return false
    end
end
return layer.visible ~= false
end


    if param == "image" then
-- Функция получения списка состояний с учётом переопределяющего sprite в слое
        return mw.getCurrentFrame():preprocess("{{Entity Sprite/Imege|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
local function getSpriteStates(entry)
    elseif param == "license" then
local result = {}
        return mw.getCurrentFrame():preprocess("{{Entity Sprite/License|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
local spritePath = getSpritePath(entry)
    end


    return nil
if entry and type(entry.layers) == "table" then
end
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
local function generateDefaultTemplate(entry, params)
table.insert(result, {
    local description = params.Description or ""
state = "icon",
    local id = params.Id or entry.id
sprite = spritePath
    local servers = params.Servers or ""
})
    local source = params.Source or ""
end
    local path = params.Path or entry.id
    local tags = params.Tags or ""
    local licensing = params.Licensing or "CC-BY-SA-3.0"


    -- Формируем шаблон
return (#result > 0) and result or nil
    return mw.getCurrentFrame():preprocess(
        "\n== Краткое описание ==\n" ..
        "{{Файл\n" ..
        "|Описание = " .. description .. "\n" ..
        "|Id      = " .. id .. "\n" ..
        "|Сервера  = " .. servers .. "\n" ..
        "|Источник = " .. source .. "\n" ..
        "|Путь    = Resources/Textures/" .. path .. "\n" ..
        "|Теги    = " .. tags .. "\n" ..
        "}}\n\n" ..
        "== Лицензирование ==\n" ..
        "{{" .. licensing .. "}}"
    )
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]
 
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 not param then
if mode == "path" then
        local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
local targetPath = normalizeSpritePath(id)
        if not data or type(data) ~= 'table' then
            return 'Ошибка: Невозможно загрузить данные из JSON.'
        end


        local entry = data[1]
for entityId, entry in pairs(data) do
        if not entry then
if getSpritePath(entry) == targetPath then
            return 'Ошибка: Не найден элемент с таким ID.'
return entityId
        end
end
       
end
        -- Генерация шаблона по умолчанию
        return generateDefaultTemplate(entry, frame.args)
    end


    -- Логика для других параметров, как "image", "license", "repeat"
return "Ошибка: путь не найден"
    if param == "repeat" then
end
        local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
        if not data or type(data) ~= 'table' then
            return 'Ошибка: Невозможно загрузить данные из JSON.'
        end
        return generateRepeatTemplate(data)
    else
        local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
        if not data or type(data) ~= 'table' then
            return 'Ошибка: Невозможно загрузить данные из JSON.'
        end


        local result = {}
return "Ошибка: неизвестный режим"
        for _, entry in ipairs(data) do
            local template = generateTemplate(entry, param)
            if template then
                table.insert(result, template)
            end
        end
        return table.concat(result)
    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