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

мНет описания правки
Нет описания правки
 
(не показаны 32 промежуточные версии этого же участника)
Строка 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


local function generateTemplate(entry, param, id, data)
if entry.sprite then
    local spritePath = getSpritePath(entry)
return normalizeSpritePath(entry.sprite)
    if not entry.id or not spritePath then
end
        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


-- Получаем спрайт по ID
-- Проверка visible
function p.getSprite(frame)
local function isLayerVisible(layer)
    local id = frame.args[1]
if not layer then
    if not id then return "Ошибка: не указан ID" end
return false
end
return layer.visible ~= false
end


    for _, entry in ipairs(data) do
-- Функция получения списка состояний с учётом переопределяющего sprite в слое
        if entry.id == id then
local function getSpriteStates(entry)
            return entry.Sprite and entry.Sprite.sprite or "Ошибка: спрайт не найден"
local result = {}
        end
local spritePath = getSpritePath(entry)
    end


    return "Ошибка: ID не найден"
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
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 = {}


    if param == "image" or param == "path" then
for _, item in ipairs(states) do
        local result = {}
local spritePath = item.sprite
        for _, entry in pairs(data) do
local stateName = item.state
            local template = generateTemplate(entry, param, id, data)
 
            if template then
if spritePath then
                table.insert(result, template)
local url = baseUrl .. normalizeSpritePath(spritePath) .. "/" .. stateName .. ".png"
            end
table.insert(links, "[" .. url .. " " .. stateName .. "]")
        end
else
        return table.concat(result, "\n")
table.insert(links, stateName .. " Error: sprite not found")
    else
end
        return generateDefaultTemplate(data, frame.args)
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
end


return p
return p