Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.



local getArgs = require('Module:Arguments').getArgs

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

function p.render(frame)
	local args = getArgs(frame)
	return p._render(args)
end

function p._render(args)
    local tbl = mw.html.create("table"):addClass("wikitable")
    
    tbl:tag("tr")
    	:tag("th"):wikitext("Ingredients"):done()
    	:tag("th"):wikitext(""):done()
    	:tag("th"):wikitext("Requirements"):done()
    	:tag("th"):wikitext(""):done()
    	:tag("th"):wikitext("Result"):done()

	ingredient_tbl = p._parse_ingredients(args['ingredients'])
	ingredient_out = p._render_ingredients(ingredient_tbl)
	
	requirements_tbl = {}
    
	local req_out = ""
	
	if args["station"] then
		req_out = args["station"]
		requirements_tbl["station"] = args["station"]
	else
		req_out = "Unknown station"
	end
	
	if args["blueprint"] and args["blueprint"] ~= "n" then
		if args["blueprint"] == "y" then
			req_out = req_out .. "<br>[[Blueprints|" .. mw.title.getCurrentTitle().text .. " Blueprint]] required"
			requirements_tbl['bp'] = mw.title.getCurrentTitle().text .. " Blueprint"
		else
			req_out = req_out .. "<br>[[Blueprints|" .. args["blueprint"] .. "]] required"
			requirements_tbl['bp'] = args["blueprint"]
		end
		
	end
		
	if args["skill"] then
		req_out = req_out .. "<br>Skill: " .. args["skill"]
		requirements_tbl['skill'] = args["skill"]
    end		
    
    result_item = args["result"] or mw.title.getCurrentTitle().text
    result_out = (args["qty"] or "1") .. "× " .. result_item

    p._cargo_store(result_item, args["qty"] or "1", ingredient_tbl, requirements_tbl)

	tbl:tag("tr")
		:tag("td"):wikitext(ingredient_out):done()
		:tag("td"):wikitext("'''→'''"):done()
		:tag("td"):wikitext(req_out):done()
		:tag("td"):wikitext("'''→'''"):done()
		:tag("td"):wikitext(result_out):done()
		
    return tostring(tbl)
end

function p.renderSearch(frame)
	local args = getArgs(frame)
	return p._renderSearch(args)	
end

function p._renderSearch(args)
	search_item = args[1] or mw.title.getCurrentTitle().text
	
	results = p._cargo_query(search_item)

	if #results > 0 then
	    local tbl = mw.html.create("table"):addClass("wikitable"):addClass("sortable")
	    
	    tbl:tag("tr")
	    	:tag("th"):wikitext("Ingredients"):done()
	    	:tag("th"):addClass("unsortable"):done()
	    	:tag("th"):wikitext("Requirements"):done()
	    	:tag("th"):addClass("unsortable"):done()
	    	:tag("th"):wikitext("Result"):done()
	    
    	for n=1, #results do
    		local result = results[n]
    		
    		local ingredients_tbl = {}
    		for _,ingredient in ipairs(mw.text.split(result["ingredients"], ",", true)) do
    			ingr_name, ingr_qty, ingr_page = unpack(mw.text.split(ingredient, ":"))
    			table.insert(ingredients_tbl, {name=ingr_name, qty=ingr_qty, page=ingr_page})
    		end
		
			req_out = result["requireStation"]
			if result["requireBlueprint"] ~= '' then
				req_out = req_out .. "<br>[[Blueprints|"..result["requireBlueprint"].."]]"
			end
			
			if result["requireSkill"] ~= '' then
				req_out = req_out .. "<br>Skill: "..result["requireSkill"]
			end
			
			tbl:tag("tr")
				:tag("td"):wikitext(p._render_ingredients(ingredients_tbl))
				:tag("td"):wikitext("'''→'''"):done()
				:tag("td"):wikitext(req_out):done()
				:tag("td"):wikitext("'''→'''"):done()
				:tag("td"):wikitext(result["resultQty"] .."× [["..result['_pageName'].."|"..result['resultItem'].."]]"):done()
    	end	    
	    
		return tbl
		
	else
		return mw.html.create("p"):wikitext("''No recipes found.''")
	end
end

function p.renderWeaponUpgrades(frame)
	local args = getArgs(frame)
	return p._renderWeaponUpgrades(args)	
end

function p._renderWeaponUpgrades(args)
    local tbl = mw.html.create("table"):addClass("wikitable")
    
    tbl:tag("tr")
    	:tag("th"):wikitext("Ingredients"):done()
    	:tag("th"):wikitext(""):done()
    	:tag("th"):wikitext("Requirements"):done()
    	:tag("th"):wikitext(""):done()
    	:tag("th"):wikitext("Result"):done()
    	:tag("th"):wikitext("Perks"):done()    	
	
	basename = args["name"] or mw.title.getCurrentTitle().text
	
	local parse_row = function(basename, ingredients, station, from_roman, to_roman, perks)
   		tbl:tag("tr")
   			:tag("td"):wikitext(p._render_ingredients(ingredients)):done()
   			:tag("td"):wikitext("'''→'''"):done()
   			:tag("td"):wikitext(station):done()
   			:tag("td"):wikitext("'''→'''"):done()
   			:tag("td"):wikitext(basename .. " " .. to_roman):done()
   			:tag("td"):wikitext(perks):done()
	end
	
	if args["level2-ingredients"] then
		local ingr_tbl = p._parse_ingredients(args["level2-ingredients"])
		local station = args["level2-station"] or args["station"]
		
		table.insert(ingr_tbl, 1, {name=basename .. " I", qty="1", page=basename, nolink=true})
		parse_row(basename, ingr_tbl, station, "I", "II", args["level2-perks"] or "")
		p._cargo_store(basename .. " II", 1, ingr_tbl, {["station"] = station})
	end
   
	if args["level3-ingredients"] then
		local ingr_tbl = p._parse_ingredients(args["level3-ingredients"])
		local station = args["level3-station"] or args["station"]
		
		table.insert(ingr_tbl, 1, {name=basename .. " II", qty="1", page=basename, nolink=true})
		parse_row(basename, ingr_tbl, station, "II", "III", args["level3-perks"] or "")
		p._cargo_store(basename .. " III", 1, ingr_tbl, {["station"] = station})
	end

	if args["level4-ingredients"] then
		local ingr_tbl = p._parse_ingredients(args["level4-ingredients"])
		local station = args["level4-station"] or args["station"]
		
		table.insert(ingr_tbl, 1, {name=basename .. " III", qty="1", page=basename, nolink=true})
		parse_row(basename, ingr_tbl, station, "III", "IV", args["level4-perks"] or "")
		p._cargo_store(basename .. " IV", 1, ingr_tbl, {["station"] = station})
	end

	return tbl
end

function p._cargo_query(search_item)
	c_tables = 'crafting'
	c_fields = '_pageName,resultItem,resultQty,ingredients,requireBlueprint,requireStation,requireSkill'
    c_params = {
    	where = 'ingredients HOLDS LIKE "'.. search_item ..':%"',
    	orderBy = 'resultItem'
    }

	return cargo.query(c_tables, c_fields, c_params)
end

function p._parse_ingredients(ingr_str)
	-- Input looks like: 1 Steel Spring + 3 Advanced Components
	ingredients = {}

	-- First split by + 
	for _, itm in ipairs(mw.text.split(ingr_str, "+", true)) do
		-- Then split the number from the item name
		ingr_qty, ingr_name = string.match(mw.text.trim(itm), "^([0-9]+)(.+)$")
		
		if ingr_qty then
			table.insert(ingredients, {name=mw.text.trim(ingr_name), qty=tonumber(ingr_qty)})
		end
	end
	
	return ingredients
end

function p._render_ingredients(tbl)
	if next(tbl) == nil then
		return "?"
	end
	
	res = {}
	for _,ingredient in pairs(tbl) do
		if ingredient.nolink then
			ingr_link = ingredient.name
		elseif ingredient.page then
			ingr_link = "[[" .. ingredient.page .. "|" .. ingredient.name .. "]]"
		else
			ingr_link = "[[" .. ingredient.name .. "]]"
		end
		
		res[#res+1] = ingredient.qty .. "× " .. ingr_link
		
	end

	return table.concat(res, "<br>")
end

function p._cargo_store(output_item, output_qty, ingredient_tbl, requirements_tbl)
	
	local ingredients_merged = {}
	for _, ingr in pairs(ingredient_tbl) do
		ingr_str = ingr['name']..":"..ingr['qty']
		if ingr['page'] then
			ingr_str = ingr_str .. ":" .. ingr['page']
		end
		
		table.insert(ingredients_merged, ingr_str)
	end
	
	cargo.store('crafting', {
		resultItem = output_item,
		resultQty = tonumber(output_qty),
		ingredients = table.concat(ingredients_merged, ","),
		requireBlueprint = requirements_tbl["bp"] or "",
		requireStation = requirements_tbl["station"] or "",
		requireSkill = requirements_tbl["skill"] or "",
	})		
end

return p