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

Материал из Space Station 14 Вики
Нет описания правки
Метка: ручная отмена
мНет описания правки
 
(не показано 57 промежуточных версий этого же участника)
Строка 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
function p.getData()
            return false
     return spriteData
        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
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
 
-- Создаём индекс для путей
local function createSpritePathIndex(data)
    local index = {}
    for _, entry in ipairs(data) do
        local spritePath = getSpritePath(entry)
        if spritePath then
            index[spritePath] = entry.id
        end
    end
     return index
end
end


-- Обновляем основную функцию
-- Функция получения state
local function generateTemplate(entry, param, secondaryParam, data, spritePathIndex)
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
            -- Используем индекс для быстрого поиска
            local id = spritePathIndex[secondaryParam]
            if id then
                return id
            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]
     local description = params.Description or ""
     if not id then return "Ошибка: не указан ID" end
    local servers = params.Servers or ""
    local source = params.Source or ""
    local tags = params.Tags or ""


     local spritePath = nil
     for _, entry in ipairs(spriteData) do
    local path = params.Path
        if entry.id == id then
    local spritePath = nil
             return getSpritePath(entry) or "Ошибка: спрайт не найден"
 
    -- Поиск записи с указанным ID
    local entry = nil
    if id and id ~= "" then
        for _, item in ipairs(data) do
            if tostring(item.id) == tostring(id) then
                entry = item
                break
             end
        end
    end
 
    -- Если запись не найдена, ничего не выводим
    if entry then
        spritePath = getSpritePath(entry)
        if not spritePath then
            return ""
         end
         end
    end
   
    -- Если Path не указан, подставляем путь из User:IanComradeBot/prototypes/entity sprite.json
    if not path or path == "" then
        path = "Resources/Textures/" .. (spritePath or "")
     end
     end


    -- Формирование шаблона
     return "Ошибка: ID не найден"
     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 mode == "image" then
    local spritePathIndex = createSpritePathIndex(data)
        for _, entry in ipairs(spriteData) do
 
            if entry.id == id then
    if param == "repeat" then
                local sprite = getSpritePath(entry)
         return generateRepeatTemplate(data)
                if sprite then
     elseif param == "path" and secondaryParam then
                    return sprite
         for _, entry in ipairs(data) do
                else
             local template = generateTemplate(entry, param, secondaryParam, data, spritePathIndex)
                    return "Ошибка: спрайт не найден"
            if template then
                end
                 return template
            end
        end
         return "Ошибка: ID не найден"
     elseif mode == "path" then
         for _, entry in ipairs(spriteData) do
             if getSpritePath(entry) == id then
                 return entry.id
             end
             end
         end
         end
         return nil
         return "Ошибка: путь не найден"
     elseif param == "image" or param == "path" then
     elseif mode == "state" then
        local result = {}
         for _, entry in ipairs(spriteData) do
         for _, entry in ipairs(data) do
             if entry.id == id then
             local template = generateTemplate(entry, param, secondaryParam, data, spritePathIndex)
                local state = getSpriteState(entry)
            if template then
                if state then
                table.insert(result, template)
                    return "(state: " .. state .. ")"
                else
                    return ""
                end
             end
             end
         end
         end
         return table.concat(result, "\n")
         return "Ошибка: ID не найден"
     else
     else
        -- Если нет режима, генерируем шаблон по умолчанию
         return "Ошибка: неизвестный режим"
         return generateDefaultTemplate(data, frame.args)
     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