- merchant - Merchant of interest.
- item - Singular item for which to create a table.
- ingredient - Ingredient name. Used to filter the provided merchant's crafts for those which use the ingredient.
From Dark and Darker Wiki
Overview
Functions for making Crafting table. Data comes from Data:Merchant.json.
Functions
draw_table
Creates a table of craftables
{{#invoke:Craft|draw_table|item=Void Blade|merchant=Weaponsmith}}
| Name | Ingredients | Merchant |
|---|---|---|
| Weaponsmith |
{{#invoke:Craft|draw_table|merchant=Weaponsmith|ingredient=Iron Ingot}}
| Name | Ingredients | Merchant |
|---|---|---|
| Weaponsmith | ||
| Weaponsmith | ||
| Weaponsmith | ||
| Weaponsmith | ||
| Weaponsmith | ||
| Weaponsmith | ||
| Weaponsmith | ||
| Weaponsmith | ||
| Weaponsmith |
{{#invoke:Craft|draw_table|merchant=Weaponsmith}}
page
Creates, if possible, two tables. The first presents recipes for if the given item is craftable. The second presents recipes that use the item to create other items.
- item - Singular item for which to create a table.
- category - Item's item category. Used to lookup merchant crafting presence.
{{#invoke:Craft|page|item=Void Blade|category=Weapon}}
Script error: The function "page" does not exist.
{{#invoke:Craft|page|category=Misc|item=Iron Ingot}}
Script error: The function "page" does not exist.
{{#invoke:Craft|page|category=Misc|item=Iron Ore}}
Script error: The function "page" does not exist.
--Either draw table of all craftable weapons for a merchant, or a singular item table
local p = {}
local MD = mw.loadJsonData("Data:Merchant.json") --Global var holding tables from Data:Merchant.json
local function iconbox(wt,name,amount,rarity,has_caption)
wt[#wt+1] = "<div class='iconbox' style='width:max-content;align-items:center'><div class='rarity"..rarity.." rounded relative'>"
wt[#wt+1] = "[[File:"..name..".png|x80px|link="..name.."]]"
wt[#wt+1] = "<span class='iconamount' style='pointer-events:none;color:#EEEA;font-size:16px'>"..amount.."</span>"
wt[#wt+1] = "</div>"
if has_caption then wt[#wt+1] = "<br>[["..name.."|<b class=cr"..rarity..">"..name.."</b>]]" end
wt[#wt+1] = "</div>"
end
local function name(wt,is_header,craft,merchant_name)
if is_header then wt[#wt+1] = "<th style='width:2%'>Name</th>" return end
wt[#wt+1] = "<td>"
iconbox(wt,craft.itemname,craft.quantity,craft.rarity,true)
wt[#wt+1] = "</td>"
end
local function ingredients(wt,is_header,craft,merchant_name)
if is_header then wt[#wt+1] = "<th style='width:5%'>Ingredients</th>" return end
wt[#wt+1] = "<td>"
for _,ingredient in ipairs(craft.ingredients) do
local amount = string.match(ingredient,"^(%d*)-")
local ingredient_name = string.match(ingredient,"-(.*)-")
local rarity = string.match(ingredient,"-.*-(.*)$")
iconbox(wt,ingredient_name,amount,rarity)
end
wt[#wt+1] = "</td>"
end
local function merchant(wt,is_header,craft,merchant_name)
if is_header then wt[#wt+1] = "<th style='width:2%'>Merchant</th>" return end
wt[#wt+1] = "<td>[["
wt[#wt+1] = merchant_name
wt[#wt+1] = "]]</td>"
end
local function affinity_to_unlock(wt,is_header,craft,merchant)
if is_header then wt[#wt+1] = "<th class='tooltip' style='width:2%'>[[Template:Merchant Affinity|Affinity to Unlock]]<span class='tooltiptext-left' style='left:50%; transform:translate(-50%); bottom:75%; width:100%'>Affinity values are collected manually by the community. If you spot an error, please follow the link and fix it!</span></th></tr>" return end
end
local ROW = {
["Default"] = {name,ingredients,merchant}
}
local function craft_row(wt,is_header,craft,merchant_name)
wt[#wt+1] = "<tr>"
for _,table_data in ipairs(ROW.Default) do
table_data(wt,is_header,craft,merchant_name)
end
wt[#wt+1] = "</tr>"
end
local function craft_table_header(wt)
craft_row(wt,true)
end
local function spairs(dict)
if not dict then return function() return nil,nil end end
local set = {}
for key,_ in pairs(dict) do
if key ~= "order" then
set[#set+1] = key
end
end
table.sort(set,function(a,b)
if type(a) ~= type(b) then
return tostring(a) < tostring(b)
else
return a < b
end
end)
local i = 0
return function()
i = i + 1
local key = set[i]
if key ~= nil then
return key, dict[key]
end
end
end
local function has_ingredient(list,ingredient)
for _,val in ipairs(list) do
if string.match(val,ingredient) then return true end
end
return false
end
local function get_list(args)
local list = {}
if args.item then
list[#list+1] = args.item
else
for craft_name,craft in spairs(MD[args.merchant].crafts) do
-- if filtering for ingredients, ensure the craft requires the ingredient
if args.ingredient then
if has_ingredient(craft.ingredients,args.ingredient) then
list[#list+1] = craft_name
end
-- else include all crafts
elseif args.merchant ~= nil then
list[#list+1] = craft_name
end
end
end
return list
end
function p.draw_table(f)
local item_list = get_list(f.args)
local merchant = f.args.merchant
local wt = {}
wt[#wt+1] = "<table cellspacing='0' class='wikitable sortable jquery-tablesorter' style='width:70%;min-width:500px;text-align:center;vertical-align:middle'>"
if #item_list ~= 0 then
craft_table_header(wt)
for _,craft_name in ipairs(item_list) do
craft_row(wt,false,MD[merchant].crafts[craft_name],merchant)
end
else
return "Failure"
end
wt[#wt+1] = "</table>"
return table.concat(wt)
end
return p
-- mw.log(p.draw_table({args={item="Void Blade",merchant="Weaponsmith"}}))
-- mw.log(p.draw_table({args={merchant="Weaponsmith"}}))
-- mw.log(p.draw_table({args={merchant="Weaponsmith",ingredient="Iron Ore"}}))