Модуль:Prototypes/Хранилище/Предмет: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) мНет описания правки |
||
| Строка 5: | Строка 5: | ||
selectors = nil | selectors = nil | ||
} | } | ||
local loadData, findDataById, formatContent, getContentsOutput, pickByWeight | |||
local getTableOutput, processAllSelectors, processNestedSelectors, getContainedOutput, getChemOutput | |||
-- Функция для загрузки данных с кешированием | -- Функция для загрузки данных с кешированием | ||
loadData = function(filePath, cacheKey) | |||
if cache[cacheKey] then | if cache[cacheKey] then | ||
return cache[cacheKey] | return cache[cacheKey] | ||
| Строка 23: | Строка 26: | ||
-- Поиск данных по ID | -- Поиск данных по 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: | ||
-- Форматирование одного содержимого | -- Форматирование одного содержимого | ||
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 | ||
-- Получение содержимого | |||
getContentsOutput = function(contents) | |||
local result = '' | local result = '' | ||
for _, content in ipairs(contents) do | for _, content in ipairs(contents) do | ||
| Строка 60: | Строка 64: | ||
end | end | ||
-- Функция выбора элемента на основе веса | |||
pickByWeight = function(children) | |||
local totalWeight = 0 | |||
for _, child in ipairs(children) do | |||
local | totalWeight = totalWeight + (child.weight or 1) -- Если вес не указан, принимаем за 1 | ||
end | |||
local rand = math.random() * totalWeight -- Случайное число от 0 до totalWeight | |||
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 | 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 | ||
-- Обработка 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 | 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 | ||
-- Обработка вложенных таблиц | |||
processNestedSelectors = function(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 | 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 | ||