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

Материал из Space Station 14 Вики
мНет описания правки
Нет описания правки
Строка 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 content = page:getContent()
     if not content then
        return nil
    end
    return mw.text.jsonDecode(content)
end
end


Строка 30: Строка 24:
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.EntityStorageVisuals then
         if entry.Sprite and entry.EntityStorageVisuals then
Строка 43: Строка 36:
     end
     end


    -- Формирование шаблона
     local result = {}
     local result = {}
     for _, ids in pairs(spriteGroups) do
     for _, ids in pairs(spriteGroups) do
         if #ids > 1 then -- Только если есть повторяющиеся спрайты
         if #ids > 1 then
             local idLinks = {}
             local idLinks = {}
             for _, id in ipairs(ids) do
             for _, id in ipairs(ids) do
Строка 59: Строка 51:
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
Строка 65: Строка 57:
     end
     end


    local result = ""
    -- Проверка выбранного параметра
     if param == "image" then
     if param == "image" then
         result = result .. mw.getCurrentFrame():preprocess("{{Entity Sprite/Imege|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
         return mw.getCurrentFrame():preprocess("{{Entity Sprite/Imege|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
     elseif param == "license" then
     elseif param == "license" then
         result = result .. mw.getCurrentFrame():preprocess("{{Entity Sprite/License|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
         return mw.getCurrentFrame():preprocess("{{Entity Sprite/License|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
     end
     end


     return result
     return nil
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
     if param ~= "image" and param ~= "license" and param ~= "repeat" then
         return 'Ошибка: Неверный параметр. Используйте "image", "license" или "repeat".'
         return 'Ошибка: Неверный параметр. Используйте "image", "license" или "repeat".'
     end
     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
Строка 92: Строка 78:
     end
     end


    -- Генерация результата
     if param == "repeat" then
     if param == "repeat" then
         return generateRepeatTemplate(data)
         return generateRepeatTemplate(data)

Версия от 00:26, 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
        if entry.Sprite and entry.EntityStorageVisuals then
            local key = mw.text.jsonEncode({ Sprite = entry.Sprite, EntityStorageVisuals = entry.EntityStorageVisuals })
            spriteGroups[key] = spriteGroups[key] or {}
            table.insert(spriteGroups[key], entry.id)
        end
    end

    local result = {}
    for _, ids in pairs(spriteGroups) do
        if #ids > 1 then
            local idLinks = {}
            for _, id in ipairs(ids) do
                table.insert(idLinks, "[[:Файл:" .. id .. ".png]]")
            end
            local firstId = ids[1]
            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 == "license" then
        return mw.getCurrentFrame():preprocess("{{Entity Sprite/License|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}")
    end

    return nil
end

-- Основная функция модуля
function p.main(frame)
    local param = frame.args[1]
    if param ~= "image" and param ~= "license" and param ~= "repeat" then
        return 'Ошибка: Неверный параметр. Используйте "image", "license" или "repeat".'
    end

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

    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