ATTENTION! The process of updating WiKi to version Eco 10.x has begun. Those wishing to participate can find out more Information on our ECO Contribution Wiki Discord.
From April 26 to May 12, errors may occur in the Wiki, as we will be carrying out a major update to the information processing modules.

Module:RecipeTable: Difference between revisions

From Eco - English Wiki
[unchecked revision][checked revision]
No edit summary
No edit summary
 
(56 intermediate revisions by 2 users not shown)
Line 1: Line 1:
-- Module:GetRecipes (https://wiki.play.eco/en/Module:GetRecipes)
-- Module:RecipeTable https://wiki.play.eco/en/Module:RecipeTable
local p = {}
local p = {}


-- Grabs args from the parent frame
local Utils = require("Module:Utils")
-- Trims and parses the args into a table, then returns the table
local L = require("Module:Localization")
function norm()
 
     local origArgs = mw.getCurrentFrame():getParent().args
-- Header for the wikitable
    local args = {}
function header(args)
      
     local headerStr = '{| class=\"wikitable mw-collapsible\" style=\"text-align: center;\"\n|-\n'
     for k, v in pairs( origArgs ) do
 
         v = mw.text.trim( tostring( v ) )
     -- Show or hide the Crafting Station column
        if v ~= '' then
     if args[1] == '1' then
            args[k] = v
         headerStr = headerStr .. '! ' .. L.t('Crafting Station') .. ' !'
        end
     end
     end
      
     -- Item, Level Needed, Materials, Crafting Time, Labour Cost and XP Gained Specialty
     return args
    headerStr = headerStr .. '! colspan=\"4\" | ' .. L.t('Item') .. ' !! colspan=\"4\" | ' .. L.t('Materials') .. ' !! ' .. L.t('Level Needed') .. ' !! ' .. L.t('Crafting Time<br>(mins)') .. ' !! ' .. L.t('Labour Cost') .. ' || ' .. L.t('XP Gained') .. ' !!\n'
     return headerStr
end
end


-- Main entry point for the Module
function imagedisp(name, nameEN, style, borderColour)
function p.main()
     local borderImageClass = ''
     -- get args from the Template
     local icon
     local args = norm()
    if borderColour == 'green' then
      
        borderImageClass = ' borderGreen'
     -- assign variables for item, table, and group
     elseif borderColour == 'yellow' then
     local item = args.item
        borderImageClass = ' borderYellow'
     local table = args.table
     end
     local group = args.group
 
     local iconBG
    if style == 'tag' then
        iconBG = 'iconGrey'
        icon = L.tag(name) .. 'Tag'
        name = L.t('%s Tag'):format(name)
     elseif style == 'skill' then
        iconBG = 'iconBrightBlue'
        icon = nameEN
    end
 
     if not icon then
        icon = name
    end


     -- load list of recipes
     return Utils.build_icon(icon, name, 'iconRecipe', iconBG, borderImageClass, true) .. '\n[[' .. name .. ']]'
    local completeList = require( "Module:CraftingRecipes" )
end
    local recipeList = completeList.recipes
    local ingredientsList = completeList.ingredients
local productsList = completeList.products
    local tableList = completeList.tables
   
    -- initialize a table to store recipes
    local recipes = {}
local products = {}
local ingredients = {}
   
    -- load CraftingParser
    local parser = require( "Module:CraftingParser" )
    -- priority: item > table > group
    if item ~= nil then
if productsList[item] ~= nil then
for num = 1, #productsList do
if (productsList[item][num] ~= '' and recipeList[productsList[item][num]] ~= nil) then
products[num] = recipeList[productsList[item][num]]
end
end
end
if ingredientsList[item] ~= nil then
for num = 1, #ingredientsList do
if (ingredientsList[item][num] ~= '' and recipeList[ingredientsList[item][num]] ~= nil) then
ingredients[num] = recipeList[ingredientsList[item][num]]
end
end
end
       
      return parser.formattedItem( products, ingredients, item )
       
    --elseif table ~= nil then
        --for num = 1, #tableList[table] do
            --recipes[num] = recipeList[tableList[table][num]]
        --end


        --return parser.formattedTable( recipes, table )
function stationcell(args)
    local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[2])
    return str
end


function itemcell(args)
    local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[3])
    str = str .. '<br>x' .. args[2] .. '\n'
    return str
end
function ingredientcell(args)
    local str = ''
    local borderColour
    if args[4] == 'False' then
        borderColour = 'green'
    elseif args[4] == 'True' then
        borderColour = 'yellow'
    end
    if args[1] == 'TAG' then
        style = 'tag'
     else
     else
         return 'Invalid use of parameters, please see [[Template:GetRecipes]].'
         style = nil
     end
     end
    return str .. '| ' .. imagedisp(args[2], args[5], style, borderColour) .. '<br>x' .. args[3] .. '\n'
end
function skillreqcell(args)
    local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[3], 'skill')
    str = str .. '<br> ' .. L.t('Level') .. ' ' .. args[2] .. ' \n'
    return str
end
-- Does this even exist anymore?
--function groupedskillcell( args )
--    local str = ''
-- str = str .. '| ' .. imagedisp(args[1],args[3])
-- if args[2] ~= nil then
-- str = str .. ' <br> ' .. imagedisp(args[2])
-- end
-- return str
--end
-- Create a wikitable of recipes
function p.main(recipes)
    local rows = ''
    -- Get each row
    for i = 1, #recipes do
        -- get information from the current recipe for building
        local checkImage = recipes[i].checkImage
        local craftStn = recipes[i].craftStn
        local skillNeeds = recipes[i].skillNeeds
        --use last variant as this is always the default variant
        local numberOfVariants = recipes[i].numberOfVariants
        local products = {}
        local ingredients = {}
        --loop through variants to select default variant ingredients
if numberOfVariants == 1 then
            ingredients = recipes[i].variants[1].ingredients
            products = recipes[i].variants[1].products
        else
        --loop through variants to select default variant ingredients
            for k, v in pairs(recipes[i].variants) do       
                --given pairs doesn't guarantee order, check that product matches default variant
                if k == recipes[i].defaultVariant then
                    ingredients = v.ingredients
                    products = v.products
                end
            end
        end
        local baseCraftTime = recipes[i].baseCraftTime
        local baseLaborCost = recipes[i].baseLaborCost
        local baseXPGain = recipes[i].baseXPGain
        -- determine the size needed for products to display correctly
        local ingrednum = #ingredients
        local rowspan = '|'
        local rowspanProducts = '|'
        --Code to incorporate rowspan for ingrediants and variants here
        local rowspanCount = 0
        --accomodate both variants and multiple ingredients
        if ingrednum > 4 then
            rowspanCount = rowspanCount + 2
        end
        --suspect there will be a bug here for many variants & many ingredients - might need x2 multipler per variant.
        if (#recipes == 1) then
            --only add variant rowspans if there is one recipe (i.e. variants will be displayed)
            if tonumber(recipes[i].numberOfVariants) > 1 then
                rowspanCount = rowspanCount + tonumber(recipes[i].numberOfVariants)
                rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
            end
        end
        if rowspanCount > 0 then
            rowspan = '| rowspan=\"' .. rowspanCount .. '\" '
            if (#recipes > 1) then
                rowspanProducts = '| rowspan=\"' .. rowspanCount .. '\" '
            else
                rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
            end
        end
        -- String to return
        local row = '|-\n'
        -- Add new row if products or ingredients are passed in with at least 1 item
        if (products[1] and ingredients[1]) then
            local station = craftStn[1]
            -- Show or hide the Crafting Station column
            if recipes[i].dispCraftStn == '1' then
                row = row .. rowspan .. stationcell({ station[1], station[2] }) .. '\n'
            end
            -- Add the products columns
            local prodnum = #products
            for a = 1, prodnum do
                if prodnum == 1 then
                    row = row .. rowspanProducts .. ' colspan=\"4\" '
                end
                if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
                    row = row .. rowspanProducts .. ' colspan=\"2\" '
                end
                row = row .. itemcell({ products[a][1], products[a][2], products[a][3] })
                if (tonumber(numberOfVariants) > 1) then
                    row = row .. '<i>' .. L.t('Has Variants') .. '</i> \n'
                end
            end
            -- Add the FIRST row of Ingredients column
            local numing = ingrednum
            if ingrednum > 4 then
                numing = 4
            end
            for b = 1, numing do
                if (ingrednum == 1) then
                    row = row .. '| colspan=\"4\" '
                end
                if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
                    row = row .. '| colspan=\"2\" '
                end
                row = row .. ingredientcell(ingredients[b])
            end
            -- Add the Skill needed column
            if (skillNeeds[1] ~= '' and skillNeeds[1] ~= nil) then
                row = row .. rowspan .. skillreqcell({ skillNeeds[1][1], skillNeeds[1][2], skillNeeds[1][3] })
            else
                row = row .. rowspan
                if ingrednum > 4 then
                    row = row .. '|'
                end
                row = row .. ' \'\'' .. L.t('None') .. '\'\' \n'
            end
            -- Add the Crafting time column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseCraftTime then
                row = row .. baseCraftTime .. '\n'
            else
                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end
            -- Add the Labour time column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseLaborCost then
                row = row .. baseLaborCost .. '\n'
            else
                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end
            -- Add the XP gain column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseXPGain then
                row = row .. baseXPGain .. '\n'
            else
                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end
            -- Add the SECOND row of ingredients to ingredients column if applicable
            if ingrednum > 4 then
                row = row .. '|-\n'
                for b = 5, ingrednum do
                    if (ingrednum == 5) then
                        row = row .. '| colspan=\"4\" '
                    end
                    if ((ingrednum == 6) or (ingrednum == 7 and b == 6)) then
                        row = row .. '| colspan=\"2\" '
                    end
                    row = row .. ingredientcell(ingredients[b])
                end
            end
            rows = rows .. row
           
        end
        --Show variants in table if only 1 recipe in list
        if (#recipes == 1 and tonumber(recipes[i].numberOfVariants) > 1) then
            for k, v in pairs(recipes[i].variants) do
                --start new row for variants
                row = '|-\n'
                --Skip default variant
                if v.products[1][1] ~= recipes[i].defaultVariant then
                    local prodnum = #products
                    for a = 1, prodnum do
                        if prodnum == 1 then
                            row = row .. rowspanProducts .. ' colspan=\"4\" '
                        end
                        if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
                            row = row .. rowspanProducts .. ' colspan=\"2\" '
                        end
                        row = row .. itemcell({ v.products[a][1], v.products[a][2], v.products[a][3] })
                    end
                    --will need to cycle ingrediants to fill out complete table
                    --row = row .. itemcell({v.products[1][1], v.products[1][2]})
                    local numing = ingrednum
                    if ingrednum > 4 then
                        numing = 4
                    end
                    for b = 1, numing do
                        if (ingrednum == 1) then
                            row = row .. '| colspan=\"4\" '
                        end
                        if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
                            row = row .. '| colspan=\"2\" '
                        end
                        row = row .. ingredientcell(v.ingredients[b])
                    end
                end
                rows = rows .. row
            end
        end
    end
    -- Return the full wikitable
    return header({ recipes[1].dispCraftStn }) .. rows .. '|-\n|}\n'
end
function p.testrender()
  local crafting_recipes = require("Module:GetRecipes")
  return crafting_recipes.renderTable('Campfire', nil, nil, nil)
end
end


return p
return p

Latest revision as of 15:45, 1 January 2024

Documentation[edit source]

This module is a part of the Template:GetRecipes, and is used to generate a wikitable of recipes. It returns a wikitable as a string. The wikitable contains all of the recipes that were passed into the module.

If the template is passed, this module is used with the following Modules:


-- Module:RecipeTable https://wiki.play.eco/en/Module:RecipeTable
local p = {}

local Utils = require("Module:Utils")
local L = require("Module:Localization")

-- Header for the wikitable
function header(args)
    local headerStr = '{| class=\"wikitable mw-collapsible\" style=\"text-align: center;\"\n|-\n'

    -- Show or hide the Crafting Station column
    if args[1] == '1' then
        headerStr = headerStr .. '! ' .. L.t('Crafting Station') .. ' !'
    end
    -- Item, Level Needed, Materials, Crafting Time, Labour Cost and XP Gained Specialty
    headerStr = headerStr .. '! colspan=\"4\" | ' .. L.t('Item') .. ' !! colspan=\"4\" | ' .. L.t('Materials') .. ' !! ' .. L.t('Level Needed') .. ' !! ' .. L.t('Crafting Time<br>(mins)') .. ' !! ' .. L.t('Labour Cost') .. ' || ' .. L.t('XP Gained') .. ' !!\n'
    return headerStr
end

function imagedisp(name, nameEN, style, borderColour)
    local borderImageClass = ''
    local icon
    if borderColour == 'green' then
        borderImageClass = ' borderGreen'
    elseif borderColour == 'yellow' then
        borderImageClass = ' borderYellow'
    end

    local iconBG
    if style == 'tag' then
        iconBG = 'iconGrey'
        icon = L.tag(name) .. 'Tag'
        name = L.t('%s Tag'):format(name)
    elseif style == 'skill' then
        iconBG = 'iconBrightBlue'
        icon = nameEN
    end

    if not icon then
        icon = name
    end

    return Utils.build_icon(icon, name, 'iconRecipe', iconBG, borderImageClass, true) .. '\n[[' .. name .. ']]'
end

function stationcell(args)
    local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[2])
    return str
end

function itemcell(args)
    local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[3])
    str = str .. '<br>x' .. args[2] .. '\n'
    return str
end

function ingredientcell(args)
    local str = ''
    local borderColour
    if args[4] == 'False' then
        borderColour = 'green'
    elseif args[4] == 'True' then
        borderColour = 'yellow'
    end
    if args[1] == 'TAG' then
        style = 'tag'
    else
        style = nil
    end
    return str .. '| ' .. imagedisp(args[2], args[5], style, borderColour) .. '<br>x' .. args[3] .. '\n'
end

function skillreqcell(args)
    local str = ''
    str = str .. '| ' .. imagedisp(args[1], args[3], 'skill')
    str = str .. '<br> ' .. L.t('Level') .. ' ' .. args[2] .. ' \n'
    return str
end


-- Does this even exist anymore?
--function groupedskillcell( args )
--    local str = ''
--	str = str .. '| ' .. imagedisp(args[1],args[3])
--	if args[2] ~= nil then
--		str = str .. ' <br> ' .. imagedisp(args[2])
--	end
--	return str
--end

-- Create a wikitable of recipes
function p.main(recipes)
    local rows = ''
    -- Get each row
    for i = 1, #recipes do
        -- get information from the current recipe for building
        local checkImage = recipes[i].checkImage
        local craftStn = recipes[i].craftStn
        local skillNeeds = recipes[i].skillNeeds
        --use last variant as this is always the default variant
        local numberOfVariants = recipes[i].numberOfVariants
        local products = {}
        local ingredients = {}

        --loop through variants to select default variant ingredients
		if numberOfVariants == 1 then
            ingredients = recipes[i].variants[1].ingredients
            products = recipes[i].variants[1].products
        else
        --loop through variants to select default variant ingredients
            for k, v in pairs(recipes[i].variants) do        
                --given pairs doesn't guarantee order, check that product matches default variant
                if k == recipes[i].defaultVariant then
                    ingredients = v.ingredients
                    products = v.products
                end
            end
        end
        local baseCraftTime = recipes[i].baseCraftTime
        local baseLaborCost = recipes[i].baseLaborCost
        local baseXPGain = recipes[i].baseXPGain

        -- determine the size needed for products to display correctly
        local ingrednum = #ingredients
        local rowspan = '|'
        local rowspanProducts = '|'

        --Code to incorporate rowspan for ingrediants and variants here
        local rowspanCount = 0

        --accomodate both variants and multiple ingredients

        if ingrednum > 4 then
            rowspanCount = rowspanCount + 2
        end
        --suspect there will be a bug here for many variants & many ingredients - might need x2 multipler per variant.
        if (#recipes == 1) then
            --only add variant rowspans if there is one recipe (i.e. variants will be displayed)
            if tonumber(recipes[i].numberOfVariants) > 1 then
                rowspanCount = rowspanCount + tonumber(recipes[i].numberOfVariants)
                rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
            end
        end
        if rowspanCount > 0 then
            rowspan = '| rowspan=\"' .. rowspanCount .. '\" '
            if (#recipes > 1) then
                rowspanProducts = '| rowspan=\"' .. rowspanCount .. '\" '
            else
                rowspanProducts = '| rowspan=\"' .. rowspanCount - recipes[i].numberOfVariants - 1 .. '\" '
            end
        end

        -- String to return
        local row = '|-\n'

        -- Add new row if products or ingredients are passed in with at least 1 item
        if (products[1] and ingredients[1]) then

            local station = craftStn[1]

            -- Show or hide the Crafting Station column
            if recipes[i].dispCraftStn == '1' then
                row = row .. rowspan .. stationcell({ station[1], station[2] }) .. '\n'
            end

            -- Add the products columns
            local prodnum = #products
            for a = 1, prodnum do
                if prodnum == 1 then
                    row = row .. rowspanProducts .. ' colspan=\"4\" '
                end
                if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
                    row = row .. rowspanProducts .. ' colspan=\"2\" '
                end
                row = row .. itemcell({ products[a][1], products[a][2], products[a][3] })
                if (tonumber(numberOfVariants) > 1) then
                    row = row .. '<i>' .. L.t('Has Variants') .. '</i> \n'
                end
            end

            -- Add the FIRST row of Ingredients column
            local numing = ingrednum
            if ingrednum > 4 then
                numing = 4
            end
            for b = 1, numing do
                if (ingrednum == 1) then
                    row = row .. '| colspan=\"4\" '
                end
                if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
                    row = row .. '| colspan=\"2\" '
                end
                row = row .. ingredientcell(ingredients[b])
            end

            -- Add the Skill needed column
            if (skillNeeds[1] ~= '' and skillNeeds[1] ~= nil) then
                row = row .. rowspan .. skillreqcell({ skillNeeds[1][1], skillNeeds[1][2], skillNeeds[1][3] })
            else
                row = row .. rowspan
                if ingrednum > 4 then
                    row = row .. '|'
                end
                row = row .. ' \'\'' .. L.t('None') .. '\'\' \n'
            end

            -- Add the Crafting time column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseCraftTime then
                row = row .. baseCraftTime .. '\n'
            else

                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end

            -- Add the Labour time column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseLaborCost then
                row = row .. baseLaborCost .. '\n'
            else

                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end

            -- Add the XP gain column
            row = row .. rowspan
            if rowspanCount > 1 then
                row = row .. '|'
            end
            if baseXPGain then
                row = row .. baseXPGain .. '\n'
            else

                row = row .. rowspan .. ' \'\'' .. L.t('Missing') .. '\'\' \n'
            end

            -- Add the SECOND row of ingredients to ingredients column if applicable
            if ingrednum > 4 then
                row = row .. '|-\n'
                for b = 5, ingrednum do
                    if (ingrednum == 5) then
                        row = row .. '| colspan=\"4\" '
                    end
                    if ((ingrednum == 6) or (ingrednum == 7 and b == 6)) then
                        row = row .. '| colspan=\"2\" '
                    end
                    row = row .. ingredientcell(ingredients[b])
                end
            end

            rows = rows .. row
            
        end

        --Show variants in table if only 1 recipe in list
        if (#recipes == 1 and tonumber(recipes[i].numberOfVariants) > 1) then
            for k, v in pairs(recipes[i].variants) do
                --start new row for variants
                row = '|-\n'
                --Skip default variant
                if v.products[1][1] ~= recipes[i].defaultVariant then
                    local prodnum = #products
                    for a = 1, prodnum do
                        if prodnum == 1 then
                            row = row .. rowspanProducts .. ' colspan=\"4\" '
                        end
                        if ((prodnum == 2) or (prodnum == 3 and a == 2)) then
                            row = row .. rowspanProducts .. ' colspan=\"2\" '
                        end
                        row = row .. itemcell({ v.products[a][1], v.products[a][2], v.products[a][3] })
                    end

                    --will need to cycle ingrediants to fill out complete table
                    --row = row .. itemcell({v.products[1][1], v.products[1][2]})
                    local numing = ingrednum
                    if ingrednum > 4 then
                        numing = 4
                    end
                    for b = 1, numing do
                        if (ingrednum == 1) then
                            row = row .. '| colspan=\"4\" '
                        end
                        if ((ingrednum == 2) or (ingrednum == 3 and b == 2)) then
                            row = row .. '| colspan=\"2\" '
                        end
                        row = row .. ingredientcell(v.ingredients[b])
                    end


                end
                rows = rows .. row
            end
        end
    end

    -- Return the full wikitable
    return header({ recipes[1].dispCraftStn }) .. rows .. '|-\n|}\n'
end

function p.testrender()
  local crafting_recipes = require("Module:GetRecipes")
  return crafting_recipes.renderTable('Campfire', nil, nil, nil)
end

return p