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

Нет описания правки
Нет описания правки
 
(не показаны 42 промежуточные версии этого же участника)
Строка 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 data = mw.loadData("Модуль:Entity Sprite/data")
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


-- Проверка равенства двух таблиц
-- Функция для получения таблицы данных
local function deepEqual(t1, t2)
function p.getData()
    if t1 == t2 then return true end
return getIdTable() or {}
    if type(t1) ~= "table" or type(t2) ~= "table" then return false end
   
    -- Если это массивы, проверяем их содержимое без учета порядка
    local function isArray(t)
        local i = 0
        for _ in pairs(t) do
            i = i + 1
            if t[i] == nil then return false end
        end
        return true
    end
    if isArray(t1) and isArray(t2) then
        if #t1 ~= #t2 then return false end
        local matched = {}
        for _, v1 in ipairs(t1) do
            local found = false
            for j, v2 in ipairs(t2) do
                if not matched[j] and deepEqual(v1, v2) then
                    matched[j] = true
                    found = true
                    break
                end
            end
            if not found then return false end
        end
        return true
    end
   
    -- Если это таблицы, проверяем их содержимое
    for k, v in pairs(t1) do
        if t2[k] == nil or not deepEqual(v, t2[k]) then
            return false
        end
    end
    for k, v in pairs(t2) do
        if t1[k] == nil then
            return false
        end
    end
    return true
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 ipairs(entry.Sprite.layers) do
return normalizeSpritePath(entry.sprite)
            if layer.sprite then
end
                return layer.sprite
            end
        end
    end
    return nil
end


-- Генерация шаблона repeat
if type(entry.layers) == "table" then
local function generateRepeatTemplate()
for _, layer in ipairs(entry.layers) do
    local spriteGroups = {}
if layer and layer.sprite then
    for _, entry in ipairs(data) do
return normalizeSpritePath(layer.sprite)
        local found = false
end
        for _, group in pairs(spriteGroups) do
end
            if deepEqual(entry.Sprite, group[1].Sprite) and
end
              deepEqual(entry.EntityStorageVisuals, group[1].EntityStorageVisuals) and
              deepEqual(entry.Icon, group[1].Icon) then
                table.insert(group, entry)
                found = true
                break
            end
        end
        if not found then
            spriteGroups[entry.id] = {entry}
        end
    end


    local result = {}
return nil
    for _, group in pairs(spriteGroups) do
        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")
end
end


-- Создание индекса путей спрайтов
-- Проверка visible
local function createSpritePathIndex()
local function isLayerVisible(layer)
    local index = {}
if not layer then
    for _, entry in ipairs(data) do
return false
        local spritePath = getSpritePath(entry)
end
        if spritePath then
return layer.visible ~= false
            index[spritePath] = entry.id
        end
    end
    return index
end
end


-- Генерация шаблона по параметрам
-- Функция получения списка состояний с учётом переопределяющего sprite в слое
local function generateTemplate(entry, param, secondaryParam, spritePathIndex)
local function getSpriteStates(entry)
    local spritePath = getSpritePath(entry)
local result = {}
    if not entry.id or not spritePath then
local spritePath = getSpritePath(entry)
        return nil
 
    end
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


    if param == "image" then
return (#result > 0) and result or nil
        if secondaryParam and tostring(entry.id) == tostring(secondaryParam) then
            return spritePath
        else
            return mw.getCurrentFrame():preprocess("{{Entity Sprite/Image|" .. entry.id .. "|" .. spritePath .. "}}")
        end
    elseif param == "path" then
        if secondaryParam then
            return spritePathIndex[secondaryParam] or nil
        else
            return mw.getCurrentFrame():preprocess("{{Entity Sprite/Path|" .. entry.id .. "|" .. spritePath .. "}}")
        end
    end
    return nil
end
end


-- Генерация шаблона по умолчанию
-- Функция генерации шаблона по записи (mode: image, path, state)
local function generateDefaultTemplate(params)
function p.main(frame)
    local id = params.Id
local mode = frame.args[1]
    local description = params.Description or ""
local id = frame.args[2]
    local servers = params.Servers or ""
 
    local source = params.Source or ""
if not mode or not id then
    local tags = params.Tags or ""
return "Ошибка: отсутствует режим или ID"
    local path = params.Path
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 = {}


    local entry = nil
for _, item in ipairs(states) do
    if id and id ~= "" then
local spritePath = item.sprite
        for _, item in ipairs(data) do
local stateName = item.state
            if tostring(item.id) == tostring(id) then
                entry = item
                break
            end
        end
    end


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


    return mw.getCurrentFrame():preprocess(
return "(state: " .. table.concat(links, ", ") .. ")"
        "{{Файл\n" ..
end
        "|Описание = " .. description .. "\n" ..
end
        "|Id      = " .. id .. "\n" ..
 
        "|Сервера  = " .. servers .. "\n" ..
if mode == "path" then
        "|Источник = " .. source .. "\n" ..
local targetPath = normalizeSpritePath(id)
        "|Путь    = " .. (path or "") .. "\n" ..
 
        "|Теги    = " .. tags .. "\n" ..
for entityId, entry in pairs(data) do
        "}}\n"
if getSpritePath(entry) == targetPath then
    )
return entityId
end
end
end


function p.main(frame)
return "Ошибка: путь не найден"
    local param = frame.args[1]
end
    local secondaryParam = frame.args[2]
    local spritePathIndex = createSpritePathIndex()


    if param == "repeat" then
return "Ошибка: неизвестный режим"
        return generateRepeatTemplate()
    elseif param == "path" and secondaryParam then
        for _, entry in ipairs(data) do
            local template = generateTemplate(entry, param, secondaryParam, spritePathIndex)
            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, spritePathIndex)
            if template then
                table.insert(result, template)
            end
        end
        return table.concat(result, "\n")
    else
        return generateDefaultTemplate(frame.args)
    end
end
end


return p
return p