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

Материал из Space Station 14 Вики
мНет описания правки
Метка: ручная отмена
Нет описания правки
 
(не показаны 132 промежуточные версии этого же участника)
Строка 1: Строка 1:
-- Загрузка данных
local JsonPaths = require('Module:JsonPaths')
local spriteData = mw.loadData(JsonPaths.get("prototype/sprite.json"))
local p = {}
local p = {}


local function loadData(filePath)
local function normalizeSpritePath(path)
    local page = mw.title.new(filePath)
if path == nil then
    if not page then
return nil
        return nil
end
    end
 
    local content = page:getContent()
path = mw.text.trim(tostring(path))
    if not content then
path = path:gsub("^/Textures/?", "")
        return nil
 
    end
return path
    return mw.text.jsonDecode(content)
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()
return getIdTable() or {}
end
 
-- Функция получения пути спрайта:
-- 1) сначала entry.sprite
-- 2) потом первый layers[*].sprite
local function getSpritePath(entry)
if not entry then
return nil
end
 
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
 
-- Проверка 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


local function generateTemplate(entry)
local function findByPath(data, targetPath)
    if not entry.id or not entry.Sprite or not entry.Sprite.sprite then
for entityId, entry in pairs(data) do
        return nil
if getSpritePath(entry) == targetPath then
    end
return entityId
    local result = {}
end
    table.insert(result, mw.getCurrentFrame():preprocess("{{Entity Sprite|" .. entry.id .. "|" .. entry.Sprite.sprite .. "}}"))
end
    return table.concat(result)
 
return nil
end
end


-- Функция генерации шаблона по записи (mode: image, path, state)
function p.main(frame)
function p.main(frame)
    local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
local mode = frame.args[1]
    if not data or type(data) ~= 'table' then
local id = frame.args[2]
        return 'Ошибка: Невозможно загрузить данные из JSON.'
local stateArg = frame.args[3]
    end
 
   
if not mode or not id then
    local result = {}
return "Ошибка: отсутствует режим или ID"
    for _, entry in ipairs(data) do
end
        local template = generateTemplate(entry)
 
        if template then
local data = getIdTable()
            table.insert(result, template)
if not data then
        end
return "Ошибка: неверный формат JSON"
    end
end
   
 
    return table.concat(result)
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
 
return "Ошибка: путь не найден"
end
 
return "Ошибка: неизвестный режим"
end
end


return p
return p

Текущая версия от 11:26, 1 апреля 2026

Документация
-- Загрузка данных
local JsonPaths = require('Module:JsonPaths')
local spriteData = mw.loadData(JsonPaths.get("prototype/sprite.json"))

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()
	return getIdTable() or {}
end

-- Функция получения пути спрайта:
-- 1) сначала entry.sprite
-- 2) потом первый layers[*].sprite
local function getSpritePath(entry)
	if not entry then
		return nil
	end

	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

-- Проверка 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

local function findByPath(data, targetPath)
	for entityId, entry in pairs(data) do
		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

		return "Ошибка: путь не найден"
	end

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

return p