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

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


local data = mw.loadData("Module:Entity Sprite/data")
local function normalizeSpritePath(path)
if path == nil then
return nil
end
 
path = mw.text.trim(tostring(path))
path = path:gsub("^/Textures/?", "")


-- Проверка равенства двух таблиц
return path
local function deepEqual(t1, t2)
end
    if t1 == t2 then return true end
    if type(t1) ~= "table" or type(t2) ~= "table" then return false end


    local function isArray(t)
-- Функция получения таблицы данных
        local i = 0
local function getIdTable()
        for _ in pairs(t) do
if type(spriteData) == "table" and type(spriteData.id) == "table" then
            i = i + 1
return spriteData.id
            if t[i] == nil then return false end
end
        end
return nil
        return true
end
    end


    if isArray(t1) and isArray(t2) then
-- Функция для получения таблицы данных
        if #t1 ~= #t2 then return false end
function p.getData()
        local matched = {}
return getIdTable() or {}
        for _, v1 in ipairs(t1) do
end
            local found = false
 
            for j, v2 in ipairs(t2) do
-- Функция получения пути спрайта:
                if not matched[j] and deepEqual(v1, v2) then
-- 1) сначала entry.sprite
                    matched[j] = true
-- 2) потом первый layers[*].sprite
                    found = true
local function getSpritePath(entry)
                    break
if not entry then
                end
return nil
            end
end
            if not found then return false end
        end
        return true
    end


    for k, v in pairs(t1) do
if entry.sprite then
        if t2[k] == nil or not deepEqual(v, t2[k]) then
return normalizeSpritePath(entry.sprite)
            return false
end
        end
    end


    for k, v in pairs(t2) do
if type(entry.layers) == "table" then
        if t1[k] == nil then
for _, layer in ipairs(entry.layers) do
            return false
if layer and layer.sprite then
        end
return normalizeSpritePath(layer.sprite)
    end
end
end
end


    return true
return nil
end
end


-- Получение пути спрайта
-- Проверка visible
local function getSpritePath(entry)
local function isLayerVisible(layer)
    if entry.Sprite and entry.Sprite.sprite then
if not layer then
        return entry.Sprite.sprite
return false
    elseif entry.Icon and entry.Icon.sprite then
end
        return entry.Icon.sprite
return layer.visible ~= false
    elseif entry.Sprite and entry.Sprite.layers then
        for _, layer in ipairs(entry.Sprite.layers) do
            if layer.sprite then
                return layer.sprite
            end
        end
    end
    return nil
end
end


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


    for _, entry in ipairs(data) do
if entry and type(entry.layers) == "table" then
        local found = false
for _, layer in ipairs(entry.layers) do
        for _, group in pairs(spriteGroups) do
if isLayerVisible(layer) and layer.state then
            if deepEqual(entry.Sprite, group[1].Sprite) and
table.insert(result, {
              deepEqual(entry.EntityStorageVisuals, group[1].EntityStorageVisuals) and
state = tostring(layer.state),
              deepEqual(entry.Icon, group[1].Icon) then
sprite = normalizeSpritePath(layer.sprite or spritePath)
                table.insert(group, entry)
})
                found = true
end
                break
end
            end
elseif entry and entry.state and spritePath then
        end
table.insert(result, {
state = tostring(entry.state),
sprite = spritePath
})
end


        if not found then
if #result == 0 and spritePath then
            spriteGroups[entry.id] = {entry}
table.insert(result, {
        end
state = "icon",
    end
sprite = spritePath
})
end


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


    return table.concat(result, "\n")
-- Функция генерации шаблона по записи (mode: image, path, state)
end
function p.main(frame)
local mode = frame.args[1]
local id = frame.args[2]


-- Обновляем основную функцию шаблонизации
if not mode or not id then
local function generateTemplate(entry, param, secondaryParam)
return "Ошибка: отсутствует режим или ID"
    local spritePath = getSpritePath(entry)
end
    if not entry.id or not spritePath then
        return nil
    end


    if param == "image" then
local data = getIdTable()
        if secondaryParam then
if not data then
            if tostring(entry.id) == tostring(secondaryParam) then
return "Ошибка: неверный формат JSON"
                return spritePath
end
            end
            return nil
        else
            return mw.getCurrentFrame():preprocess("{{Entity Sprite/Image|" .. entry.id .. "|" .. spritePath .. "}}")
        end
    end


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


-- Генерация шаблона по умолчанию
if mode == "image" then
local function generateDefaultTemplate(data, params)
local sprite = getSpritePath(entry)
    local id = params.Id
return sprite or "Ошибка: спрайт не найден"
    if not id or id == "" then
elseif mode == "state" then
        return "Ошибка: ID не указан."
local states = getSpriteStates(entry)
    end
if not states then
return ""
end


    local description = params.Description or ""
local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
    local servers = params.Servers or ""
local links = {}
    local source = params.Source or ""
    local tags = params.Tags or ""


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


    local entry = nil
if spritePath then
    for _, item in ipairs(data) do
local url = baseUrl .. normalizeSpritePath(spritePath) .. "/" .. stateName .. ".png"
        if tostring(item.id) == tostring(id) then
table.insert(links, "[" .. url .. " " .. stateName .. "]")
            entry = item
else
            break
table.insert(links, stateName .. " Error: sprite not found")
        end
end
    end
end


    if entry then
return "(state: " .. table.concat(links, ", ") .. ")"
        spritePath = getSpritePath(entry)
end
        if not spritePath then
end
            return ""
        end
    end
   
    if not path or path == "" then
        path = "Resources/Textures/" .. (spritePath or "")
    end


    return mw.getCurrentFrame():preprocess(
if mode == "path" then
        "{{Файл\n" ..
local targetPath = normalizeSpritePath(id)
        "|Описание = " .. description .. "\n" ..
        "|Id      = " .. tostring(id) .. "\n" ..
        "|Сервера  = " .. servers .. "\n" ..
        "|Источник = " .. source .. "\n" ..
        "|Путь    = " .. path .. "\n" ..
        "|Теги    = " .. tags .. "\n" ..
        "}}\n"
    )
end


function p.main(frame)
for entityId, entry in pairs(data) do
    local param = frame.args[1]
if getSpritePath(entry) == targetPath then
    local secondaryParam = frame.args[2]
return entityId
end
end


    if not data or type(data) ~= 'table' then
return "Ошибка: путь не найден"
        return 'Ошибка: Невозможно загрузить данные из JSON.'
end
    end


    if param == "repeat" then
return "Ошибка: неизвестный режим"
        return generateRepeatTemplate(data)
    elseif param == "path" and secondaryParam then
        for _, entry in ipairs(data) do
            local template = generateTemplate(entry, param, secondaryParam, data)
            if template then
                return template
            end
        end
        return nil
    elseif param == "image" or param == "path" then
        local result = {}
        for _, entry in ipairs(data) do
            local template = generateTemplate(entry, param, secondaryParam, 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