Module:Crafting
From ARC Raiders Wiki
More actions
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