Модуль:Prototypes/Роль/Экипировка: различия между версиями

Материал из Space Station 14 Вики
мНет описания правки
мНет описания правки
Строка 24: Строка 24:
function p.main(frame)
function p.main(frame)
     local args = frame.args
     local args = frame.args
     local slot  = args[1] or ""
    -- Обрезаем пробелы
     local jobId = args[2] or ""
     local slot  = mw.text.trim(args[1] or "")
     local jobId = mw.text.trim(args[2] or "")
      
      
     if slot == "" or jobId == "" then
     if slot == "" or jobId == "" then
Строка 31: Строка 32:
     end
     end


    -- Поиск должности по id
     -- 1. Пытаемся получить экипировку через gearloadoutGroup
    local job = findById(jobData, jobId)
     local combinedId = jobId .. capitalizeFirst(slot)
    if not job then
    local groupEntry = findById(gearloadoutGroup, combinedId)
        return "Ошибка: не найдена должность с id " .. jobId
    if groupEntry and groupEntry.loadouts and #groupEntry.loadouts > 0 then
    end
        local firstLoadoutId = groupEntry.loadouts[1]
 
        local loadoutEntry = findById(gearloadout, firstLoadoutId)
    -- Получение id набора экипировки из должности
        if loadoutEntry and loadoutEntry.equipment and loadoutEntry.equipment[slot] and loadoutEntry.equipment[slot] ~= "" then
    local gearId = job.startingGear
            local itemId = loadoutEntry.equipment[slot]
    if not gearId then
            -- Если слот "back" – добавляем информацию из storage
        return "Ошибка: у должности с id " .. jobId .. " не указан startingGear"
            if slot == "back" and loadoutEntry.storage and loadoutEntry.storage.back then
    end
                 local storageBack = ""
 
                for _, storageItem in ipairs(loadoutEntry.storage.back) do
    -- Поиск набора экипировки в gearData по id
                    storageBack = storageBack .. string.format("{{#invoke:Prototypes/Предмет/Содержание|main|%s}}", storageItem)
    local gear = findById(gearData, gearId)
                end
    if not gear then
                return frame:preprocess(string.format("{{#invoke:Prototypes/Предмет/Содержание|image|%s|%s}}", itemId, storageBack))
        return "Ошибка: не найдена экипировка с id " .. gearId
            else
    end
                return frame:preprocess(string.format("{{#invoke:Prototypes/Предмет/Содержание|image|%s}}", itemId))
    if not gear.equipment then
        return "Ошибка: в экипировке с id " .. gearId .. " отсутствует раздел equipment"
    end
 
     -- 1. Попытка получить экипировку из gearData
    local itemId = gear.equipment[slot]
    local sourceGear = gear
   
    -- 2. Если в gearData для данного слота ничего не найдено, переходим к поиску через gearloadoutGroup
     if not itemId or 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]
                 sourceGear = loadoutEntry
             end
             end
         end
         end
     end
     end


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


return p
return p

Версия от 12:12, 13 февраля 2025

Для документации этого модуля может быть создана страница Модуль: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