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

мНет описания правки
Нет описания правки
 
(не показаны 34 промежуточные версии этого же участника)
Строка 1: Строка 1:
local data = mw.loadData("Module:Entity Sprite/data")
-- Загрузка данных
local JsonPaths = require('Module:JsonPaths')
local spriteData = mw.loadData(JsonPaths.get("component/Sprite.json"))
 
local p = {}
local p = {}


local function normalizeSpritePath(path)
if path == nil then
return nil
end
path = mw.text.trim(tostring(path))
path = path:gsub("^/Textures/?", "")
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
-- Функция получения таблицы данных
local function getIdTable()
if type(spriteData) == "table" and type(spriteData.id) == "table" then
return spriteData.id
end
return nil
end
-- Функция для получения таблицы данных
function p.getData()
function p.getData()
    return data
return getIdTable() or {}
end
end


-- Функция получения пути спрайта:
-- 1) сначала entry.sprite
-- 2) потом первый layers[*].sprite
local function getSpritePath(entry)
local function getSpritePath(entry)
    if entry.Sprite and entry.Sprite.sprite then
if not entry then
        return entry.Sprite.sprite
return nil
    elseif entry.Icon and entry.Icon.sprite then
end
        return entry.Icon.sprite
 
    elseif entry.Sprite and entry.Sprite.layers then
if entry.sprite then
        for _, layer in pairs(entry.Sprite.layers) do
return normalizeSpritePath(entry.sprite)
            if layer.sprite then
end
                return layer.sprite
 
            end
if type(entry.layers) == "table" then
        end
for _, layer in ipairs(entry.layers) do
    end
if layer and layer.sprite then
    return nil
return normalizeSpritePath(layer.sprite)
end
end
end
 
return nil
end
 
-- Проверка visible
local function isLayerVisible(layer)
if not layer then
return false
end
return layer.visible ~= false
end
 
-- Функция получения списка состояний с учётом переопределяющего sprite в слое
local function getSpriteStates(entry)
local result = {}
local spritePath = getSpritePath(entry)
 
if entry and type(entry.layers) == "table" then
for _, layer in ipairs(entry.layers) do
if isLayerVisible(layer) and layer.state then
table.insert(result, {
state = tostring(layer.state),
sprite = normalizeSpritePath(layer.sprite or spritePath)
})
end
end
elseif entry and entry.state and spritePath then
table.insert(result, {
state = tostring(entry.state),
sprite = spritePath
})
end
 
if #result == 0 and spritePath then
table.insert(result, {
state = "icon",
sprite = spritePath
})
end
 
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
end


function p.getSprite(frame)
local function findByPath(data, targetPath)
    local id = frame.args[1]
for entityId, entry in pairs(data) do
    if not id then return "Ошибка: не указан ID" end
if getSpritePath(entry) == targetPath then
return entityId
end
end
 
return nil
end
 
-- Функция генерации шаблона по записи (mode: image, path, state)
function p.main(frame)
local mode = frame.args[1]
local id = frame.args[2]
local stateArg = frame.args[3]
 
if not mode or not id then
return "Ошибка: отсутствует режим или ID"
end
 
local data = getIdTable()
if not data then
return "Ошибка: неверный формат JSON"
end
 
if mode == "image" or mode == "state" then
local entry = data[id]
if not entry then
return "Ошибка: ID не найден"
end
 
if mode == "image" then
local sprite = getSpritePath(entry)
return sprite or "Ошибка: спрайт не найден"
elseif mode == "state" then
local states = getSpriteStates(entry)
if not states then
return ""
end
 
local baseUrl = JsonPaths.git() .. "/Resources/Textures/"
local links = {}
 
for _, item in ipairs(states) do
local spritePath = item.sprite
local stateName = item.state
 
if spritePath then
local url = baseUrl .. normalizeSpritePath(spritePath) .. "/" .. stateName .. ".png"
table.insert(links, "[" .. url .. " " .. stateName .. "]")
else
table.insert(links, stateName .. " Error: sprite not found")
end
end
 
return "(state: " .. table.concat(links, ", ") .. ")"
end
end
 
if mode == "path" then
local targetPath = normalizeSpritePath(id)
local targetState = normalizeState(stateArg)
 
if targetState then
local byState = findByPathAndState(data, targetPath, targetState)
if byState then
return JsonPaths.prefixFile(byState)
end
end
 
local byPath = findByPath(data, targetPath)
if byPath then
return JsonPaths.prefixFile(byPath)
end


    for _, entry in ipairs(data) do
return "Ошибка: путь не найден"
        if entry.id == id then
end
            return getSpritePath(entry) or "Ошибка: спрайт не найден"
        end
    end


    return "Ошибка: ID не найден"
return "Ошибка: неизвестный режим"
end
end


return p
return p