Module:RecipeDetails: Difference between revisions

From IdleOn MMO Wiki
mNo edit summary
Tag: Manual revert
mNo edit summary
Line 13: Line 13:


local function fuseBaseIngredients(oldTable, newTable)
local function fuseBaseIngredients(oldTable, newTable)
local newItem
mw.log("Entered fuseBaseIngredients function")
-- mw.logObject(newTable, "Checking newTable ")
-- mw.logObject(oldTable, "Checking oldTable ")
for n=1, #newTable do -- For each item in the new table
for n=1, #newTable do -- For each item in the new table
newItem = true   -- Initialize newItem boolean
mw.logObject(newTable[n], "Checking ".. newTable[n].Item .. '= ' )
local newItem = true   -- Initialize newItem boolean
for o=1, #oldTable do  -- Check each item in the old table
for o=1, #oldTable do  -- Check each item in the old table
if oldTable[o].Item == newTable[n].Item then  -- If the there is a match
if oldTable[o].Item == newTable[n].Item then  -- If the there is a match
-- Add value, set boolean to false, and break loop.
-- Add value, set boolean to false, and break loop.
oldTable[o].Amount = oldTable[o].Amount + newTable[n].Amount  
oldTable[o].Amount = oldTable[o].Amount + newTable[n].Amount  
mw.log(newTable[n].Item .. " was matched.")
newItem = false
newItem = false
break
break
end
end
end
end
if newItem == true then oldTable[#oldTable+1] = newTable[n].Amount end -- If it is a new item then add new item.
mw.logObject(newTable[n], "Checking " .. newTable[n].Item )
if newItem == true then  
oldTable[#oldTable+1] = newTable[n]
mw.log(newTable[n].Item .. " is new.")
end -- If it is a new item then add new item.
end
end
return oldTable
return oldTable
Line 33: Line 41:
         return a[key] < b[key]
         return a[key] < b[key]
     end
     end
end
-- Query smithing table for the recipe and retrieve the ingeredients
local function getRecipeItems( item, multi )
local multiplier = multi or 1
local ingredients = {}
-- Query
    local args = {
        where = 'AnvilCraft.Item="'.. item ..'"',
        orderBy = 'AnvilCraft.Item'
    }
    local results = cargo.query('AnvilCraft', 'Resource1, Quantity1, Resource2, Quantity2, Resource3, Quantity3, Resource4, Quantity4', args )
    if #results == 0 then return {} end -- if no results, exit with an empty table.
   
    local tuple = {}
    for n=1, 4 do
    if results[1]['Resource'..n] == nil or results[1]['Resource'..n] == '' then break end -- If an empty cell is encountered, stop processing items.
    local tuple = { item = results[1]['Resource'..n], amount = tonumber(results[1]['Quantity'..n]) * multiplier}
ingredients[n] = tuple
    end
-- Return table of items and values.
    return ingredients
end
end


Line 39: Line 70:
local indent = i or 1 -- Used to set padding later.
local indent = i or 1 -- Used to set padding later.
local fullTableStruct = { --[[ inserted as (padding, item, amount) ]] }
local fullTableStruct = { --[[ inserted as (padding, item, amount) ]] }
local tuple = {}
local baseIngredients = { --[[ insereted as (item, amount) ]] }
local reciItems = {}
local baseIngredients = { --[[ insereted as (name, amount) ]] }
for n = 1, #items do  
for n = 1, #items do
tuple = {Padding = indent, Item = items[n].item, Amount = items[n].amount}
local tuple = {Padding = indent, Item = items[n].item, Amount = items[n].amount}
-- Insert item into fullTableStruct.
-- Insert item into fullTableStruct.
fullTableStruct[#fullTableStruct+1] = tuple
fullTableStruct[#fullTableStruct+1] = tuple
-- Query smithing table for the recipe and retrieve the ingeredients
-- Query smithing table for the recipe and retrieve the ingeredients
reciItems = getRecipeItems(items[n].item, items[n].amount) or {}
local reciItems = getRecipeItems(items[n].item, items[n].amount)
-- If previous line's result is not nil then recursively call this function and increment i.
-- If previous line's result is not empty then recursively call this function and increment i.
if #reciItems == 0 then
if #reciItems == 0 then
-- If item has value in baseingredients then increase, otherwise set to the value.
-- If item has value in baseingredients then increase, otherwise set to the value.
baseIngredients = fuseBaseIngredients(baseIngredients, {Item = items[n].item, Amount = items[n].amount})
local baseItem = {Item = items[n].item, Amount = items[n].amount}
baseIngredients = fuseBaseIngredients(baseIngredients, baseItem)
else
else
-- If reciItems is not nil then recursively call this function and increment i.
-- If reciItems is not nil then recursively call this function and increment i.
local retTable = RecipeBreakdownRecursive(reciItems, indent + 1)
local retTable = RecipeBreakdownRecursive(reciItems, indent + 1)
fullTableStruct = appendTable(fullTableStruct, retTable[1])
fullTableStruct = appendTable(fullTableStruct, retTable.recipe)
baseIngredients = fuseBaseIngredients(baseIngredients, retTable[2])
baseIngredients = fuseBaseIngredients(baseIngredients, retTable.ingredients)
end
end
end
end
Line 93: Line 123:
return table.concat(result, "")
return table.concat(result, "")
end
-- Query smithing table for the recipe and retrieve the ingeredients
local function getRecipeItems( item, multi )
local multiplier = multi or 1
local ingredients = {}
-- Query
    local args = {
        where = 'AnvilCraft.Item="'.. item ..'"',
        orderBy = 'AnvilCraft.Item'
    }
    local results = cargo.query('AnvilCraft', 'Resource1, Quantity1, Resource2, Quantity2, Resource3, Quantity3, Resource4, Quantity4', args )
    if #results == 0 then return 0 end -- if no results, exit with 0
   
    local tuple = {}
    for n=1, 4 do
    if results['Resource'..n] == nil or results['Resource'..n] == '' then break end -- If an empty cell is encountered, stop processing items.
    tuple.item = results['Resource'..n]
    tuple.amount = tonumber(results['Quantity'..n]) * multiplier
ingredients[n] = tuple
    end
-- Return table of items and values.
    return ingredients
end
end


Line 132: Line 138:
-- Store it in the Cargo Table: item, breakdown, totals.
-- Store it in the Cargo Table: item, breakdown, totals.
frame:expandTemplate{ title = 'DetailedRecipes', args = { Item = item, Breakdown = breakdown, Totals = totals } }
frame:expandTemplate{ title = 'DetailedRecipes', args = { Item = item, Breakdown = breakdown, Totals = totals } }
return string.format([[breakdown = %s
-- test output
totals = %s
-- mw.logObject(items, "items")
items = %s
-- mw.logObject(item, "item")
doubleTable = %s
-- mw.logObject(doubleTable, "doubleTable")
fullTableStruct = %s
-- mw.logObject(fullTableStruct, "fullTableStruct")
baseIngredients = %s]], breakdown, totals, tostring(items), tostring(doubleTable), tostring(fullTableStruct), tostring(baseIngredinets)) -- test output
mw.logObject(baseIngredients, "baseIngredients")
-- mw.logObject(breakdown, "breakdown")
mw.logObject(totals, "totals")
end
end



Revision as of 02:08, 27 March 2024

Documentation for this module may be created at Module:RecipeDetails/doc

local p = {}
local cargo = mw.ext.cargo


local function appendTable(tableA, tableB)
	local aLen = #tableA
	for n=1, #tableB do
		tableA[aLen+n] = tableB[n]
	end
	
	return tableA
end

local function fuseBaseIngredients(oldTable, newTable)
	mw.log("Entered fuseBaseIngredients function")
--	mw.logObject(newTable, "Checking newTable ")
--	mw.logObject(oldTable, "Checking oldTable ")
	for n=1, #newTable do -- For each item in the new table
		mw.logObject(newTable[n], "Checking ".. newTable[n].Item .. '= ' )
		local newItem = true   -- Initialize newItem boolean
		for o=1, #oldTable do  -- Check each item in the old table
			if oldTable[o].Item == newTable[n].Item then  -- If the there is a match
				-- Add value, set boolean to false, and break loop.
				oldTable[o].Amount = oldTable[o].Amount + newTable[n].Amount 
				mw.log(newTable[n].Item .. " was matched.")
				newItem = false
				break
			end
		end
		mw.logObject(newTable[n], "Checking " .. newTable[n].Item )
		if newItem == true then 
			oldTable[#oldTable+1] = newTable[n]
			mw.log(newTable[n].Item .. " is new.") 
		end -- If it is a new item then add new item.
	end
	return oldTable
end

local function sortByKey(key)
    return function(a, b)
        return a[key] < b[key]
    end
end

-- Query smithing table for the recipe and retrieve the ingeredients
local function getRecipeItems( item, multi )
	local multiplier = multi or 1
	local ingredients = {}
	-- Query
    local args = {
        where = 'AnvilCraft.Item="'.. item ..'"',
        orderBy = 'AnvilCraft.Item'
    }
    local results = cargo.query('AnvilCraft', 'Resource1, Quantity1, Resource2, Quantity2, Resource3, Quantity3, Resource4, Quantity4', args )
    if #results == 0 then return {} end -- if no results, exit with an empty table.
    
    local tuple = {}
    for n=1, 4 do
    	if results[1]['Resource'..n] == nil or results[1]['Resource'..n] == '' then break end -- If an empty cell is encountered, stop processing items.
    	local tuple = { item = results[1]['Resource'..n], amount = tonumber(results[1]['Quantity'..n]) * multiplier}
		ingredients[n] = tuple
    end
	
	-- Return table of items and values.
    return ingredients
end

-- Takes a list of items and an optional iterator for indentation.
local function RecipeBreakdownRecursive(items, i)
	local indent = i or 1 -- Used to set padding later.
	local fullTableStruct = { --[[ inserted as (padding, item, amount) ]]	}
	local baseIngredients = { --[[ insereted as (item, amount) ]] }
	
	for n = 1, #items do
		local tuple = {Padding = indent, Item = items[n].item, Amount = items[n].amount}
		-- Insert item into fullTableStruct.
		fullTableStruct[#fullTableStruct+1] = tuple
		-- Query smithing table for the recipe and retrieve the ingeredients
		local reciItems = getRecipeItems(items[n].item, items[n].amount)
		-- If previous line's result is not empty then recursively call this function and increment i.
		if #reciItems == 0 then
			-- If item has value in baseingredients then increase, otherwise set to the value.
			local baseItem = {Item = items[n].item, Amount = items[n].amount}
			baseIngredients = fuseBaseIngredients(baseIngredients, baseItem)
		else
			-- If reciItems is not nil then recursively call this function and increment i.
			local retTable = RecipeBreakdownRecursive(reciItems, indent + 1)
			fullTableStruct = appendTable(fullTableStruct, retTable.recipe)
			baseIngredients = fuseBaseIngredients(baseIngredients, retTable.ingredients)
		end
	end
	
	local results = {}
	results.recipe = fullTableStruct
	results.ingredients = baseIngredients
	return results
end

local function RecipeBreakdownFormatter(fullTable)
	local results = {}
	local Row = [==[<tr><td style="padding-left:%spx">{{CraftReq|%s}}</td><td>{{Numdisplay|%s}}</td></tr>]==]
	-- Format output rows.
	local padding = 0
	for n=1, #fullTable do
    -- Index is 6 for the first tier, and 20n+5 for the rest.
		if fullTable[n].Padding > 1 then padding = fullTable[n].Padding * 20 + 5 else padding = 6 end
		results[n] = string.format(Row, padding, fullTable[n].Item, fullTable[n].Amount)
	end
	-- Concatenate strings together.
	return table.concat(results, "")
end

local function RecipeTotalsFormatter(baseIngTable)
	local result = {}
	local sortedTable = {}
	local Row = [==[<tr><td style="text-align:right">{{CraftReq|%s}}</td><td>{{Numdisplay|%s}}</td></tr>]==]
	-- Sort list
	sortedTable = table.sort(baseIngTable, sortByKey("Item")) or {}
	-- Format output rows.
	for n=1, #sortedTable do
		result[n] = string.format(Row, sortedTable.Item, sortedTable.Amount)
	end
	
	return table.concat(result, "")
end

function p.Builder( frame )
	local item = frame.args.Item
	local items = getRecipeItems(item)
	local doubleTable = RecipeBreakdownRecursive(items)
	local fullTableStruct = doubleTable.recipe
	local baseIngredients = doubleTable.ingredients
	
	-- build the data.
	local breakdown = RecipeBreakdownFormatter(fullTableStruct)
	local totals    = RecipeTotalsFormatter(baseIngredients)

	-- Store it in the Cargo Table: item, breakdown, totals.
	frame:expandTemplate{ title = 'DetailedRecipes', args = { Item = item, Breakdown = breakdown, Totals = totals } }
	-- test output
--	mw.logObject(items, "items")
--	mw.logObject(item, "item")
--	mw.logObject(doubleTable, "doubleTable")
--	mw.logObject(fullTableStruct, "fullTableStruct")
	mw.logObject(baseIngredients, "baseIngredients")
--	mw.logObject(breakdown, "breakdown")
	mw.logObject(totals, "totals")
	
end

function p.Main( frame )
	local item = frame.args.Item
	
	-- Query 'DetailedRecipes' table for the recipe and retrieve the outputs
	local tables = 'DetailedRecipes'
    local fields = 'Breakdown, Totals'
    local args = {
        where = 'Item = "' .. item .. '"'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end
    
	-- return table data for item
	frame:expandTemplate{ title = 'Detrecipe/tab', args = { reci = results[1].Breakdown, tot = results[1].Totals } }
    -- return string.format("{{Detrecipe/tab|reci=%s|tot=%s}}", results[1].Breakdown, results[1].Totals)
end

return p