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

Материал из Space Station 14 Вики
мНет описания правки
мНет описания правки
Строка 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

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

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

local p = {}

function p.main(frame)
    local args = frame.args
    local slot = args[1]
    local role = args[2]

    if not slot or not role then
        return "Ошибка: не указан слот или роль."
    end

    local gearloadout = mw.loadData("Модуль:IanComradeBot/loadout.json/data")
    local gearloadoutGroup = mw.loadData("Модуль:IanComradeBot/loadoutGroup.json/data")

    local function capitalize(s)
        return (s:gsub("^%l", string.upper))
    end

    local groupID = role .. capitalize(slot)

    local groupFound = nil
    for _, group in ipairs(gearloadoutGroup) do
        if group.id == groupID then
            groupFound = group
            break
        end
    end

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

    for _, loadoutID in ipairs(groupFound.loadouts) do
        for _, loadout in ipairs(gearloadout) do
            if loadout.id == loadoutID then
                if loadout.equipment and loadout.equipment[slot] then
                    return loadout.equipment[slot]
                end
            end
        end
    end

    return "Экипировка не найдена для слота: " .. slot
end

return p