|
|
| Строка 1: |
Строка 1: |
| local p = {}
| |
|
| |
| -- Загрузка данных | | -- Загрузка данных |
| local function loadData(filePath) | | local spriteData = mw.loadData("Модуль:IanComradeBot/prototypes/entity sprite.json/data") |
| local page = mw.title.new(filePath)
| |
| local content = page and page:getContent()
| |
| return content and mw.text.jsonDecode(content) or nil
| |
| end
| |
|
| |
|
| -- Проверка равенства двух таблиц
| | local p = {} |
| local function deepEqual(t1, t2) | |
| if t1 == t2 then return true end
| |
| if type(t1) ~= "table" or type(t2) ~= "table" then return false end
| |
| | |
| -- Если это массивы, проверяем их содержимое без учета порядка
| |
| local function isArray(t)
| |
| local i = 0
| |
| for _ in pairs(t) do
| |
| i = i + 1
| |
| if t[i] == nil then return false end
| |
| end
| |
| return true
| |
| end
| |
| | |
| if isArray(t1) and isArray(t2) then
| |
| if #t1 ~= #t2 then return false end
| |
| local matched = {}
| |
| for _, v1 in ipairs(t1) do
| |
| local found = false
| |
| for j, v2 in ipairs(t2) do
| |
| if not matched[j] and deepEqual(v1, v2) then
| |
| matched[j] = true
| |
| found = true
| |
| break
| |
| end
| |
| end
| |
| if not found then return false end
| |
| end
| |
| return true
| |
| end
| |
|
| |
|
| -- Если это таблицы, проверяем их содержимое
| | -- Функция для получения таблицы данных |
| for k, v in pairs(t1) do
| | function p.getData() |
| if t2[k] == nil or not deepEqual(v, t2[k]) then
| | return spriteData |
| return false
| |
| end
| |
| end
| |
| | |
| for k, v in pairs(t2) do
| |
| if t1[k] == nil then
| |
| return false
| |
| end
| |
| end
| |
| | |
| return true | |
| end | | end |
|
| |
|
| -- Получение пути спрайта | | -- Функция получение пути спрайта |
| local function getSpritePath(entry) | | local function getSpritePath(entry) |
| if entry.Sprite and entry.Sprite.sprite then | | if entry.Sprite and entry.Sprite.sprite then |
| Строка 63: |
Строка 16: |
| return entry.Icon.sprite | | return entry.Icon.sprite |
| elseif entry.Sprite and entry.Sprite.layers then | | elseif entry.Sprite and entry.Sprite.layers then |
| for _, layer in ipairs(entry.Sprite.layers) do | | for _, layer in pairs(entry.Sprite.layers) do |
| if layer.sprite then | | if layer.sprite then |
| return layer.sprite | | return layer.sprite |
| Строка 72: |
Строка 25: |
| end | | end |
|
| |
|
| -- Генерация шаблона repeat | | -- Функция генерация шаблона по записи |
| local function generateRepeatTemplate(data)
| | function p.getSprite(frame) |
| local spriteGroups = {} | | local id = frame.args[1] |
| | if not id then return "Ошибка: не указан ID" end |
|
| |
|
| for _, entry in ipairs(data) do | | for _, entry in ipairs(spriteData) do |
| local found = false | | if entry.id == id then |
| for key, group in pairs(spriteGroups) do
| | return getSpritePath(entry) or "Ошибка: спрайт не найден" |
| if deepEqual(entry.Sprite, group[1].Sprite) and
| |
| deepEqual(entry.EntityStorageVisuals, group[1].EntityStorageVisuals) and
| |
| deepEqual(entry.Icon, group[1].Icon) then
| |
| table.insert(group, entry)
| |
| found = true
| |
| break
| |
| end
| |
| end
| |
| | |
| if not found then
| |
| spriteGroups[entry.id] = {entry}
| |
| end | | end |
| end | | end |
|
| |
|
| local result = {} | | return "Ошибка: ID не найден" |
| for _, group in pairs(spriteGroups) do
| |
| if #group > 1 then
| |
| local idLinks = {}
| |
| for _, entry in ipairs(group) do
| |
| table.insert(idLinks, "[[:Файл:" .. entry.id .. ".png]]")
| |
| end
| |
| local firstId = group[1].id
| |
| table.insert(result, mw.getCurrentFrame():preprocess("{{Entity Sprite/Repeat|" .. table.concat(idLinks, " ") .. "|" .. firstId .. "}}"))
| |
| end
| |
| end
| |
| | |
| return table.concat(result, "\n")
| |
| end
| |
| | |
| local function createSpritePathIndex(data)
| |
| local index = {}
| |
| for _, entry in ipairs(data) do
| |
| local spritePath = getSpritePath(entry)
| |
| if spritePath then
| |
| index[spritePath] = entry.id
| |
| end
| |
| end
| |
| return index
| |
| end
| |
| | |
| local function generateTemplate(entry, param, secondaryParam, data, spritePathIndex)
| |
| local spritePath = getSpritePath(entry)
| |
| if not entry.id or not spritePath then
| |
| return nil
| |
| end
| |
| | |
| if param == "image" then
| |
| if secondaryParam then
| |
| if tostring(entry.id) == tostring(secondaryParam) then
| |
| return spritePath
| |
| end
| |
| return nil
| |
| else
| |
| return mw.getCurrentFrame():preprocess("{{Entity Sprite/Image|" .. entry.id .. "|" .. spritePath .. "}}")
| |
| end
| |
| elseif param == "path" then
| |
| if secondaryParam then
| |
| local id = spritePathIndex[secondaryParam]
| |
| if id then
| |
| return id
| |
| end
| |
| return nil
| |
| else
| |
| return mw.getCurrentFrame():preprocess("{{Entity Sprite/Path|" .. entry.id .. "|" .. spritePath .. "}}")
| |
| end
| |
| end
| |
| | |
| return nil
| |
| end
| |
| | |
| -- Генерация шаблона по умолчанию
| |
| local function generateDefaultTemplate(data, params)
| |
| local id = params.Id
| |
| local description = params.Description or ""
| |
| local servers = params.Servers or ""
| |
| local source = params.Source or ""
| |
| local tags = params.Tags or ""
| |
| | |
| local spritePath = nil
| |
| local path = params.Path
| |
| | |
| -- Поиск записи с указанным ID
| |
| local entry = nil
| |
| if id and id ~= "" then
| |
| for _, item in ipairs(data) do
| |
| if tostring(item.id) == tostring(id) then
| |
| entry = item
| |
| break
| |
| end
| |
| end
| |
| end
| |
| | |
| -- Если запись не найдена, ничего не выводим
| |
| if entry then
| |
| spritePath = getSpritePath(entry)
| |
| if not spritePath then
| |
| return ""
| |
| end
| |
| end
| |
|
| |
| -- Если Path не указан, подставляем путь из User:IanComradeBot/prototypes/entity sprite.json
| |
| if not path or path == "" then
| |
| path = "Resources/Textures/" .. (spritePath or "")
| |
| end
| |
| | |
| -- Формирование шаблона
| |
| return mw.getCurrentFrame():preprocess(
| |
| "{{Файл\n" ..
| |
| "|Описание = " .. description .. "\n" ..
| |
| "|Id = " .. id .. "\n" ..
| |
| "|Сервера = " .. servers .. "\n" ..
| |
| "|Источник = " .. source .. "\n" ..
| |
| "|Путь = " .. path .. "\n" ..
| |
| "|Теги = " .. tags .. "\n" ..
| |
| "}}\n"
| |
| )
| |
| end | | end |
|
| |
|
| | -- Основная функция модуля |
| function p.main(frame) | | function p.main(frame) |
| local param = frame.args[1] | | local mode = frame.args[1] |
| local secondaryParam = frame.args[2] | | local id = frame.args[2] |
| | | if not mode or not id then |
| local data = loadData('User:IanComradeBot/prototypes/entity sprite.json')
| | return "Ошибка: отсутствует режим или ID" |
| if not data or type(data) ~= 'table' then | |
| return 'Ошибка: Невозможно загрузить данные из JSON.' | |
| end | | end |
|
| |
|
| local spritePathIndex = createSpritePathIndex(data)
| | if mode == "image" then |
| | | for _, entry in ipairs(spriteData) do |
| if param == "repeat" then | | if entry.id == id then |
| return generateRepeatTemplate(data)
| | local sprite = getSpritePath(entry) |
| elseif param == "path" and secondaryParam then
| | return sprite or "Ошибка: спрайт не найден" |
| for _, entry in ipairs(data) do | |
| local template = generateTemplate(entry, param, secondaryParam, data, spritePathIndex) | |
| if template then
| |
| return template | |
| end | | end |
| end | | end |
| return nil | | return "Ошибка: ID не найден" |
| elseif param == "image" or param == "path" then | | elseif mode == "path" then |
| local result = {}
| | for _, entry in ipairs(spriteData) do |
| for _, entry in ipairs(data) do | | if getSpritePath(entry) == id then |
| local template = generateTemplate(entry, param, secondaryParam, data, spritePathIndex) | | return entry.id |
| if template then
| |
| table.insert(result, template) | |
| end | | end |
| end | | end |
| return table.concat(result, "\n") | | return "Ошибка: путь не найден" |
| else | | else |
| return generateDefaultTemplate(data, frame.args) | | return "Ошибка: неизвестный режим" |
| end | | end |
| end | | end |
|
| |
|
| return p | | return p |