Модуль:Entity Sprite/all: различия между версиями
Pok (обсуждение | вклад) Нет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 20: | Строка 20: | ||
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 or ""), | ||
sprite = entry.sprite | sprite = entry.sprite | ||
}) | }) | ||
| Строка 33: | Строка 33: | ||
end | end | ||
return "" | return "" | ||
end | |||
local function splitCsv(value) | |||
local result = {} | |||
if value == nil then | |||
return nil | |||
end | |||
value = mw.text.trim(tostring(value)) | |||
if value == "" then | |||
return nil | |||
end | |||
for part in mw.text.gsplit(value, ",", true) do | |||
local item = mw.text.trim(part) | |||
if item ~= "" then | |||
table.insert(result, item) | |||
end | |||
end | |||
return (#result > 0) and result or nil | |||
end | |||
local function buildSet(value) | |||
local list = splitCsv(value) | |||
if not list then | |||
return nil | |||
end | |||
local set = {} | |||
for _, item in ipairs(list) do | |||
set[item] = true | |||
end | |||
return set | |||
end | |||
local function getParents(entry) | |||
if not entry then | |||
return nil | |||
end | |||
if type(entry.parents) == "table" then | |||
return entry.parents | |||
end | |||
if type(entry.parents) == "string" then | |||
return splitCsv(entry.parents) | |||
end | |||
return nil | |||
end | |||
local function hasAnyParent(parents, set) | |||
if not parents or not set then | |||
return false | |||
end | |||
for _, parent in ipairs(parents) do | |||
if set[parent] then | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
local function shouldIncludeEntry(entry, whitelistSet, blacklistSet) | |||
local parents = getParents(entry) | |||
if whitelistSet then | |||
if not hasAnyParent(parents, whitelistSet) then | |||
return false | |||
end | |||
end | |||
if blacklistSet and hasAnyParent(parents, blacklistSet) then | |||
return false | |||
end | |||
return true | |||
end | |||
local function filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet) | |||
local result = {} | |||
for id, entry in pairs(spriteData) do | |||
local protoEntry = prototypeData and prototypeData[id] or entry | |||
if shouldIncludeEntry(protoEntry, whitelistSet, blacklistSet) then | |||
result[id] = entry | |||
end | |||
end | |||
return result | |||
end | end | ||
| Строка 115: | Строка 211: | ||
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 "sprite_entity.json" | ||
local project = JsonPaths.project() | local project = JsonPaths.project() | ||
local baseUrl = JsonPaths.git() .. "/Resources/Textures/" | local baseUrl = JsonPaths.git() .. "/Resources/Textures/" | ||
local dataPage = JsonPaths.get(json) | local dataPage = JsonPaths.get(json) | ||
local prototypesPage = JsonPaths.get("entity prototypes.json") | |||
local spriteData = mw.loadData(dataPage) | local spriteData = mw.loadData(dataPage) | ||
local prototypeData = mw.loadData(prototypesPage) | |||
if not spriteData or type(spriteData) ~= "table" then | if not spriteData or type(spriteData) ~= "table" then | ||
return "Ошибка загрузки JSON: " .. dataPage | return "Ошибка загрузки JSON: " .. dataPage | ||
end | end | ||
if not prototypeData or type(prototypeData) ~= "table" then | |||
return "Ошибка загрузки JSON: " .. prototypesPage | |||
end | |||
local whitelistSet = buildSet(frame.args.whitelistParent) | |||
local blacklistSet = buildSet(frame.args.blacklistParent) | |||
local filteredData = filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet) | |||
if action == "repeat" then | if action == "repeat" then | ||
return generateRepeatTemplate( | return generateRepeatTemplate(filteredData, project) | ||
elseif action == "image" then | elseif action == "image" then | ||
local result = {} | local result = {} | ||
for id, entry in pairs( | for id, entry in pairs(filteredData) do | ||
local t = generateTemplate(id, entry, baseUrl, project) | local t = generateTemplate(id, entry, baseUrl, project) | ||
if t then | if t then | ||