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

Материал из Space Station 14 Вики
Нет описания правки
мНет описания правки
 
(не показана 71 промежуточная версия этого же участника)
Строка 1: Строка 1:
local p = {}
-- Загрузка данных
-- Загрузка данных
local function loadData(filePath)
local spriteData = mw.loadData("Модуль:IanComradeBot/prototypes/entity sprite.json/data")
    local page = mw.title.new(filePath)
    local content = page and page:getContent()
    return content and mw.text.jsonDecode(content) or nil
end


-- Проверка равенства двух таблиц
local p = {}
local function deepEqual(t1, t2)
    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
        if t2[k] == nil then
            return false
        end
        if 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
        if not deepEqual(v, t1[k]) then
            return false
        end
    end


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


-- Получение пути спрайта
-- Функция получения пути спрайта
local function getSpritePath(entry)
local function getSpritePath(entry)
     return entry.Sprite and entry.Sprite.sprite or (entry.Icon and entry.Icon.sprite)
     if entry.Sprite and entry.Sprite.sprite then
end
        return entry.Sprite.sprite
 
    elseif entry.Icon and entry.Icon.sprite then
-- Генерация шаблона repeat
        return entry.Icon.sprite
local function generateRepeatTemplate(data)
     elseif entry.Sprite and entry.Sprite.layers then
     local spriteGroups = {}
         for _, layer in pairs(entry.Sprite.layers) do
 
            if layer.sprite then
    for _, entry in ipairs(data) do
                 return layer.sprite
        local found = false
         for key, group in pairs(spriteGroups) do
            if deepEqual(entry.Sprite, group[1].Sprite) and
              deepEqual(entry.EntityStorageVisuals, group[1].EntityStorageVisuals) and
              deepEqual(entry.Icon, group[1].Icon) then
                 table.insert(group, entry)
                found = true
                break
             end
             end
        end
        if not found then
            spriteGroups[entry.id] = {entry}
         end
         end
     end
     end
 
     return nil
    local result = {}
    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


-- Генерация текста для элемента JSON
-- Функция получения state
local function generateTemplate(entry, param, secondaryParam, data)
local function getSpriteState(entry)
     local spritePath = getSpritePath(entry)
     if entry.Sprite and entry.Sprite.state then
    if not entry.id or not spritePath then
         return entry.Sprite.state
         return nil
     elseif entry.Sprite and entry.Sprite.layers then
     end
         for _, layer in pairs(entry.Sprite.layers) do
 
             if layer.state then
    if param == "image" then
                 return layer.state
         if secondaryParam then
             if tostring(entry.id) == tostring(secondaryParam) then
                 return spritePath
             end
             end
            return nil
        else
            return mw.getCurrentFrame():preprocess("{{Entity Sprite/Image|" .. entry.id .. "|" .. spritePath .. "}}")
        end
    elseif param == "path" then
        if secondaryParam then
            for _, entry in ipairs(data) do
                local spritePath = getSpritePath(entry)
                if spritePath == secondaryParam then
                    return entry.id
                end
            end
            return nil
        else
            return mw.getCurrentFrame():preprocess("{{Entity Sprite/Path|" .. entry.id .. "|" .. spritePath .. "}}")
         end
         end
     end
     end
     return nil
     return nil
end
end


-- Генерация шаблона по умолчанию
-- Функция генерации шаблона по записи
local function generateDefaultTemplate(data, params)
function p.getSprite(frame)
     local id = params.Id
     local id = frame.args[1]
     if not id or id == "" then
     if not id then return "Ошибка: не указан ID" end
        return "Ошибка: Не указан ID."
    end


    -- Поиск записи с указанным ID
     for _, entry in ipairs(spriteData) do
    local entry = nil
         if entry.id == id then
     for _, item in ipairs(data) do
             return getSpritePath(entry) or "Ошибка: спрайт не найден"
         if tostring(item.id) == tostring(id) then
             entry = item
            break
         end
         end
     end
     end


     if not entry then
     return "Ошибка: ID не найден"
        return ""
    end
 
    local description = params.Description or ""
    local servers = params.Servers or ""
    local source = params.Source or ""
    local tags = params.Tags or ""
 
    local spritePath = getSpritePath(entry)
    if not spritePath then
        return ""
    end
 
    local path = params.Path
    if not path or path == "" then
        path = "Resources/Textures/" .. spritePath
    end
 
    -- Формирование шаблона
    return mw.getCurrentFrame():preprocess(
        "{{Файл\n" ..
        "|Описание = " .. description .. "\n" ..
        "|Id      = " .. id .. "\n" ..
        "|Сервера  = " .. servers .. "\n" ..
        "|Источник = " .. source .. "\n" ..
        "|Путь    = " .. path .. "\n" ..
        "|Теги    = " .. tags .. "\n" ..
        "}}\n"  
    )
end
end


-- Основная функция модуля
-- Основная функция модуля
function p.main(frame)
function p.main(frame)
     local param = frame.args[1]
     local mode = frame.args[1]
     local secondaryParam = frame.args[2]
     local id = frame.args[2]
 
     if not mode or not id then
    local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
         return "Ошибка: отсутствует режим или ID"
     if not data or type(data) ~= 'table' then
         return 'Ошибка: Невозможно загрузить данные из JSON.'
     end
     end


     if param == "repeat" then
     if mode == "image" then
        return generateRepeatTemplate(data)
         for _, entry in ipairs(spriteData) do
    elseif param == "path" and secondaryParam then
             if entry.id == id then
         for _, entry in ipairs(data) do
                local sprite = getSpritePath(entry)
             local template = generateTemplate(entry, param, secondaryParam, data)
                if sprite then
            if template then
                    return sprite
                 return template
                 else
                    return "Ошибка: спрайт не найден"
                end
             end
             end
         end
         end
         return nil
         return "Ошибка: ID не найден"
     else
     elseif mode == "path" then
         local result = {}
        for _, entry in ipairs(spriteData) do
         for _, entry in ipairs(data) do
            if getSpritePath(entry) == id then
             local template = generateTemplate(entry, param, secondaryParam, data)
                return entry.id
            if template then
            end
                table.insert(result, template)
        end
         return "Ошибка: путь не найден"
    elseif mode == "state" then
         for _, entry in ipairs(spriteData) do
             if entry.id == id then
                local state = getSpriteState(entry)
                if state then
                    return "(state: " .. state .. ")"
                else
                    return ""
                end
             end
             end
         end
         end
         return table.concat(result, "\n")
         return "Ошибка: ID не найден"
    else
        return "Ошибка: неизвестный режим"
     end
     end
end
end


return p
return p

Текущая версия от 11:16, 23 марта 2025

Шаблон:Entity Sprite


-- Загрузка данных
local spriteData = mw.loadData("Модуль:IanComradeBot/prototypes/entity sprite.json/data")

local p = {}

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

-- Функция получения пути спрайта
local function getSpritePath(entry)
    if entry.Sprite and entry.Sprite.sprite then
        return entry.Sprite.sprite
    elseif entry.Icon and entry.Icon.sprite then
        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

-- Функция получения state
local function getSpriteState(entry)
    if entry.Sprite and entry.Sprite.state then
        return entry.Sprite.state
    elseif entry.Sprite and entry.Sprite.layers then
        for _, layer in pairs(entry.Sprite.layers) do
            if layer.state then
                return layer.state
            end
        end
    end
    return nil
end

-- Функция генерации шаблона по записи
function p.getSprite(frame)
    local id = frame.args[1]
    if not id then return "Ошибка: не указан ID" end

    for _, entry in ipairs(spriteData) do
        if entry.id == id then
            return getSpritePath(entry) or "Ошибка: спрайт не найден"
        end
    end

    return "Ошибка: ID не найден"
end

-- Основная функция модуля
function p.main(frame)
    local mode = frame.args[1]
    local id = frame.args[2]
    if not mode or not id then
        return "Ошибка: отсутствует режим или ID"
    end

    if mode == "image" then
        for _, entry in ipairs(spriteData) do
            if entry.id == id then
                local sprite = getSpritePath(entry)
                if sprite then
                    return sprite
                else
                    return "Ошибка: спрайт не найден"
                end
            end
        end
        return "Ошибка: ID не найден"
    elseif mode == "path" then
        for _, entry in ipairs(spriteData) do
            if getSpritePath(entry) == id then
                return entry.id
            end
        end
        return "Ошибка: путь не найден"
    elseif mode == "state" then
        for _, entry in ipairs(spriteData) do
            if entry.id == id then
                local state = getSpriteState(entry)
                if state then
                    return "(state: " .. state .. ")"
                else
                    return ""
                end
            end
        end
        return "Ошибка: ID не найден"
    else
        return "Ошибка: неизвестный режим"
    end
end

return p