Модуль:TableOfRecipes: различия между версиями

Материал из МК14 | Space Station 14 Wiki
(скоро буду плакать)
м (Фиксы фиксы)
Строка 112: Строка 112:


     -- Перебираем отсортированные рецепты
     -- Перебираем отсортированные рецепты
    local count = 0
     for _, recipeData in ipairs(sortedRecipes) do
     for _, recipeData in ipairs(sortedRecipes) do
        count = count + 1
        if count > 10 then  -- Ограничим количество рецептов для тестирования
            break
        end
         local recipe = recipeData.data
         local recipe = recipeData.data
         local templateArgs = {}
         local templateArgs = {}
Строка 149: Строка 155:
         -- Обработка для sliceableRecipes
         -- Обработка для sliceableRecipes
         elseif recipeType == "sliceableRecipes" then
         elseif recipeType == "sliceableRecipes" then
             local input = translateID(frame, recipe.input) or "Нет входного элемента"
             local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
             local result = translateID(frame, recipe.result) or "Нет результата"
             local result = recipe.result and translateID(frame, recipe.result) or "Нет результата"
             local count = recipe.count or "Нет данных"
             local count = recipe.count or "Нет данных"


Строка 161: Строка 167:
         -- Обработка для grindableRecipes
         -- Обработка для grindableRecipes
         elseif recipeType == "grindableRecipes" then
         elseif recipeType == "grindableRecipes" then
             local input = translateID(frame, recipe.input) or "Нет входного элемента"
             local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
             local resultList = {}
             local resultList = {}


Строка 178: Строка 184:
         -- Обработка для heatableRecipes
         -- Обработка для heatableRecipes
         elseif recipeType == "heatableRecipes" then
         elseif recipeType == "heatableRecipes" then
             local input = translateID(frame, recipe.input) or "Нет входного элемента"
             local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
             local result = translateID(frame, recipe.result) or "Нет результата"
             local result = recipe.result and translateID(frame, recipe.result) or "Нет результата"
             local minTemp = recipe.minTemp or "Нет данных"
             local minTemp = recipe.minTemp or "Нет данных"


Строка 190: Строка 196:
         -- Обработка для toolmadeRecipes
         -- Обработка для toolmadeRecipes
         elseif recipeType == "toolmadeRecipes" then
         elseif recipeType == "toolmadeRecipes" then
             local input = translateID(frame, recipe.input) or "Нет входного элемента"
             local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
             local result = translateID(frame, recipe.result) or "Нет результата"
             local result = recipe.result and translateID(frame, recipe.result) or "Нет результата"
             local tool = translateID(frame, recipe.tool) or "Нет инструмента"
             local tool = recipe.tool and translateID(frame, recipe.tool) or "Нет инструмента"


             templateArgs = {
             templateArgs = {

Версия от 09:05, 9 марта 2025

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

local p = {}

-- Кэш для хранения данных о рецептах
local recipeCache = nil

-- Кэш для хранения данных о химических веществах
local chemCache = nil

-- Функция для логирования
local function log(message)
    mw.log("DEBUG: " .. message)
end

-- Функция для загрузки данных о рецептах из JSON-файла
local function loadRecipes()
    if recipeCache then
        return recipeCache
    end
    
    local success, data = pcall(function()
        return mw.text.jsonDecode(mw.title.new("User:CapybaraBot/mealrecipes_prototypes.json"):getContent())
    end)
    
    if success and type(data) == "table" then
        recipeCache = data
        return data
    else
        log("Ошибка при загрузке JSON (mealrecipes_prototypes.json): " .. tostring(data))
        return {}
    end
end

-- Функция для загрузки данных о химических веществах из JSON-файла
local function loadChemPrototypes()
    if chemCache then
        return chemCache
    end
    
    local success, data = pcall(function()
        return mw.text.jsonDecode(mw.title.new("User:CapybaraBot/chem_prototypes.json"):getContent())
    end)
    
    if success and type(data) == "table" then
        chemCache = data
        return data
    else
        log("Ошибка при загрузке JSON (chem_prototypes.json): " .. tostring(data))
        return {}
    end
end

-- Функция для перевода ID с использованием Module:Entity Lookup (для твердых веществ)
local function translateID(frame, id)
    local translatedName = frame:callParserFunction{ name = '#invoke', args = { 'Entity_Lookup', 'getname', id } }
    if translatedName then
        return string.format("%s [[Файл:%s.png|32px]]", translatedName, id)
    else
        return id  -- Если перевод не найден, возвращаем исходный ID
    end
end

-- Функция для перевода реагента (жидкого вещества) из chem_prototypes.json
local function translateReagent(reagentId)
    local chemData = loadChemPrototypes()
    if chemData[reagentId] and chemData[reagentId].name then
        return chemData[reagentId].name
    else
        return reagentId  -- Если перевод не найден, возвращаем исходный ID
    end
end

-- Функция для сортировки рецептов
local function sortRecipes(sortedRecipes, recipeType, frame)
    if recipeType == "grindableRecipes" then
        table.sort(sortedRecipes, function(a, b)
            local aName = translateID(frame, a.data.input or "")
            local bName = translateID(frame, b.data.input or "")
            return aName < bName
        end)
    else
        table.sort(sortedRecipes, function(a, b)
            local aName = translateID(frame, a.data.result or "")
            local bName = translateID(frame, b.data.result or "")
            return aName < bName
        end)
    end
end

-- Основная функция для генерации таблицы с рецептами
p.fillRecipeTable = function(frame)
    local args = frame.args
    local recipeType = args.recipeType or "microwaveRecipes"
    local templateName = args.template or "RecipeRow"

    local out = ""
    
    -- Загрузка данных о рецептах
    local recipes = loadRecipes()
    
    if not recipes or not recipes[recipeType] then
        return "Ошибка: данные о рецептах не загружены или тип рецептов не найден."
    end
    
    -- Создаем таблицу для сортировки
    local sortedRecipes = {}
    for recipeId, recipe in pairs(recipes[recipeType]) do
        table.insert(sortedRecipes, { id = recipeId, data = recipe })
    end

    -- Сортировка рецептов
    sortRecipes(sortedRecipes, recipeType, frame)

    -- Перебираем отсортированные рецепты
    local count = 0
    for _, recipeData in ipairs(sortedRecipes) do
        count = count + 1
        if count > 10 then  -- Ограничим количество рецептов для тестирования
            break
        end

        local recipe = recipeData.data
        local templateArgs = {}

        -- Обработка для microwaveRecipes
        if recipeType == "microwaveRecipes" then
            -- Переводим результат
            local result = translateID(frame, recipe.result) or "Нет результата"
            
            -- Формируем список ингредиентов (solids)
            local solidsList = {}
            if recipe.solids and type(recipe.solids) == "table" then
                for solidId, amount in pairs(recipe.solids) do
                    local ingredientName = translateID(frame, solidId)
                    table.insert(solidsList, string.format("%s (%d)", ingredientName, amount))
                end
            end
            
            -- Формируем список реагентов (reagents)
            local reagentsList = {}
            if recipe.reagents and type(recipe.reagents) == "table" then
                for reagentId, amount in pairs(recipe.reagents) do
                    local reagentName = translateReagent(reagentId)
                    table.insert(reagentsList, string.format("%s (%d)", reagentName, amount))
                end
            end
            
            -- Формируем аргументы для шаблона
            templateArgs = {
                result = result,
                solids = table.concat(solidsList, ", ") or "Нет ингредиентов",
                reagents = table.concat(reagentsList, ", ") or "Нет реагентов",
                time = recipe.time or "Нет данных"
            }

        -- Обработка для sliceableRecipes
        elseif recipeType == "sliceableRecipes" then
            local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
            local result = recipe.result and translateID(frame, recipe.result) or "Нет результата"
            local count = recipe.count or "Нет данных"

            templateArgs = {
                input = input,
                result = result,
                count = count
            }

        -- Обработка для grindableRecipes
        elseif recipeType == "grindableRecipes" then
            local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
            local resultList = {}

            if recipe.result and type(recipe.result) == "table" then
                for reagentId, amount in pairs(recipe.result) do
                    local reagentName = translateReagent(reagentId)
                    table.insert(resultList, string.format("%s (%d)", reagentName, amount))
                end
            end

            templateArgs = {
                input = input,
                result = table.concat(resultList, ", ") or "Нет результата"
            }

        -- Обработка для heatableRecipes
        elseif recipeType == "heatableRecipes" then
            local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
            local result = recipe.result and translateID(frame, recipe.result) or "Нет результата"
            local minTemp = recipe.minTemp or "Нет данных"

            templateArgs = {
                input = input,
                result = result,
                minTemp = minTemp
            }

        -- Обработка для toolmadeRecipes
        elseif recipeType == "toolmadeRecipes" then
            local input = recipe.input and translateID(frame, recipe.input) or "Нет входного элемента"
            local result = recipe.result and translateID(frame, recipe.result) or "Нет результата"
            local tool = recipe.tool and translateID(frame, recipe.tool) or "Нет инструмента"

            templateArgs = {
                input = input,
                result = result,
                tool = tool
            }
        end

        -- Добавляем якорь для строки таблицы
        out = out .. string.format('|- id="%s"\n', recipe.id)

        -- Генерация строки таблицы с использованием шаблона
        out = out .. frame:expandTemplate{ title = templateName, args = templateArgs } .. "\n"
    end
    
    return out
end

return p