|
|
| Строка 1: |
Строка 1: |
| -- Загрузка данных
| |
| local jobData = mw.loadData("Модуль:IanComradeBot/job.json/data")
| |
| local gearData = mw.loadData("Модуль:IanComradeBot/startingGear.json/data")
| |
| local gearloadout = mw.loadData("Модуль:IanComradeBot/loadout.json/data")
| |
| local gearloadoutGroup = mw.loadData("Модуль:IanComradeBot/loadoutGroup.json/data")
| |
|
| |
| local p = {} | | local p = {} |
|
| |
| -- Функция для поиска объекта по id
| |
| local function findById(tbl, id)
| |
| for k, v in pairs(tbl) do
| |
| if k == id or (v.id and v.id == id) then
| |
| return v
| |
| end
| |
| end
| |
| return nil
| |
| end
| |
|
| |
| -- Функция для преобразования первого символа строки в заглавный
| |
| local function capitalizeFirst(str)
| |
| if not str or str == "" then return "" end
| |
| return str:sub(1,1):upper() .. str:sub(2)
| |
| end
| |
|
| |
|
| function p.main(frame) | | function p.main(frame) |
| local args = frame.args | | local args = frame.args |
| local slot = mw.text.trim(args[1] or "") | | local slot = args[1] |
| local jobId = mw.text.trim(args[2] or "") | | local role = args[2] |
|
| |
| if slot == "" or jobId == "" then
| |
| return "Ошибка: Не заданы необходимые параметры. Используйте: {{#invoke:Prototypes/Роль/Экипировка|main|<slot>|<jobId>}}"
| |
| end
| |
|
| |
|
| -- Приводим jobId к виду с заглавной первой буквой
| | if not slot or not role then |
| jobId = capitalizeFirst(jobId)
| | return "Ошибка: не указан слот или роль." |
|
| |
| -- Поиск должности по id
| |
| local job = findById(jobData, jobId)
| |
| if not job then | |
| return "Ошибка: не найдена должность с id " .. jobId | |
| end | | end |
|
| |
|
| -- Получение id набора экипировки из должности | | local gearloadout = mw.loadData("Модуль:IanComradeBot/loadout.json/data") |
| local gearId = job.startingGear | | local gearloadoutGroup = mw.loadData("Модуль:IanComradeBot/loadoutGroup.json/data") |
| if not gearId then
| |
| return "Ошибка: у должности с id " .. jobId .. " не указан startingGear"
| |
| end
| |
|
| |
|
| -- Поиск набора экипировки в gearData по id
| | local function capitalize(s) |
| local gear = findById(gearData, gearId) | | return (s:gsub("^%l", string.upper)) |
| if not gear then
| |
| return "Ошибка: не найдена экипировка с id " .. gearId | |
| end | | end |
|
| |
|
| local gearEquipment = gear.equipment or {} | | local groupID = role .. capitalize(slot) |
|
| |
|
| -- 1. Сначала пытаемся получить экипировку из gearData
| | local groupFound = nil |
| local itemId = gearEquipment[slot] or "" | | for _, group in ipairs(gearloadoutGroup) do |
| local sourceGear = gear | | if group.id == groupID then |
|
| | groupFound = group |
| -- 2. Если для данного слота в gearData ничего не найдено – ищем в loadoutGroup
| | break |
| if itemId == "" then
| |
| local combinedId = jobId .. capitalizeFirst(slot)
| |
| local groupEntry = findById(gearloadoutGroup, combinedId)
| |
| if groupEntry and groupEntry.loadouts and #groupEntry.loadouts > 0 then | |
| local firstLoadoutId = groupEntry.loadouts[1]
| |
| local loadoutEntry = findById(gearloadout, firstLoadoutId)
| |
| if loadoutEntry and loadoutEntry.equipment then | |
| itemId = loadoutEntry.equipment[slot] or ""
| |
| sourceGear = loadoutEntry
| |
| end | |
| end | | end |
| end | | end |
|
| |
|
| -- 3. Если экипировка так и не найдена, возвращаем пустую строку
| | if not groupFound then |
| if itemId == "" then | | return "Группа не найдена: " .. groupID |
| return "" | |
| end | | end |
|
| |
|
| -- 4. Если слот "back", добавляем содержимое из storage | | for _, loadoutID in ipairs(groupFound.loadouts) do |
| if slot == "back" and sourceGear.storage and sourceGear.storage.back then
| | for _, loadout in ipairs(gearloadout) do |
| local storageBack = ""
| | if loadout.id == loadoutID then |
| for _, storageItem in ipairs(sourceGear.storage.back) do | | if loadout.equipment and loadout.equipment[slot] then |
| storageBack = storageBack .. string.format("{{#invoke:Prototypes/Предмет/Содержание|main|%s}}", storageItem) | | return loadout.equipment[slot] |
| | end |
| | end |
| end | | end |
| return frame:preprocess(string.format("{{#invoke:Prototypes/Предмет/Содержание|image|%s|%s}}", itemId, storageBack))
| |
| else
| |
| return frame:preprocess(string.format("{{#invoke:Prototypes/Предмет/Содержание|image|%s}}", itemId))
| |
| end | | end |
| | |
| | return "Экипировка не найдена для слота: " .. slot |
| end | | end |
|
| |
|
| return p | | return p |