Модуль:Entity Sprite: различия между версиями
Pok (обсуждение | вклад) Нет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| (не показано 5 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
-- Загрузка данных | -- Загрузка данных | ||
local JsonPaths = require('Module:JsonPaths') | local JsonPaths = require('Module:JsonPaths') | ||
local spriteData = mw.loadData(JsonPaths.get(" | local spriteData = mw.loadData(JsonPaths.get("component/Sprite.json")) | ||
local p = {} | local p = {} | ||
| Строка 14: | Строка 14: | ||
return path | return path | ||
end | |||
local function normalizeState(state) | |||
if state == nil then | |||
return nil | |||
end | |||
state = mw.text.trim(tostring(state)) | |||
if state == "" then | |||
return nil | |||
end | |||
return state | |||
end | end | ||
| Строка 29: | Строка 42: | ||
end | end | ||
-- Функция получения пути спрайта | -- Функция получения пути спрайта: | ||
-- 1) сначала entry.sprite | |||
-- 2) потом первый layers[*].sprite | |||
local function getSpritePath(entry) | local function getSpritePath(entry) | ||
if not entry then | if not entry then | ||
return nil | return nil | ||
end | end | ||
return normalizeSpritePath(entry.sprite) | |||
if entry.sprite then | |||
return normalizeSpritePath(entry.sprite) | |||
end | |||
if type(entry.layers) == "table" then | |||
for _, layer in ipairs(entry.layers) do | |||
if layer and layer.sprite then | |||
return normalizeSpritePath(layer.sprite) | |||
end | |||
end | |||
end | |||
return nil | |||
end | end | ||
| Строка 74: | Строка 102: | ||
return (#result > 0) and result or nil | return (#result > 0) and result or nil | ||
end | |||
local function findByPathAndState(data, targetPath, targetState) | |||
for entityId, entry in pairs(data) do | |||
if getSpritePath(entry) == targetPath then | |||
local states = getSpriteStates(entry) | |||
if states then | |||
for _, item in ipairs(states) do | |||
if normalizeState(item.state) == targetState then | |||
return entityId | |||
end | |||
end | |||
end | |||
end | |||
end | |||
return nil | |||
end | |||
local function findByPath(data, targetPath) | |||
for entityId, entry in pairs(data) do | |||
if getSpritePath(entry) == targetPath then | |||
return entityId | |||
end | |||
end | |||
return nil | |||
end | end | ||
| Строка 80: | Строка 135: | ||
local mode = frame.args[1] | local mode = frame.args[1] | ||
local id = frame.args[2] | local id = frame.args[2] | ||
local stateArg = frame.args[3] | |||
if not mode or not id then | if not mode or not id then | ||
| Строка 126: | Строка 182: | ||
if mode == "path" then | if mode == "path" then | ||
local targetPath = normalizeSpritePath(id) | local targetPath = normalizeSpritePath(id) | ||
local targetState = normalizeState(stateArg) | |||
if targetState then | |||
if | local byState = findByPathAndState(data, targetPath, targetState) | ||
return | if byState then | ||
return JsonPaths.prefixFile(byState) | |||
end | end | ||
end | |||
local byPath = findByPath(data, targetPath) | |||
if byPath then | |||
return JsonPaths.prefixFile(byPath) | |||
end | end | ||