Модуль:Prototypes/Хранилище/Предмет: различия между версиями

мНет описания правки
Нет описания правки
Метка: ручная отмена
Строка 5: Строка 5:
     selectors = nil
     selectors = nil
}
}
local loadData, findDataById, formatContent, getContentsOutput, pickByWeight
local getTableOutput, processAllSelectors, processNestedSelectors, getContainedOutput, getChemOutput


-- Функция для загрузки данных с кешированием
-- Функция для загрузки данных с кешированием
loadData = function(filePath, cacheKey)
local function loadData(filePath, cacheKey)
     if cache[cacheKey] then
     if cache[cacheKey] then
         return cache[cacheKey]
         return cache[cacheKey]
Строка 26: Строка 23:


-- Поиск данных по ID
-- Поиск данных по ID
findDataById = function(data, id)
local function findDataById(data, id)
     if not data then return nil end
     if not data then return nil end
     for _, item in ipairs(data) do
     for _, item in ipairs(data) do
Строка 37: Строка 34:


-- Форматирование одного содержимого
-- Форматирование одного содержимого
formatContent = function(content)
local function formatContent(content)
     local name = string.format('{{#invoke:Entity Lookup|getname|%s}}', content.id)
     local name = string.format('{{#invoke:Entity Lookup|getname|%s}}', content.id)
     local image = string.format('%s.png', content.id)
     local image = string.format('%s.png', content.id)
Строка 56: Строка 53:


-- Получение содержимого
-- Получение содержимого
getContentsOutput = function(contents)
local function getContentsOutput(contents)
     local result = ''
     local result = ''
     for _, content in ipairs(contents) do
     for _, content in ipairs(contents) do
Строка 64: Строка 61:
end
end


-- Функция выбора элемента на основе веса
-- Обработка вложенных таблиц
pickByWeight = function(children)
local function processNestedSelectors(children)
     local totalWeight = 0
     local result = ''
     for _, child in ipairs(children) do
     for _, child in ipairs(children) do
         totalWeight = totalWeight + (child.weight or 1) -- Если вес не указан, принимаем за 1
         if child.id then
    end
            result = result .. formatContent(child)
 
         elseif child["!type"] == "NestedSelector" and child.tableId then
    local rand = math.random() * totalWeight -- Случайное число от 0 до totalWeight
             result = result .. getTableOutput(child.tableId)
    local cumulativeWeight = 0
 
    for _, child in ipairs(children) do
         cumulativeWeight = cumulativeWeight + (child.weight or 1)
        if rand <= cumulativeWeight then
             return child
         end
         end
     end
     end
 
     return result
     return nil
end
end


-- Обработка таблиц
-- Обработка таблиц
getTableOutput = function(tableId, rolls)
local function getTableOutput(tableId)
     local allSelectors = loadData('User:IanComradeBot/prototypes/AllSelector.json', 'selectors')
     local allSelectors = loadData('User:IanComradeBot/prototypes/AllSelector.json', 'selectors')
     local tableData = findDataById(allSelectors, tableId)
     local tableData = findDataById(allSelectors, tableId)
     local children = tableData and (tableData['!type:GroupSelector'] and tableData['!type:GroupSelector'].children or tableData['!type:AllSelector'] and tableData['!type:AllSelector'].children)
     local children = tableData and tableData['!type:AllSelector'] and tableData['!type:AllSelector'].children


     if not children then return 'Таблица не содержит элементов.' end
     if not children then return 'Таблица не содержит элементов.' end


     if tableData['!type:AllSelector'] then
     return processNestedSelectors(children)
        return processAllSelectors(children)
    else
        return processNestedSelectors(children, rolls)
    end
end
 
-- Обработка AllSelector
processAllSelectors = function(children)
    local result = ''
    for _, child in ipairs(children) do
        if child.id then
            result = result .. formatContent(child)
        elseif child["!type"] == "GroupSelector" and child.children then
            result = result .. processNestedSelectors(child.children, 1)
        elseif child["!type"] == "AllSelector" and child.children then
            result = result .. processAllSelectors(child.children)
        elseif child["!type"] == "NestedSelector" and child.tableId then
            local nestedRolls
            if child.rolls then
                if child.rolls.value then
                    nestedRolls = child.rolls.value
                elseif child.rolls.range then
                    local rangeParts = {string.match(child.rolls.range, "(%d+),%s*(%d+)")}
                    nestedRolls = math.random(tonumber(rangeParts[1]), tonumber(rangeParts[2]))
                else
                    nestedRolls = 1
                end
            else
                nestedRolls = 1
            end
            result = result .. getTableOutput(child.tableId, nestedRolls)
        end
    end
    return result
end
 
-- Обработка вложенных таблиц
processNestedSelectors = function(children, rolls)
    local result = ''
    for i = 1, rolls do
        local selectedChild = pickByWeight(children)
        if selectedChild then
            if selectedChild.id then
                result = result .. formatContent(selectedChild)
            elseif selectedChild["!type"] == "GroupSelector" and selectedChild.children then
                result = result .. processNestedSelectors(selectedChild.children, 1)
            elseif selectedChild["!type"] == "AllSelector" and selectedChild.children then
                result = result .. processAllSelectors(selectedChild.children)
            elseif selectedChild["!type"] == "NestedSelector" and selectedChild.tableId then
                local nestedRolls
                if selectedChild.rolls then
                    if selectedChild.rolls.value then
                        nestedRolls = selectedChild.rolls.value
                    elseif selectedChild.rolls.range then
                        local rangeParts = {string.match(selectedChild.rolls.range, "(%d+),%s*(%d+)")}
                        nestedRolls = math.random(tonumber(rangeParts[1]), tonumber(rangeParts[2]))
                    else
                        nestedRolls = 1
                    end
                else
                    nestedRolls = 1
                end
                result = result .. getTableOutput(selectedChild.tableId, nestedRolls)
            end
        end
    end
    return result
end
end


-- Формирование списка содержащихся предметов или таблиц
-- Формирование списка содержащихся предметов или таблиц
getContainedOutput = function(data, id, wrapped)
local function getContainedOutput(data, id, wrapped)
     local item = findDataById(data, id)
     local item = findDataById(data, id)
     if not item then return '' end
     if not item then return '' end
Строка 175: Строка 98:
                         or containers.entity_storage and containers.entity_storage.tableId
                         or containers.entity_storage and containers.entity_storage.tableId
                         or containers.other_storage and containers.other_storage.tableId
                         or containers.other_storage and containers.other_storage.tableId
        local rolls = containers.storagebase and containers.storagebase.rolls and containers.storagebase.rolls.value
                  or containers.entity_storage and containers.entity_storage.rolls and containers.entity_storage.rolls.value
                  or 1


         if tableId then
         if tableId then
             result = result .. getTableOutput(tableId, rolls)
             result = result .. getTableOutput(tableId)
         else
         else
             result = result .. 'Таблица не найдена.'
             result = result .. 'Таблица не найдена.'
Строка 191: Строка 110:


-- Формирование списка химии
-- Формирование списка химии
getChemOutput = function(data, id)
local function getChemOutput(data, id)
     local item = findDataById(data, id)
     local item = findDataById(data, id)
     if not item then return '' end
     if not item then return '' end