Модуль:Песочница/Pok: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 2: | Строка 2: | ||
--------------------------------------------------------------------- | --------------------------------------------------------------------- | ||
-- Загрузка данных | -- Загрузка данных из разных модулей | ||
--------------------------------------------------------------------- | --------------------------------------------------------------------- | ||
local itemData = mw.loadData("Модуль:IanComradeBot/prototypes/fills/Item.json/data") | |||
local itemData | local tableData = mw.loadData("Модуль:IanComradeBot/prototypes/table.json/data") | ||
local tableData | local gearData = mw.loadData("Модуль:IanComradeBot/startingGear.json/data") | ||
local | local gearRoleLoadout = mw.loadData("Модуль:IanComradeBot/roleLoadout.json/data") | ||
local | local loadoutData = mw.loadData("Модуль:IanComradeBot/loadout.json/data") | ||
local | local loadoutGroupData = mw.loadData("Модуль:IanComradeBot/loadoutGroup.json/data") | ||
local | local cargoData = mw.loadData("Модуль:IanComradeBot/prototypes/сargo.json/base") | ||
local latheData = mw.loadData("Модуль:IanComradeBot/prototypes/lathe.json/data") | |||
local recipeData = mw.loadData("Модуль:IanComradeBot/prototypes/lathe/recipes.json/data") | |||
local researchData = mw.loadData("Модуль:IanComradeBot/prototypes/research.json/data") | |||
local materialData = mw.loadData("Модуль:IanComradeBot/prototypes/materials.json/data") | |||
local chemDataLathe = mw.loadData("Модуль:IanComradeBot/chem prototypes.json/data") | |||
-- | --------------------------------------------------------------------- | ||
-- Функции для обратного поиска | |||
--------------------------------------------------------------------- | |||
-- | -- Функция для рекурсивного поиска id предмета в произвольной структуре таблицы. | ||
local | local function searchItemInStructure(struct, targetId) | ||
if type(struct) ~= "table" then | |||
return false | |||
end | |||
if struct.id and struct.id == targetId then | |||
return true | |||
end | |||
for _, v in pairs(struct) do | |||
if type(v) == "table" then | |||
if searchItemInStructure(v, targetId) then | |||
return true | |||
end | |||
end | |||
end | |||
return false | |||
end | |||
-- | --------------------------------------------------------------------- | ||
-- Обратный поиск по содержимому (reverseContained) | |||
local | -- По заданному id предмета ищем таблицы, в которых он встречается, | ||
-- а затем в itemData ищем хранилища, где используются найденные таблицы. | |||
--------------------------------------------------------------------- | |||
function p.reverseContained(frame) | |||
local targetId = frame.args[2] | |||
if not targetId or targetId == "" then | |||
return "Ошибка: не указан id предмета для обратного поиска." | |||
end | |||
local | local matchingTables = {} | ||
-- Перебираем все записи таблиц | |||
if | for tableId, tblEntry in pairs(tableData) do | ||
if type(tblEntry) == "table" then | |||
if searchItemInStructure(tblEntry, targetId) then | |||
table.insert(matchingTables, tableId) | |||
end | |||
end | |||
end | |||
if #matchingTables == 0 then | |||
return "Таблица, содержащая предмет с id " .. targetId .. ", не найдена." | |||
end | |||
local | local matchingStorages = {} | ||
if type( | -- Ищем в itemData хранилища, в которых используется найденная таблица | ||
if | for storageId, storage in pairs(itemData) do | ||
if type(storage) == "table" and storage.EntityTableContainerFill and storage.EntityTableContainerFill.containers then | |||
local containers = storage.EntityTableContainerFill.containers | |||
if containers.entity_storage and containers.entity_storage.tableId then | |||
for _, tblId in ipairs(matchingTables) do | |||
if containers.entity_storage.tableId == tblId then | |||
table.insert(matchingStorages, storageId) | |||
end | |||
end | |||
end | end | ||
for _, | if containers.storagebase and containers.storagebase.tableId then | ||
for _, tblId in ipairs(matchingTables) do | |||
if containers.storagebase.tableId == tblId then | |||
table.insert(matchingStorages, storageId) | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
if #matchingStorages == 0 then | |||
return "Хранилище, вызывающее найденные таблицы, не найдено." | |||
end | |||
return "Найденные хранилища: " .. table.concat(matchingStorages, ", ") | |||
end | |||
--------------------------------------------------------------------- | |||
-- Обратный поиск для экипировки (reverseEquipment) | |||
-- По заданному id оборудования ищем, в каких наборах экипировки (gear или loadout) | |||
-- оно используется, и возвращаем id набора с указанием слота. | |||
--------------------------------------------------------------------- | |||
local function searchEquipmentInTable(equipmentTable, targetId) | |||
for slot, equipId in pairs(equipmentTable or {}) do | |||
if equipId == targetId then | |||
return slot | |||
end | end | ||
end | end | ||
return nil | |||
return | |||
end | end | ||
function p.reverseEquipment(frame) | |||
local | local targetId = frame.args[2] | ||
local slotFilter = frame.args[3] -- если указан, фильтруем по конкретному слоту | |||
if not targetId or targetId == "" then | |||
return "Ошибка: не указан id оборудования для обратного поиска." | |||
end | |||
local results = {} | |||
-- Поиск в startingGear (gearData) | |||
for gearId, gear in pairs(gearData) do | for gearId, gear in pairs(gearData) do | ||
if gear.equipment then | if gear.equipment then | ||
for slot, equipId in pairs(gear.equipment) do | for slot, equipId in pairs(gear.equipment) do | ||
if equipId == | if equipId == targetId and (not slotFilter or slot == slotFilter) then | ||
table.insert( | table.insert(results, "Gear: " .. gearId .. " (слот: " .. slot .. ")") | ||
end | end | ||
end | end | ||
| Строка 84: | Строка 126: | ||
end | end | ||
-- Поиск в loadout (loadoutData) | |||
for loadoutId, loadout in pairs(loadoutData) do | |||
if loadout.equipment then | |||
for slot, equipId in pairs(loadout.equipment) do | |||
if equipId == targetId and (not slotFilter or slot == slotFilter) then | |||
table.insert(results, "Loadout: " .. loadoutId .. " (слот: " .. slot .. ")") | |||
end | end | ||
end | end | ||
| Строка 104: | Строка 137: | ||
end | end | ||
if #results == 0 then | |||
return "Оборудование с id " .. targetId .. " не найдено в наборах экипировки." | |||
end | |||
return "Найдено использование оборудования: " .. table.concat(results, "; ") | |||
end | end | ||
local | --------------------------------------------------------------------- | ||
-- Обратный поиск для груза (cargo) (reverseCargo) | |||
-- По заданному режиму (product, cost, category, icon) и значению ищем запись cargo и возвращаем её id. | |||
--------------------------------------------------------------------- | |||
function p.reverseCargo(frame) | |||
local mode = frame.args[2] | |||
local searchValue = frame.args[3] | |||
if not mode or mode == "" or not searchValue or searchValue == "" then | |||
return "Ошибка: необходимо указать режим (product, cost, category, icon) и значение для поиска." | |||
end | |||
local foundIds = {} | |||
for _, entry in ipairs(cargoData) do | for _, entry in ipairs(cargoData) do | ||
if entry | if mode == "product" and entry.product == searchValue then | ||
return | table.insert(foundIds, entry.id) | ||
elseif mode == "cost" and tostring(entry.cost) == searchValue then | |||
table.insert(foundIds, entry.id) | |||
elseif mode == "category" and entry.category == searchValue then | |||
table.insert(foundIds, entry.id) | |||
elseif mode == "icon" and entry.icon and entry.icon.sprite == searchValue then | |||
table.insert(foundIds, entry.id) | |||
end | |||
end | |||
if #foundIds == 0 then | |||
return "Запись для режима " .. mode .. " со значением '" .. searchValue .. "' не найдена." | |||
end | |||
return "Найденные записи cargo: " .. table.concat(foundIds, ", ") | |||
end | |||
--------------------------------------------------------------------- | |||
-- Обратный поиск для станков (lathe) (reverseLathe) | |||
-- По заданному результату рецепта ищем рецепты станков и возвращаем id станка, который его производит. | |||
--------------------------------------------------------------------- | |||
local function getRecipeById(recipeId) | |||
for _, recipe in ipairs(recipeData) do | |||
if recipe.id == recipeId then | |||
return recipe | |||
end | end | ||
end | end | ||
| Строка 116: | Строка 188: | ||
end | end | ||
local function | function p.reverseLathe(frame) | ||
local targetResult = frame.args[2] | |||
if not targetResult or targetResult == "" then | |||
return "Ошибка: не указан результат рецепта для обратного поиска." | |||
end | |||
local matchingLathes = {} | |||
-- Вспомогательная функция для проверки набора рецептов | |||
local function checkRecipes(recipeIds) | |||
for _, recipeId in ipairs(recipeIds or {}) do | |||
local recipe = getRecipeById(recipeId) | |||
if recipe and recipe.result == targetResult then | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
for _, lathe in ipairs(latheData) do | for _, lathe in ipairs(latheData) do | ||
local found = false | local found = false | ||
if lathe.Lathe then | if lathe.Lathe then | ||
if lathe.Lathe.staticRecipes | if checkRecipes(lathe.Lathe.staticRecipes) or checkRecipes(lathe.Lathe.dynamicRecipes) then | ||
found = true | |||
end | end | ||
end | |||
if not found and lathe.EmagLatheRecipes then | |||
if checkRecipes(lathe.EmagLatheRecipes.emagStaticRecipes) or checkRecipes(lathe.EmagLatheRecipes.emagDynamicRecipes) then | |||
found = true | |||
end | end | ||
end | end | ||
if lathe. | if found and lathe.id then | ||
table.insert(matchingLathes, lathe.id) | |||
end | end | ||
end | end | ||
return | |||
if #matchingLathes == 0 then | |||
return "Станок, производящий '" .. targetResult .. "', не найден." | |||
end | |||
return "Найденные станки: " .. table.concat(matchingLathes, ", ") | |||
end | end | ||
--------------------------------------------------------------------- | |||
-- Основная функция модуля | |||
-- Принимает первым аргументом режим обратного поиска: | |||
-- reverseContained, reverseEquipment, reverseCargo, reverseLathe. | |||
-- Второй (и последующие) аргументы передаются соответствующим функциям. | |||
--------------------------------------------------------------------- | |||
function p.main(frame) | function p.main(frame) | ||
local mode = | local mode = frame.args[1] | ||
if not mode or mode == "" then | |||
return "Ошибка: не указан режим обратного поиска. Доступные режимы: reverseContained, reverseEquipment, reverseCargo, reverseLathe." | |||
if mode | |||
return "Ошибка: не | |||
end | end | ||
if mode == " | if mode == "reverseContained" then | ||
return p.reverseContained(frame) | |||
elseif mode == "reverseEquipment" then | |||
return p.reverseEquipment(frame) | |||
elseif mode == " | |||
elseif mode == "reverseCargo" then | elseif mode == "reverseCargo" then | ||
return p.reverseCargo(frame) | |||
elseif mode == "reverseLathe" then | elseif mode == "reverseLathe" then | ||
return p.reverseLathe(frame) | |||
else | else | ||
return " | return "Неизвестный режим: " .. mode .. ". Доступные режимы: reverseContained, reverseEquipment, reverseCargo, reverseLathe." | ||
end | end | ||
end | end | ||
return p | return p | ||