Модуль:Entity Sprite: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) мНет описания правки |
||
| Строка 45: | Строка 45: | ||
-- Функция получения списка состояний с учётом переопределяющего sprite в слое | -- Функция получения списка состояний с учётом переопределяющего sprite в слое | ||
local function isStateFirstKey(layer) | |||
for k, _ in pairs(layer) do | |||
return k == "state" | |||
end | |||
return false | |||
end | |||
local function getSpriteStates(entry) | local function getSpriteStates(entry) | ||
local spriteBlock = findFieldInsensitive(entry, "Sprite") | local spriteBlock = findFieldInsensitive(entry, "Sprite") | ||
if spriteBlock | if not spriteBlock or not spriteBlock.layers then | ||
local iconBlock = findFieldInsensitive(entry, "Icon") | |||
if iconBlock and iconBlock.state then | |||
return { { state = iconBlock.state, sprite = getSpritePath(entry) } } | |||
end | |||
if spriteBlock and spriteBlock.state then | |||
return { { state = spriteBlock.state, sprite = getSpritePath(entry) } } | |||
end | |||
return nil | |||
end | |||
local firstStateLayer | |||
for _, layer in ipairs(spriteBlock.layers) do | |||
if layer.state then | |||
firstStateLayer = layer | |||
break | |||
end | end | ||
end | end | ||
if | if not firstStateLayer then | ||
return | return nil | ||
end | end | ||
local | local result = {} | ||
if | if firstStateLayer.visible ~= false then | ||
if firstStateLayer.sprite then | |||
table.insert(result, { state = firstStateLayer.state, sprite = firstStateLayer.sprite }) | |||
else | |||
table.insert(result, { state = firstStateLayer.state, sprite = getSpritePath(entry) }) | |||
end | |||
end | end | ||
if | for _, layer in ipairs(spriteBlock.layers) do | ||
if layer ~= firstStateLayer and layer.state and isStateFirstKey(layer) and layer.visible ~= false then | |||
if layer.sprite then | |||
table.insert(result, { state = layer.state, sprite = layer.sprite }) | |||
else | |||
table.insert(result, { state = layer.state, sprite = getSpritePath(entry) }) | |||
end | |||
end | |||
end | end | ||
return nil | return (#result > 0) and result or nil | ||
end | end | ||