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

Нет описания правки
Нет описания правки
 
(не показаны 34 промежуточные версии этого же участника)
Строка 11: Строка 11:


return path
return path
end
local function normalizeData(data)
if type(data) ~= "table" then
return nil
end
if type(data.id) == "table" then
return data.id
end
return data
end
end


Строка 16: Строка 28:
local parts = {}
local parts = {}


if entry.sprite then
local function addField(name, value)
table.insert(parts, "sprite=" .. normalizeSpritePath(entry.sprite))
if value ~= nil then
table.insert(parts, name .. "=" .. tostring(value))
end
end
end
addField("sprite", normalizeSpritePath(entry.sprite))
addField("state", entry.state)
addField("scale", entry.scale)
addField("enableOverrideDir", entry.enableOverrideDir)
addField("overrideDir", entry.overrideDir)


if entry.layers and type(entry.layers) == "table" then
if entry.layers and type(entry.layers) == "table" then
Строка 27: Строка 47:


for k, v in pairs(layer) do
for k, v in pairs(layer) do
layerParts[#layerParts+1] = k .. "=" .. tostring(v)
if type(v) ~= "table" then
layerParts[#layerParts + 1] = k .. "=" .. tostring(v)
end
end
end


Строка 34: Строка 56:
end
end


table.sort(layers)  
table.sort(layers)
table.insert(parts, "layers=" .. table.concat(layers, "|"))
table.insert(parts, "layers=" .. table.concat(layers, "|"))
end
end


table.sort(parts)
return table.concat(parts, ";")
return table.concat(parts, ";")
end
local function getSpritePath(entry)
return normalizeSpritePath(entry.sprite)
end
end


Строка 50: Строка 69:
if entry.layers and type(entry.layers) == "table" then
if entry.layers and type(entry.layers) == "table" then
for _, layer in ipairs(entry.layers) do
for _, layer in ipairs(entry.layers) do
if layer.visible ~= false then
if layer.visible ~= false and layer.state then
table.insert(result, {
table.insert(result, {
state = tostring(layer.state or entry.state or ""),
state = tostring(layer.state),
sprite = normalizeSpritePath(layer.sprite or entry.sprite)
sprite = normalizeSpritePath(layer.sprite or entry.sprite)
})
})
Строка 59: Строка 78:
elseif entry.state and entry.sprite then
elseif entry.state and entry.sprite then
table.insert(result, {
table.insert(result, {
state = tostring(entry.state or ""),
state = tostring(entry.state),
sprite = normalizeSpritePath(entry.sprite)
sprite = normalizeSpritePath(entry.sprite)
})
})
Строка 67: Строка 86:
end
end


local function getPrefix(id, project)
local function getSpritePath(entry)
if project ~= "" and JsonPaths.has(id, project) then
if entry.sprite then
return project .. ":"
return normalizeSpritePath(entry.sprite)
end
end
return ""
 
if entry.layers and type(entry.layers) == "table" then
for _, layer in ipairs(entry.layers) do
if layer.sprite then
return normalizeSpritePath(layer.sprite)
end
end
end
 
return nil
end
end


Строка 110: Строка 138:
end
end


local function getParents(entry)
local function getParents(parentData, id)
if not entry then
if not parentData or type(parentData) ~= "table" or not id then
return nil
return nil
end
end


if type(entry.parents) == "table" then
local parents = parentData[id]
return entry.parents
if type(parents) ~= "table" then
end
return nil
 
if type(entry.parents) == "string" then
return splitCsv(entry.parents)
end
end


return nil
return parents
end
end


Строка 140: Строка 165:
end
end


local function shouldIncludeEntry(entry, whitelistSet, blacklistSet)
local function shouldIncludeEntry(id, whitelistSet, blacklistSet, parentData)
local parents = getParents(entry)
local parents = getParents(parentData, id)


if whitelistSet then
if whitelistSet and not hasAnyParent(parents, whitelistSet) then
if not hasAnyParent(parents, whitelistSet) then
return false
return false
end
end
end


Строка 156: Строка 179:
end
end


local function filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet)
local function filterSpriteData(spriteData, parentData, whitelistSet, blacklistSet, project)
local result = {}
local result = {}


for id, entry in pairs(spriteData) do
for id, entry in pairs(spriteData) do
local protoEntry = prototypeData and prototypeData[id] or entry
if shouldIncludeEntry(id, whitelistSet, blacklistSet, parentData) then
if project == "" or JsonPaths.has(id, project) then
result[id] = entry
end
end
end
 
return result
end


if shouldIncludeEntry(protoEntry, whitelistSet, blacklistSet) then
local function buildFileLink(id, project)
result[id] = entry
return "[[:Файл:" .. JsonPaths.prefixFile(id) .. ".png]]"
end
 
local function buildSpriteUrl(baseUrl, spritePath)
return baseUrl .. spritePath
end
 
local function buildSpritePathLink(baseUrl, spritePath)
local url = buildSpriteUrl(baseUrl, spritePath)
return "[" .. url .. " " .. spritePath .. "]"
end
 
local function buildStateLink(baseUrl, spritePath, state)
local url = buildSpriteUrl(baseUrl, spritePath) .. "/" .. state .. ".png"
return "[" .. url .. " " .. state .. "]"
end
 
local function buildSpriteStateLinks(baseUrl, states)
if not states or #states == 0 then
return ""
end
 
local links = {}
 
for _, item in ipairs(states) do
if item.sprite and item.state then
table.insert(links, buildStateLink(baseUrl, item.sprite, item.state))
end
end
end
end


return result
return table.concat(links, ", ")
end
 
local function buildRepeatSpriteValue(baseUrl, entry)
local spritePath = getSpritePath(entry)
if not spritePath then
return ""
end
 
local pathLink = buildSpritePathLink(baseUrl, spritePath)
local states = getSpriteStates(entry)
 
if states and #states > 0 and states[1].state and states[1].state ~= "" then
return pathLink .. " (" .. buildStateLink(baseUrl, spritePath, states[1].state) .. ")"
end
 
return pathLink
end
end


local function generateRepeatTemplate(data, project)
local function generateRepeatTemplate(data, project, baseUrl)
local spriteGroups = {}
local spriteGroups = {}


Строка 187: Строка 260:


for _, obj in ipairs(group) do
for _, obj in ipairs(group) do
local id = obj.id
table.insert(idLinks, buildFileLink(obj.id, project))
local prefix = getPrefix(id, project)
end


table.insert(idLinks, "[[:Файл:" .. prefix .. id .. ".png]]")
local firstId = group[1].id
end
local firstEntry = group[1].entry
local spriteValue = buildRepeatSpriteValue(baseUrl, firstEntry)


table.insert(result, mw.getCurrentFrame():preprocess(
table.insert(result, mw.getCurrentFrame():preprocess(
"{{Entity Sprite/Repeat|спрайты=" .. table.concat(idLinks, " ") ..
"{{Entity Sprite/Repeat|файлы=" .. table.concat(idLinks, " ") ..
"|перенаправление=" .. prefix .. group[1].id ..
"|перенаправление=" .. JsonPaths.prefixFile(firstId) ..
"|id=" .. group[1].id ..
"|id=" .. firstId ..
"|спрайт=" .. spriteValue ..
"}}"
"}}"
))
))
Строка 210: Строка 285:
return nil
return nil
end
end
local prefix = getPrefix(id, project)


local states = getSpriteStates(entry)
local states = getSpriteStates(entry)
local stateStr = ""
local stateStr = buildSpriteStateLinks(baseUrl, states)
 
if states then
local links = {}
for _, item in ipairs(states) do
if item.sprite and item.state then
local url = baseUrl .. item.sprite .. "/" .. item.state .. ".png"
table.insert(links, "[" .. url .. " " .. item.state .. "]")
end
end
stateStr = table.concat(links, ", ")
end


return mw.getCurrentFrame():preprocess(
return mw.getCurrentFrame():preprocess(
"{{Entity Sprite/Image|файл=" .. prefix .. id ..
"{{Entity Sprite/Image|файл=" .. JsonPaths.prefixFile(id) ..
"|id=" .. id ..
"|id=" .. id ..
"|путь=" .. baseUrl .. spritePath ..
"|путь=" .. buildSpriteUrl(baseUrl, spritePath) ..
"|state=" .. stateStr ..
"|state=" .. stateStr ..
"}}"
"}}"
Строка 238: Строка 300:
function p.main(frame)
function p.main(frame)
local action = frame.args[1]
local action = frame.args[1]
local json = frame.args.json or "sprite_entity.json"
local json = frame.args.json or "component/Sprite.json"


local project = JsonPaths.project()
local project = JsonPaths.project()
Строка 244: Строка 306:


local dataPage = JsonPaths.get(json)
local dataPage = JsonPaths.get(json)
local prototypesPage = JsonPaths.get("entity prototypes.json")
local parentPage = JsonPaths.get("entity parent.json")
 
local spriteDataRaw = mw.loadData(dataPage)
local parentDataRaw = mw.loadData(parentPage)


local spriteData = mw.loadData(dataPage)
local spriteData = normalizeData(spriteDataRaw)
local prototypeData = mw.loadData(prototypesPage)
local parentData = normalizeData(parentDataRaw)


if not spriteData or type(spriteData) ~= "table" then
if not spriteData or type(spriteData) ~= "table" then
Строка 253: Строка 318:
end
end


if not prototypeData or type(prototypeData) ~= "table" then
if not parentData or type(parentData) ~= "table" then
return "Ошибка загрузки JSON: " .. prototypesPage
return "Ошибка загрузки JSON: " .. parentPage
end
end


local whitelistSet = buildSet(frame.args.whitelistParent)
local whitelistSet = buildSet(frame.args.whitelistParent)
local blacklistSet = buildSet(frame.args.blacklistParent)
local blacklistSet = buildSet(frame.args.blacklistParent)
 
local filteredData = filterSpriteData(spriteData, parentData, whitelistSet, blacklistSet, project)
local filteredData = filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet)


if action == "repeat" then
if action == "repeat" then
return generateRepeatTemplate(filteredData, project)
return generateRepeatTemplate(filteredData, project, baseUrl)
 
elseif action == "image" then
elseif action == "image" then
local result = {}
local result = {}