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

Материал из Space Station 14 Вики
мНет описания правки
мНет описания правки
Строка 11: Строка 11:
-- Функция получения пути спрайта
-- Функция получения пути спрайта
local function getSpritePath(entry)
local function getSpritePath(entry)
     if entry.Sprite and entry.Sprite.sprite then
     local function findFieldInsensitive(tbl, fieldName)
         return entry.Sprite.sprite
        for key, value in pairs(tbl) do
     elseif entry.Icon and entry.Icon.sprite then
            if type(key) == "string" and mw.ustring.lower(key) == mw.ustring.lower(fieldName) then
        return entry.Icon.sprite
                return value
    elseif entry.Sprite and entry.Sprite.layers then
            end
        for _, layer in pairs(entry.Sprite.layers) do
        end
            if layer.sprite then
         return nil
                return layer.sprite
    end
 
     local spriteBlock = findFieldInsensitive(entry, "Sprite") or findFieldInsensitive(entry, "Icon")
    if spriteBlock then
        if spriteBlock.sprite then
            return spriteBlock.sprite
        elseif spriteBlock.layers then
            for _, layer in pairs(spriteBlock.layers) do
                if layer.sprite then
                    return layer.sprite
                end
             end
             end
         end
         end

Версия от 16:08, 7 апреля 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)
    local function findFieldInsensitive(tbl, fieldName)
        for key, value in pairs(tbl) do
            if type(key) == "string" and mw.ustring.lower(key) == mw.ustring.lower(fieldName) then
                return value
            end
        end
        return nil
    end

    local spriteBlock = findFieldInsensitive(entry, "Sprite") or findFieldInsensitive(entry, "Icon")
    if spriteBlock then
        if spriteBlock.sprite then
            return spriteBlock.sprite
        elseif spriteBlock.layers then
            for _, layer in pairs(spriteBlock.layers) do
                if layer.sprite then
                    return layer.sprite
                end
            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