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

Нет описания правки
Нет описания правки
Строка 21: Строка 21:
end
end


-- Функция нечувствительного к регистру поиска поля
-- Функция получения пути спрайта
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
 
-- Функция получения пути спрайта: сначала пытаем Icon.sprite, затем Sprite.sprite, затем первый layer.sprite
local function getSpritePath(entry)
local function getSpritePath(entry)
    local iconBlock = findFieldInsensitive(entry, "Icon")
return entry.sprite
    if type(iconBlock) == "table" and iconBlock.sprite then
        return iconBlock.sprite
    end
 
    local spriteBlock = findFieldInsensitive(entry, "Sprite")
    if not spriteBlock then return nil end
 
    if type(spriteBlock) == "string" then
        return spriteBlock
    end
 
    if spriteBlock.sprite then
        return spriteBlock.sprite
    end
 
    if spriteBlock.layers then
        for _, layer in pairs(spriteBlock.layers) do
            if layer.sprite then
                return layer.sprite
            end
        end
    end
 
    return nil
end
end


Строка 84: Строка 50:


     local spritePath = getSpritePath(entry)
     local spritePath = getSpritePath(entry)
    local iconBlock = findFieldInsensitive(entry, "Icon")


     if iconBlock and iconBlock.state and isLayerVisibleAndShaded(iconBlock) then
     if entry.layers then
        local s = (type(iconBlock) == "table" and iconBlock.sprite) or spritePath
        for _, layer in ipairs(entry.layers) do
        addState(iconBlock.state, s)
             if layer.state and isLayerVisibleAndShaded(layer) then
    else
        local spriteBlock = findFieldInsensitive(entry, "Sprite")
        if spriteBlock and spriteBlock.layers then
            for _, layer in ipairs(spriteBlock.layers) do
                if layer.state and isLayerVisibleAndShaded(layer) then
                    local s = layer.sprite or spritePath
                    addState(layer.state, s)
                    break
                end
            end
        elseif spriteBlock and spriteBlock.state and isLayerVisibleAndShaded(spriteBlock) then
            addState(spriteBlock.state, spritePath)
        end
    end
 
    local spriteBlock = findFieldInsensitive(entry, "Sprite")
    if spriteBlock and spriteBlock.layers then
        for _, layer in ipairs(spriteBlock.layers) do
            local alreadyAdded = false
            for _, r in ipairs(result) do
                if r.state == layer.state then
                    alreadyAdded = true
                    break
                end
            end
             if not alreadyAdded and layer.state and isStateFirstKey(layer) and isLayerVisibleAndShaded(layer) then
                 local s = layer.sprite or spritePath
                 local s = layer.sprite or spritePath
                 addState(layer.state, s)
                 addState(layer.state, s)
Строка 136: Строка 75:
     end
     end


     for _, entry in ipairs(spriteData) do
     for entityId, entry in pairs(spriteData) do
         if entry.id == id then
         if entityId == id then
             if mode == "image" then
             if mode == "image" then
                 local sprite = getSpritePath(entry)
                 local sprite = getSpritePath(entry)
Строка 143: Строка 82:
             elseif mode == "path" then
             elseif mode == "path" then
                 if getSpritePath(entry) == id then
                 if getSpritePath(entry) == id then
                     return entry.id
                     return entityId
                 end
                 end
             elseif mode == "state" then
             elseif mode == "state" then