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

мНет описания правки
мНет описания правки
Строка 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