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

Материал из Space Station 14 Вики
Нет описания правки
мНет описания правки
(не показана 21 промежуточная версия этого же участника)
Строка 4: Строка 4:
local function loadData(filePath)
local function loadData(filePath)
     local page = mw.title.new(filePath)
     local page = mw.title.new(filePath)
     if not page then
    local content = page and page:getContent()
         return nil
    return content and mw.text.jsonDecode(content) or nil
end
 
-- Проверка равенства двух таблиц
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 not deepEqual(v, t2[k]) then return false end
     end
     end
     local content = page:getContent()
 
    if not content then
     for k, v in pairs(t2) do
        return nil
        if not deepEqual(v, t1[k]) then return false end
     end
     end
     return mw.text.jsonDecode(content)
 
     return true
end
end


-- Функция для генерации шаблона repeat
-- Генерация шаблона repeat
local function generateRepeatTemplate(data)
local function generateRepeatTemplate(data)
     local spriteGroups = {}
     local spriteGroups = {}


    -- Группировка спрайтов по пути
     for _, entry in ipairs(data) do
     for _, entry in ipairs(data) do
         if entry.Sprite and entry.Sprite.sprite then
         local found = false
            local spritePath = entry.Sprite.sprite
        for key, group in pairs(spriteGroups) do
            spriteGroups[spritePath] = spriteGroups[spritePath] or {}
            if deepEqual(entry.Sprite, group[1].Sprite) and
            table.insert(spriteGroups[spritePath], entry.id)
              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
     end
     end


    -- Формирование шаблона
     local result = {}
     local result = {}
     for spritePath, ids in pairs(spriteGroups) do
     for _, group in pairs(spriteGroups) do
         if #ids > 1 then -- Только если есть повторяющиеся спрайты
         if #group > 1 then
             local idLinks = {}
             local idLinks = {}
             for _, id in ipairs(ids) do
             for _, entry in ipairs(group) do
                 table.insert(idLinks, "[[:Файл:" .. id .. ".png]]")
                 table.insert(idLinks, "[[:Файл:" .. entry.id .. ".png]]")
             end
             end
             local firstId = ids[1]
             local firstId = group[1].id
             table.insert(result, mw.getCurrentFrame():preprocess("{{Entity Sprite/Repeat|" .. table.concat(idLinks, " ") .. "|" .. firstId .. "}}"))
             table.insert(result, mw.getCurrentFrame():preprocess("{{Entity Sprite/Repeat|" .. table.concat(idLinks, " ") .. "|" .. firstId .. "}}"))
         end
         end
Строка 43: Строка 60:
end
end


-- Функция генерации текста для одного элемента JSON с выбором параметра
-- Генерация текста для элемента JSON
local function generateTemplate(entry, param)
local function generateTemplate(entry, param)
     if not entry.id or not entry.Sprite or not entry.Sprite.sprite then
     if not entry.id or not entry.Sprite or not entry.Sprite.sprite then
Строка 49: Строка 66:
     end
     end


     local result = ""
     if param == "image" then
        return mw.getCurrentFrame():preprocess("{{Entity Sprite/Imege|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
    elseif param == "path" then
        return mw.getCurrentFrame():preprocess("{{Entity Sprite/Path|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
    end
 
    return nil
end


    -- Проверка выбранного параметра
-- Генерация шаблона по умолчанию
     if param == "image" then
local function generateDefaultTemplate(data, params)
         result = result .. mw.getCurrentFrame():preprocess("{{Entity Sprite/Imege|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
    local id = params.Id
     elseif param == "license" then
     if not id or id == "" then
         result = result .. mw.getCurrentFrame():preprocess("{{Entity Sprite/License|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
         return "Ошибка: Не указан ID."
    end
 
    -- Поиск записи с указанным ID
    local entry = nil
    for _, item in ipairs(data) do
        if tostring(item.id) == tostring(id) then
            entry = item
            break
        end
    end
 
    if not entry then
        return ""
    end
 
    local description = params.Description or ""
    local servers = params.Servers or ""
    local source = params.Source or ""
    local path = params.Path
    local tags = params.Tags or ""
 
    if not entry.Sprite or not entry.Sprite.sprite then
        return ""
     end
 
    if not path or path == "" then
         path = "Resources/Textures/" .. entry.Sprite.sprite
     end
     end


     return result
    -- Формирование шаблона
     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 param = frame.args[1]


    -- Проверка на допустимость параметра
    if param ~= "image" and param ~= "license" and param ~= "repeat" then
        return 'Ошибка: Неверный параметр. Используйте "image", "license" или "repeat".'
    end
    -- Загрузка данных из JSON-файла
     local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
     local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
     if not data or type(data) ~= 'table' then
     if not data or type(data) ~= 'table' then
Строка 76: Строка 131:
     end
     end


     -- Генерация результата
     if not param then
        -- Генерация шаблона по умолчанию с поиском по ID
        return generateDefaultTemplate(data, frame.args)
    end
 
    -- Логика для других параметров, как "image", "path", "repeat"
     if param == "repeat" then
     if param == "repeat" then
         return generateRepeatTemplate(data)
         return generateRepeatTemplate(data)

Версия от 08:06, 21 января 2025

Для документации этого модуля может быть создана страница Модуль:Entity Sprite/doc

local p = {}

-- Загрузка данных
local function loadData(filePath)
    local page = mw.title.new(filePath)
    local content = page and page:getContent()
    return content and mw.text.jsonDecode(content) or nil
end

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

    for k, v in pairs(t2) do
        if not deepEqual(v, t1[k]) then return false end
    end

    return true
end

-- Генерация шаблона repeat
local function generateRepeatTemplate(data)
    local spriteGroups = {}

    for _, entry in ipairs(data) do
        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

        if not found then
            spriteGroups[entry.id] = {entry}
        end
    end

    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

-- Генерация текста для элемента JSON
local function generateTemplate(entry, param)
    if not entry.id or not entry.Sprite or not entry.Sprite.sprite then
        return nil
    end

    if param == "image" then
        return mw.getCurrentFrame():preprocess("{{Entity Sprite/Imege|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
    elseif param == "path" then
        return mw.getCurrentFrame():preprocess("{{Entity Sprite/Path|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
    end

    return nil
end

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

    -- Поиск записи с указанным ID
    local entry = nil
    for _, item in ipairs(data) do
        if tostring(item.id) == tostring(id) then
            entry = item
            break
        end
    end

    if not entry then
        return ""
    end

    local description = params.Description or ""
    local servers = params.Servers or ""
    local source = params.Source or ""
    local path = params.Path
    local tags = params.Tags or ""

    if not entry.Sprite or not entry.Sprite.sprite then
        return ""
    end

    if not path or path == "" then
        path = "Resources/Textures/" .. entry.Sprite.sprite
    end

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

-- Основная функция модуля
function p.main(frame)
    local param = frame.args[1]

    local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
    if not data or type(data) ~= 'table' then
        return 'Ошибка: Невозможно загрузить данные из JSON.'
    end

    if not param then
        -- Генерация шаблона по умолчанию с поиском по ID
        return generateDefaultTemplate(data, frame.args)
    end

    -- Логика для других параметров, как "image", "path", "repeat"
    if param == "repeat" then
        return generateRepeatTemplate(data)
    else
        local result = {}
        for _, entry in ipairs(data) do
            local template = generateTemplate(entry, param)
            if template then
                table.insert(result, template)
            end
        end
        return table.concat(result)
    end
end

return p