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

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


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


-- Поиск данных по ID
-- Поиск данных по ID
local function findDataById(data, id)
findDataById = function(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
Строка 34: Строка 37:


-- Форматирование одного содержимого
-- Форматирование одного содержимого
local function formatContent(content)
formatContent = function(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)
Строка 52: Строка 55:
end
end


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


local function getContainedOutput(data, id, wrapped)
-- Функция выбора элемента на основе веса
    local item = findDataById(data, id)
pickByWeight = function(children)
    if not item then return '' end
     local totalWeight = 0
 
     for _, child in ipairs(children) do
     local result = ''
         totalWeight = totalWeight + (child.weight or 1) -- Если вес не указан, принимаем за 1
     if item.StorageFill and item.StorageFill.contents then
     end
         result = result .. getContentsOutput(item.StorageFill.contents)
     elseif item.EntityTableContainerFill and item.EntityTableContainerFill.containers then
        local containers = item.EntityTableContainerFill.containers
        local tableId = containers.storagebase and containers.storagebase.tableId
                        or containers.entity_storage and containers.entity_storage.tableId
                        or containers.other_storage and containers.other_storage.tableId


        local rolls = containers.storagebase and containers.storagebase.rolls and containers.storagebase.rolls.value
    local rand = math.random() * totalWeight -- Случайное число от 0 до totalWeight
                  or containers.entity_storage and containers.entity_storage.rolls and containers.entity_storage.rolls.value
    local cumulativeWeight = 0
                  or 1


         if tableId then
    for _, child in ipairs(children) do
            result = result .. getTableOutput(tableId, rolls)
         cumulativeWeight = cumulativeWeight + (child.weight or 1)
         else
         if rand <= cumulativeWeight then
             result = result .. 'Таблица не найдена.'
             return child
         end
         end
     end
     end


     return result
     return nil
end
 
-- Обработка таблиц
getTableOutput = function(tableId, rolls)
    local allSelectors = loadData('User:IanComradeBot/prototypes/AllSelector.json', 'selectors')
    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)
 
    if not children then return 'Таблица не содержит элементов.' end
 
    if tableData['!type:AllSelector'] then
        return processAllSelectors(children)
    else
        return processNestedSelectors(children, rolls)
    end
end
end


local function processAllSelectors(children)
-- Обработка AllSelector
processAllSelectors = function(children)
     local result = ''
     local result = ''
     for _, child in ipairs(children) do
     for _, child in ipairs(children) do
Строка 97: Строка 110:
             result = result .. processAllSelectors(child.children)
             result = result .. processAllSelectors(child.children)
         elseif child["!type"] == "NestedSelector" and child.tableId then
         elseif child["!type"] == "NestedSelector" and child.tableId then
             local nestedRolls = child.rolls and (child.rolls.value or math.random(tonumber(child.rolls.range:match("(%d+),%s*(%d+)")))) or 1
             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)
             result = result .. getTableOutput(child.tableId, nestedRolls)
         end
         end
Строка 104: Строка 129:
end
end


local function getTableOutput(tableId, rolls)
-- Обработка вложенных таблиц
    local allSelectors = loadData('User:IanComradeBot/prototypes/AllSelector.json', 'selectors')
processNestedSelectors = function(children, rolls)
    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)
 
    if not children then return 'Таблица не содержит элементов.' end
 
    if tableData['!type:AllSelector'] then
        return processAllSelectors(children)
    else
        return processNestedSelectors(children, rolls)
    end
end
 
local function processNestedSelectors(children, rolls)
     local result = ''
     local result = ''
     for i = 1, rolls do
     for i = 1, rolls do
Строка 130: Строка 142:
                 result = result .. processAllSelectors(selectedChild.children)
                 result = result .. processAllSelectors(selectedChild.children)
             elseif selectedChild["!type"] == "NestedSelector" and selectedChild.tableId then
             elseif selectedChild["!type"] == "NestedSelector" and selectedChild.tableId then
                 local nestedRolls = selectedChild.rolls and (selectedChild.rolls.value or math.random(tonumber(selectedChild.rolls.range:match("(%d+),%s*(%d+)")))) or 1
                 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)
                 result = result .. getTableOutput(selectedChild.tableId, nestedRolls)
             end
             end
         end
         end
     end
     end
    return result
end
-- Формирование списка содержащихся предметов или таблиц
getContainedOutput = function(data, id, wrapped)
    local item = findDataById(data, id)
    if not item then return '' end
    local result = ''
    if item.StorageFill and item.StorageFill.contents then
        result = result .. getContentsOutput(item.StorageFill.contents)
    elseif item.EntityTableContainerFill and item.EntityTableContainerFill.containers then
        local containers = item.EntityTableContainerFill.containers
        local tableId = containers.storagebase and containers.storagebase.tableId
                        or containers.entity_storage and containers.entity_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
            result = result .. getTableOutput(tableId, rolls)
        else
            result = result .. 'Таблица не найдена.'
        end
    end
    return result
end
-- Формирование списка химии
getChemOutput = function(data, id)
    local item = findDataById(data, id)
    if not item then return '' end
    local solutions = item.SolutionContainerManager and item.SolutionContainerManager.solutions
    if not solutions then return '' end
    local result = '<ul class="1">'
    for _, solution in pairs(solutions) do
        for _, reagent in ipairs(solution.reagents) do
            result = result .. string.format('<li>[[Химия#chem_%s|%s]] (%d ед.)</li>', reagent.ReagentId, reagent.ReagentId, reagent.Quantity)
        end
    end
    result = result .. '</ul>'
     return result
     return result
end
end