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

мНет описания правки
Нет описания правки
 
(не показано 35 промежуточных версий этого же участника)
Строка 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 normalizeState(state)
if state == nil then
return nil
end
 
state = mw.text.trim(tostring(state))
if state == "" then
return nil
end
 
return state
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
if entry.sprite then
        for _, layer in pairs(entry.Sprite.layers) do
return normalizeSpritePath(entry.sprite)
            if layer.sprite then
end
                return layer.sprite
 
            end
if type(entry.layers) == "table" then
        end
for _, layer in ipairs(entry.layers) do
    end
if layer and layer.sprite then
    return nil
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
end


local function generateTemplate(entry, param, id, data)
-- Функция получения списка состояний с учётом переопределяющего sprite в слое
    local spritePath = getSpritePath(entry)
local function getSpriteStates(entry)
    if not entry.id or not spritePath then
local result = {}
        return nil
local spritePath = getSpritePath(entry)
    end


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


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


-- Получаем спрайт по ID
local function findByPathAndState(data, targetPath, targetState)
function p.getSprite(frame)
for entityId, entry in pairs(data) do
    local id = frame.args[1]
if getSpritePath(entry) == targetPath then
    if not id then return "Ошибка: не указан ID" end
local states = getSpriteStates(entry)
if states then
for _, item in ipairs(states) do
if normalizeState(item.state) == targetState then
return entityId
end
end
end
end
end


    for _, entry in ipairs(data) do
return nil
        if entry.id == id then
end
            return entry.Sprite and entry.Sprite.sprite or "Ошибка: спрайт не найден"
 
        end
local function findByPath(data, targetPath)
    end
for entityId, entry in pairs(data) do
if getSpritePath(entry) == targetPath then
return entityId
end
end


    return "Ошибка: ID не найден"
return 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]
local stateArg = frame.args[3]
 
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)
local targetState = normalizeState(stateArg)
 
if targetState then
local byState = findByPathAndState(data, targetPath, targetState)
if byState then
return JsonPaths.prefixFile(byState)
end
end
 
local byPath = findByPath(data, targetPath)
if byPath then
return JsonPaths.prefixFile(byPath)
end
 
return "Ошибка: путь не найден"
end
 
return "Ошибка: неизвестный режим"
end
end


return p
return p