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

мНет описания правки
мНет описания правки
Строка 21: Строка 21:
     if not str or str == "" then return "" end
     if not str or str == "" then return "" end
     return str:sub(1,1):upper() .. str:sub(2)
     return str:sub(1,1):upper() .. str:sub(2)
end
-- Функция для преобразования первой буквы
local function capitalize(s)
    return (s:gsub("^%l", string.upper))
end
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 modeOrSlot = mw.text.trim(args[1] or "")
   
    -- Режим "special": вывод специальных имплантов
    if modeOrSlot == "special" then
        local jobId = mw.text.trim(args[2] or "")
        if jobId == "" then
            return "Ошибка: Не задан jobId для режима special."
        end
       
        jobId = capitalizeFirst(jobId)
        local job = findById(jobData, jobId)
        if not job then
            return "Ошибка: не найдена должность с id " .. jobId
        end
       
        if not job.special or #job.special == 0 then
            return "Нет специальных данных для должности " .. jobId
        end
       
        local implantsFound = nil
        for _, spec in ipairs(job.special) do
            if spec["!type"] == "AddImplantSpecial" then
                implantsFound = spec.implants
                break
            end
        end
       
        if not implantsFound or #implantsFound == 0 then
            return "Специальных имплантов не найдено для должности " .. jobId
        end
       
        local resultList = {}
        for _, implant in ipairs(implantsFound) do
            table.insert(resultList, string.format("{{#invoke:Entity Lookup|getname|%s}}", implant))
        end
        local resultStr = table.concat(resultList, ", ")
        return resultStr
    end
 
    -- Если режим не "special", то первый параметр считается слотом,
    -- а второй – id должности, и используется базовая логика поиска экипировки.
    local slot  = modeOrSlot
     local jobId = mw.text.trim(args[2] or "")
     local jobId = mw.text.trim(args[2] or "")
      
      
Строка 32: Строка 78:
     end
     end


    -- Приводим jobId к виду с заглавной первой буквой
     jobId = capitalizeFirst(jobId)
     jobId = capitalizeFirst(jobId)
   
    -- Поиск должности по id
     local job = findById(jobData, jobId)
     local job = findById(jobData, jobId)
     if not job then
     if not job then
Строка 41: Строка 84:
     end
     end


    -- Получение id набора экипировки из должности
     local gearId = job.startingGear
     local gearId = job.startingGear
     if not gearId then
     if not gearId then
Строка 47: Строка 89:
     end
     end


    -- Поиск набора экипировки в gearData по id
     local gear = findById(gearData, gearId)
     local gear = findById(gearData, gearId)
     if not gear then
     if not gear then
Строка 54: Строка 95:


     local gearEquipment = gear.equipment or {}
     local gearEquipment = gear.equipment or {}
    -- 1. Сначала пытаемся получить экипировку из gearData
     local itemId = gearEquipment[slot] or ""
     local itemId = gearEquipment[slot] or ""
     local sourceGear = gear  
     local sourceGear = gear


     -- 2. Если для данного слота в gearData ничего не найдено – ищем через loadoutGroup / loadout
     -- Если в gearData для указанного слота ничего не найдено – ищем через loadoutGroup / loadout
     if itemId == "" then
     if itemId == "" then
        -- Используем вашу логику для поиска
        local function capitalize(s)
            return (s:gsub("^%l", string.upper))
        end
        -- Здесь используем jobId в качестве "role"
         local groupID = jobId .. capitalize(slot)
         local groupID = jobId .. capitalize(slot)
   
        -- Ищем нужную группу в gearloadoutGroup
         local groupFound = nil
         local groupFound = nil
         for _, group in ipairs(gearloadoutGroup) do
         for _, group in ipairs(gearloadoutGroup) do
Строка 79: Строка 110:


         if not groupFound then
         if not groupFound then
             return ""
             return "Группа не найдена: " .. groupID
         end
         end


        -- Перебираем варианты loadouts из найденной группы
         for _, loadoutID in ipairs(groupFound.loadouts) do
         for _, loadoutID in ipairs(groupFound.loadouts) do
             for _, loadout in ipairs(gearloadout) do
             for _, loadout in ipairs(gearloadout) do
Строка 97: Строка 127:
     end
     end


    -- 3. Если экипировка так и не найдена, возвращаем пустую строку
     if itemId == "" then
     if itemId == "" then
         return ""
         return ""
     end
     end


     -- 4. Если слот "back", добавляем содержимое из storage
     -- Если слот "back" и присутствует storage, добавляем обработку элементов из storage.back
     if slot == "back" and sourceGear.storage and sourceGear.storage.back then
     if slot == "back" and sourceGear.storage and sourceGear.storage.back then
         local storageBack = ""
         local storageBack = ""