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][checked revision]
No edit summary
No edit summary
 
(37 intermediate revisions by 3 users not shown)
Line 1: Line 1:
-- Module:CraftingParser (https://wiki.play.eco/en/Module:CraftingParser)
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( 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 )
-- Compares two recipes ( a < b ? true : false )
function recipeCompare(a, b)
function recipeCompare(a, b)
   
 
     --not in v0.9
     --not in v0.9
     --if not a.efficiencySkills[1] and not b.efficiencySkills[1] then return false
     --if not a.efficiencySkills[1] and not b.efficiencySkills[1] then return false
Line 28: Line 15:
     --elseif a.efficiencySkills[1] > b.efficiencySkills[1] then return false
     --elseif a.efficiencySkills[1] > b.efficiencySkills[1] then return false
      
      
if (a.skillNeeds[1] ~= nil and b.skillNeeds[1] ~= nil) then  
    if (a.skillNeeds[1] ~= nil and b.skillNeeds[1] ~= nil) then  
if a.skillNeeds[1][1] < b.skillNeeds[1][1] then return true
        if a.skillNeeds[1][1] < b.skillNeeds[1][1] then  
elseif a.skillNeeds[1][1] > b.skillNeeds[1][1] then return false
            return true
elseif not a.skillNeeds[1][2] and b.skillNeeds[1][2] then return true
        elseif a.skillNeeds[1][1] > b.skillNeeds[1][1] then  
elseif a.skillNeeds[1][2] and not b.skillNeeds[1][2] then return false
            return false
elseif a.skillNeeds[1][2] and a.skillNeeds[1][2] < b.skillNeeds[1][2] then return true
        elseif not a.skillNeeds[1][2] and b.skillNeeds[1][2] then
elseif a.skillNeeds[1][2] and a.skillNeeds[1][2] > b.skillNeeds[1][2] then return false
            return true
end
        elseif a.skillNeeds[1][2] and not b.skillNeeds[1][2] then
            return false
     elseif a.defaultVariant[1] < b.defaultVariant[1] then return true
        elseif a.skillNeeds[1][2] and a.skillNeeds[1][2] < b.skillNeeds[1][2] then
     elseif a.defaultVariant[1] > b.defaultVariant[1] then return false
            return true
     else return a.defaultVariant[1] <= b.defaultVariant[1]
        elseif a.skillNeeds[1][2] and a.skillNeeds[1][2] > b.skillNeeds[1][2] then
            return false
        end
     elseif a.defaultVariant < b.defaultVariant then
        return true
     elseif a.defaultVariant > b.defaultVariant then
        return false
     -- else
    --    return a.defaultVariant <= b.defaultVariant
     end
     end
end
end
Line 79: Line 74:
function formatRecipes( recipes )
function formatRecipes( recipes )
   -- Sort recipes
   -- Sort recipes
   table.sort( recipes, function( a, b ) return recipeCompare( a, b ) end )
   table.sort( recipes, recipeCompare )


   return recipes
   return recipes
end
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[i].variants) do
        if v.products[1][1] == item then
            table.insert( sepRecipes[1], recipes[i] )
        elseif v.products[2] ~= nil and v.products[2][2] == 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][2] == 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
-- Called from Template:RecipeTable
Line 127: Line 84:
function p.raw( f )
function p.raw( f )
     -- get args from the Template, parse them into recipes
     -- get args from the Template, parse them into recipes
     local recipes = frameParse( norm( f ) )
     local recipes = frameParse( Utils.normaliseArgs(f) )


     -- Format the recipes
     -- Format the recipes
Line 133: Line 90:


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


-- Called from Module:GetRecipes
-- Called from Module:GetRecipes
-- Calls Module:RecipTable
-- Calls Module:RecipeTable
-- Returns the wikitext returned by Module:RecipeTable
-- Returns the wikitext returned by Module:RecipeTable
function p.formattedItem( recipes, item )
function p.formattedItem( products, ingredients, item )
   
    -- Seperate recipes into crafting recipes and used in recipes
    local sepRecipes = seperate( recipes, item )
 
     -- Format the recipes, and call RecipeTable on each table
     -- Format the recipes, and call RecipeTable on each table
     local recipeTable = require( "Module:TestRecipeTable" )
     local recipeTable = require( "Module:RecipeTable" )
     local returnVal = '=== Crafting Recipes ===\n\n'
     local returnVal = '=== '..L.t('Crafting Recipes')..' ===\n\n'
      
      
     if #sepRecipes[1] == 0 then
     if (products ~= nil and #products ~= 0) then
         returnVal = returnVal .. "''None''\n\n=== Used in Recipes ===\n\n "
         returnVal = returnVal .. recipeTable.main( formatRecipes(products) ) .. '\n\n=== '..L.t('Used in Recipes')..' ===\n\n'       
     else
     else
         returnVal = returnVal .. recipeTable.main( formatRecipes( sepRecipes[1] ) ) .. '\n\n=== Used in Recipes ===\n\n'
         returnVal = returnVal .. "''"..L.t('None').."''\n\n=== "..L.t('Used in Recipes').." ===\n\n "
     end
     end
     if #sepRecipes[2] == 0 then
   
         returnVal = returnVal .. "''None''\n"
     if (ingredients ~= nil and #ingredients ~= 0) then
         returnVal = returnVal .. recipeTable.main( formatRecipes(ingredients) )
     else
     else
         returnVal = returnVal .. recipeTable.main( formatRecipes( sepRecipes[2] ) )
         returnVal = returnVal .. "''"..L.t('None').."''\n"     
     end
     end


Line 170: Line 124:
function p.formattedTable( recipes, table )
function p.formattedTable( recipes, table )
     -- Format the recipes, and call RecipeTable
     -- Format the recipes, and call RecipeTable
     local recipeTable = require( "Module:TestRecipeTable" )
     local recipeTable = require( "Module:RecipeTable" )
     local returnVal = '=== Recipes at ' .. table .. ' ===\n\n'
     local returnVal = '=== ' .. L.t('Recipes at %s'):format(table) .. ' ===\n\n'
     if #recipes == 0 then
     if #recipes == 0 then
         returnVal = returnVal .. "''None''\n"
         returnVal = returnVal .. "''"..L.t('None').."''\n"
     else
     else
         returnVal = returnVal .. recipeTable.main( formatRecipes( recipes ) )
         returnVal = returnVal .. recipeTable.main( formatRecipes( recipes ) )
Line 187: Line 141:
function p.formattedGroup( recipes, group )
function p.formattedGroup( recipes, group )
     -- Format the recipes, and call RecipeTable
     -- Format the recipes, and call RecipeTable
     local recipeTable = require( "Module:TestRecipeTable" )
     local recipeTable = require( "Module:RecipeTable" )
     local returnVal = '=== ' .. group .. ' Recipes ===\n\n'
     local returnVal = '=== ' .. L.t('%s Recipes'):format(group) .. ' ===\n\n'
     if #recipes == 0 then
     if #recipes == 0 then
         returnVal = returnVal .. "''None''\n"
         returnVal = returnVal .. "''"..L.t('None').."''\n"
     else
     else
         returnVal = returnVal .. recipeTable.main( formatRecipes( recipes ) )
         returnVal = returnVal .. recipeTable.main( formatRecipes( recipes ) )

Latest revision as of 01:21, 8 March 2021

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


-- Module:CraftingParser (https://wiki.play.eco/en/Module:CraftingParser)
local p = {}

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

-- Compares two recipes ( a < b ? true : false )
function recipeCompare(a, b)

    --not in v0.9
    --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
    
    if (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.defaultVariant < b.defaultVariant then
        return true
    elseif a.defaultVariant > b.defaultVariant then
        return false
    -- else
    --     return a.defaultVariant <= b.defaultVariant
    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, recipeCompare )

  return recipes
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( Utils.normaliseArgs(f) )

    -- Format the recipes
    recipes = formatRecipes( recipes )

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


-- Called from Module:GetRecipes
-- Calls Module:RecipeTable
-- Returns the wikitext returned by Module:RecipeTable
function p.formattedItem( products, ingredients, item )
    -- Format the recipes, and call RecipeTable on each table
    local recipeTable = require( "Module:RecipeTable" )
    local returnVal = '=== '..L.t('Crafting Recipes')..' ===\n\n'
    
    if (products ~= nil and #products ~= 0) then
        returnVal = returnVal .. recipeTable.main( formatRecipes(products) ) .. '\n\n=== '..L.t('Used in Recipes')..' ===\n\n'        
    else
        returnVal = returnVal .. "''"..L.t('None').."''\n\n=== "..L.t('Used in Recipes').." ===\n\n "
    end
    
    if (ingredients ~= nil and #ingredients ~= 0) then
        returnVal = returnVal .. recipeTable.main( formatRecipes(ingredients) )
    else
        returnVal = returnVal .. "''"..L.t('None').."''\n"       
    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:RecipeTable" )
    local returnVal = '=== ' .. L.t('Recipes at %s'):format(table) .. ' ===\n\n'
    if #recipes == 0 then
        returnVal = returnVal .. "''"..L.t('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:RecipeTable" )
    local returnVal = '=== ' .. L.t('%s Recipes'):format(group) .. ' ===\n\n'
    if #recipes == 0 then
        returnVal = returnVal .. "''"..L.t('None').."''\n"
    else
        returnVal = returnVal .. recipeTable.main( formatRecipes( recipes ) )
    end
    
    return returnVal
end

return p