Модуль:Prototypes/Роль/Экипировка

Материал из Space Station 14 Вики

Для документации этого модуля может быть создана страница Модуль:Prototypes/Роль/Экипировка/doc

-- Загрузка данных
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 = {}

-- Функция для поиска объекта по id
local function findById(tbl, id)
    for _, v in pairs(tbl) do
        if v.id == id then
            return v
        end
    end
    return nil
end

-- Функция для преобразования первого символа строки в заглавный
local function capitalizeFirst(str)
    return str:sub(1,1):upper() .. str:sub(2)
end

function p.main(frame)
    local args = frame.args
    -- Обрезаем пробелы
    local slot  = mw.text.trim(args[1] or "")
    local jobId = mw.text.trim(args[2] or "")
    
    if slot == "" or jobId == "" then
        return "Ошибка: Не заданы необходимые параметры. Используйте: {{#invoke:Prototypes/Роль/Экипировка|main|<slot>|<jobId>}}"
    end

    -- 1. Пытаемся получить экипировку через gearloadoutGroup
    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 and loadoutEntry.equipment[slot] and loadoutEntry.equipment[slot] ~= "" then
            local itemId = loadoutEntry.equipment[slot]
            -- Если слот "back" – добавляем информацию из storage
            if slot == "back" and loadoutEntry.storage and loadoutEntry.storage.back then
                local storageBack = ""
                for _, storageItem in ipairs(loadoutEntry.storage.back) do
                    storageBack = storageBack .. string.format("{{#invoke:Prototypes/Предмет/Содержание|main|%s}}", storageItem)
                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
    end

    -- 2. Если через loadoutGroup ничего не нашли – используем запасной вариант через gearData
    local job = findById(jobData, jobId)
    if job then
        local gearId = job.startingGear
        if gearId then
            local gear = findById(gearData, gearId)
            if gear and gear.equipment and gear.equipment[slot] and gear.equipment[slot] ~= "" then
                local itemId = gear.equipment[slot]
                if slot == "back" and gear.storage and gear.storage.back then
                    local storageBack = ""
                    for _, storageItem in ipairs(gear.storage.back) do
                        storageBack = storageBack .. string.format("{{#invoke:Prototypes/Предмет/Содержание|main|%s}}", storageItem)
                    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
        else
            return "Ошибка: у должности с id " .. jobId .. " не указан startingGear"
        end
    else
        return "Ошибка: не найдена должность с id " .. jobId
    end

    return ""
end

return p