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:CraftingParser: Difference between revisions

From Eco - English Wiki
[unchecked revision][unchecked revision]
No edit summary
No edit summary
Line 99: Line 99:
         elseif v.ingredients[2][1] ~= nil and v.ingredients[2][1] == item then
         elseif v.ingredients[2][1] ~= nil and v.ingredients[2][1] == item then
            table.insert( sepRecipes[2], recipes[i] )
            table.insert( sepRecipes[2], recipes[i] )
         elseif v.ingredients[3][1] ~= nil and v.ingredients[3][1] == item then
        
            table.insert( sepRecipes[2], recipes[i] )
        --TODO REWRITE this section to cycle through k, v properly - not hard check to prevent errors.
         elseif v.ingredients[4][1] ~= nil and v.ingredients[4][1] == item then
        --elseif v.ingredients[3][1] ~= nil and v.ingredients[3][1] == item then
            table.insert( sepRecipes[2], recipes[i] )
            --table.insert( sepRecipes[2], recipes[i] )
elseif v.ingredients[5][1] ~= nil and v.ingredients[5][1] == item then
         --elseif v.ingredients[4][1] ~= nil and v.ingredients[4][1] == item then
            table.insert( sepRecipes[2], recipes[i] )
            --table.insert( sepRecipes[2], recipes[i] )
         elseif v.ingredients[6][1] ~= nil and v.ingredients[6][1] == item then
--elseif v.ingredients[5][1] ~= nil and v.ingredients[5][1] == item then
            table.insert( sepRecipes[2], recipes[i] )
            --table.insert( sepRecipes[2], recipes[i] )
         elseif v.ingredients[7][1] ~= nil and v.ingredients[7][1] == item then
         --elseif v.ingredients[6][1] ~= nil and v.ingredients[6][1] == item then
            table.insert( sepRecipes[2], recipes[i] )
            --table.insert( sepRecipes[2], recipes[i] )
elseif v.ingredients[8][1] ~= nil and v.ingredients[8][1] == item then
         --elseif v.ingredients[7][1] ~= nil and v.ingredients[7][1] == item then
             table.insert( sepRecipes[2], recipes[i] )
            --table.insert( sepRecipes[2], recipes[i] )
--elseif v.ingredients[8][1] ~= nil and v.ingredients[8][1] == item then
             --table.insert( sepRecipes[2], recipes[i] )
             end
             end
         end
         end

Revision as of 16:54, 18 August 2020

This module contains functions for Module:GetRecipes. It uses the following Modules:


local p = {}

-- Grabs args from the parent frame
-- Trims and parses the args into a table, then returns the table
function norm( origArgs )
    origArgs = mw.getCurrentFrame():getParent().args
    local args = {}
    
    for k, v in pairs( origArgs ) do
        v = mw.text.trim( tostring( v ) )
        if v ~= '' then
            args[k] = v
        end
    end
    
    return args
end


-- Compares two recipes ( a < b ? true : false )
function recipeCompare(a, b)
    if not a.efficiencySkills[1] and not b.efficiencySkills[1] then return false
    elseif a.efficiencySkills[1] and not b.efficiencySkills[1] then return false
    elseif not a.efficiencySkills[1] and b.efficiencySkills[1] then return true
    elseif a.efficiencySkills[1] < b.efficiencySkills[1] then return true
    elseif a.efficiencySkills[1] > b.efficiencySkills[1] then return false
    
		elseif (a.skillNeeds[1] ~= nil and b.skillNeeds[1] ~= nil) then 
			if 	a.skillNeeds[1][1] < b.skillNeeds[1][1] then return true
			elseif a.skillNeeds[1][1] > b.skillNeeds[1][1] then return false
			elseif not a.skillNeeds[1][2] and b.skillNeeds[1][2] then return true
			elseif a.skillNeeds[1][2] and not b.skillNeeds[1][2] then return false
			elseif a.skillNeeds[1][2] and a.skillNeeds[1][2] < b.skillNeeds[1][2] then return true
			elseif a.skillNeeds[1][2] and a.skillNeeds[1][2] > b.skillNeeds[1][2] then return false
			end
			
    elseif a.products[1][1] < b.products[1][1] then return true
    elseif a.products[1][1] > b.products[1][1] then return false
    else return a.ingredients[1][1] <= b.ingredients[1][1]
    end
end


-- Parses arguments into a table of recipes
function frameParse( args )
    local parsedRecipes = {}

    -- Set variables
    local dispCraftStn = tonumber( args.displayCraftStation )
    local checkImage = tonumber( args.checkForImage )

    -- Iterate over every recipe passed in
    for i = 1, args.numRecipes do
        table.insert( parsedRecipes, i, {
            ['dispCraftStn'] = dispCraftStn,
            ['checkImage'] = checkImage,
            ['craftStn'] = {args['craftStation'..i], args['craftStationImg'..i]},
            ['item1'] = {args['item'..i..'.1'], args['itemImg'..i..'.1'], args['itemNum'..i..'.1']},
            ['item2'] = {args['item'..i..'.2'], args['itemImg'..i..'.2'], args['itemNum'..i..'.2']},
            ['skillNeed'] = {args['skillNeed'..i], args['skillNeedImg'..i], args['skillLvlNeed'..i]},
            ['mater1'] = {args['material'..i..'.1'], args['materialImg'..i..'.1'], args['materialNum'..i..'.1']},
            ['mater2'] = {args['material'..i..'.2'], args['materialImg'..i..'.2'], args['materialNum'..i..'.2']},
            ['mater3'] = {args['material'..i..'.3'], args['materialImg'..i..'.3'], args['materialNum'..i..'.3']},
            ['mater4'] = {args['material'..i..'.4'], args['materialImg'..i..'.4'], args['materialNum'..i..'.4']},
            ['cTime'] = args['craftTime'..i],
            ['affSkill1'] = {args['affectSkill'..i..'.1'], args['affectSkillImg'..i..'.1']},
            ['affSkill2'] = {args['affectSkill'..i..'.2'], args['affectSkillImg'..i..'.2']},
            --TODO - construct new parts of the table here
        })
    end

    return parsedRecipes
end


-- Formats and sorts recipes
function formatRecipes( recipes )
  -- Sort recipes
  table.sort( recipes, function( a, b ) return recipeCompare( a, b ) end )

  return recipes
end


-- Seperates a list of recipes into two tables
function seperate( recipes, item )
    local sepRecipes = { {}, {} }
    for i = 1, #recipes do
        --TODO Could use this algorithm to cycle variants. For now, focus on default variant only
        --v0.8 if recipes[i].products[1][1] == item then
        --v0.9 need to find product in recipes[i].variants object, using pairs
        for k, v in pairs(recipes[1].variants) do
        	if v.products[1][1] == item then
	            table.insert( sepRecipes[1], recipes[i] )
        	elseif v.products[2] ~= nil and v.products[2][1] == item then
	            table.insert( sepRecipes[1], recipes[i] )
        	elseif v.ingredients[1][2] == item then
	            table.insert( sepRecipes[2], recipes[i] )
        	elseif v.ingredients[2][1] ~= nil and v.ingredients[2][1] == item then
	            table.insert( sepRecipes[2], recipes[i] )
        	
        	--TODO REWRITE this section to cycle through k, v properly - not hard check to prevent errors.
        	--elseif v.ingredients[3][1] ~= nil and v.ingredients[3][1] == item then
	            --table.insert( sepRecipes[2], recipes[i] )
        	--elseif v.ingredients[4][1] ~= nil and v.ingredients[4][1] == item then
	            --table.insert( sepRecipes[2], recipes[i] )
			--elseif v.ingredients[5][1] ~= nil and v.ingredients[5][1] == item then
	            --table.insert( sepRecipes[2], recipes[i] )
        	--elseif v.ingredients[6][1] ~= nil and v.ingredients[6][1] == item then
	            --table.insert( sepRecipes[2], recipes[i] )
        	--elseif v.ingredients[7][1] ~= nil and v.ingredients[7][1] == item then
	            --table.insert( sepRecipes[2], recipes[i] )
			--elseif v.ingredients[8][1] ~= nil and v.ingredients[8][1] == item then
            	--table.insert( sepRecipes[2], recipes[i] )
            end
        end
    end
    return sepRecipes
end


-- Called from Template:RecipeTable
-- Calls Module:RecipeTable
-- Returns the wikitext returned by Module:RecipeTable
function p.raw( f )
    -- get args from the Template, parse them into recipes
    local recipes = frameParse( norm( f ) )

    -- Format the recipes
    recipes = formatRecipes( recipes )

    -- Call RecipeTable
    local recipeTable = require( "Module:TestRecipeTable" )
    return recipeTable.main( recipes )
end


-- Called from Module:GetRecipes
-- Calls Module:RecipTable
-- Returns the wikitext returned by Module:RecipeTable
function p.formattedItem( recipes, item )
    
    -- Seperate recipes into crafting recipes and used in recipes
    local sepRecipes = seperate( recipes, item )

    -- Format the recipes, and call RecipeTable on each table
    local recipeTable = require( "Module:TestRecipeTable" )
    local returnVal = '=== Crafting Recipes ===\n\n'
    
    if #sepRecipes[1] == 0 then
        returnVal = returnVal .. "''None''\n\n=== Used in Recipes ===\n\n "
    else
        returnVal = returnVal .. recipeTable.main( formatRecipes( sepRecipes[1] ) ) .. '\n\n=== Used in Recipes ===\n\n'
    end
    if #sepRecipes[2] == 0 then
        returnVal = returnVal .. "''None''\n"
    else
        returnVal = returnVal .. recipeTable.main( formatRecipes( sepRecipes[2] ) )
    end

    return returnVal
end


-- Called from Module:GetRecipes
-- Calls Module:RecipeTable
-- Returns formatted wikitext, including wikitext returned from Module:RecipeTable
function p.formattedTable( recipes, table )
    -- Format the recipes, and call RecipeTable
    local recipeTable = require( "Module:TestRecipeTable" )
    local returnVal = '=== Recipes at ' .. table .. ' ===\n\n'
    if #recipes == 0 then
        returnVal = returnVal .. "''None''\n"
    else
        returnVal = returnVal .. recipeTable.main( formatRecipes( recipes ) )
    end
    
    return returnVal
end


-- Called from Module:GetRecipes
-- Calls Module:RecipeTable
-- Returns formatted wikitext, including wikitext returned from Module:RecipeTable
function p.formattedGroup( recipes, group )
    -- Format the recipes, and call RecipeTable
    local recipeTable = require( "Module:TestRecipeTable" )
    local returnVal = '=== ' .. group .. ' Recipes ===\n\n'
    if #recipes == 0 then
        returnVal = returnVal .. "''None''\n"
    else
        returnVal = returnVal .. recipeTable.main( formatRecipes( recipes ) )
    end
    
    return returnVal
end

return p