From Dark and Darker Wiki

Revision as of 22:57, 2 March 2026 by Raw Salad (talk | contribs) (Created page with "local p = {} local AD = mw.loadJsonData("Data:Accessory.json") local insert = table.insert local concat = table.concat ---Counts number of keys. Tables from Accessory.json don't work with next() or the # operator --- @param t table --- @return number local function count(t) local c = 0 for _ in pairs(t) do c = c + 1 end return c end ---Create css/html wikitext for iconbox ---@param item table ---@return string local function iconbox(item) local color = "3" local...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Overview

Functions for making Accessory table. Data comes from Data:Accessory.json.

Functions

draw_table

Creates a table of accessories

Parameters

  • 1 - <Slot Type>


draw_table examples

Back


{{#invoke:Accessory|draw_table|Necklace}}


NameStats
Will
1
2
3
4
5
Vigor
1
2
3
4
5
Luck
100~120
Headshot Damage Modifier
12~15%
Agility
1
2
3
4
5
Physical Power
1
2
3
4
5
Armor Penetration
1%
1.5%
2%
2.5%
3%
Dexterity
1
2
3
4
5
Max Health Add
1~2
3~4
5~6
7~8
9~10
Knowledge
1
2
3
4
5
Strength
1
2
3
4
5
Magical Power
1
2
3
4
5
Magical Penetration
1%
1.5%
2%
2.5%
3%
Resourcefulness
1
2
3
4
5
Outgoing Magical Healing Add
3
Magical Resistance
25~28
29~31
32~35
36~38
39~41
Armor Rating Add
10~12
13~16
17~20
21~24
25~27


Head


{{#invoke:Accessory|draw_table|Ring}}


NameStats
Vigor
2
Will
1
Strength
2
Vigor
1
Luck
6~12
Strength
1
2
3
4
5
Dexterity
1
2
3
4
5
Agility
1
2
3
4
5
Will
1
2
3
4
5
Resourcefulness
1
2
3
4
5
Vigor
1
2
3
4
5
Knowledge
1
2
3
4
5

local p = {}
local AD = mw.loadJsonData("Data:Accessory.json")
local insert = table.insert
local concat = table.concat


---Counts number of keys. Tables from Accessory.json don't work with next() or the # operator
--- @param t table
--- @return number
local function count(t)
	local c = 0
	for _ in pairs(t) do c = c + 1 end
	return c
end


---Create css/html wikitext for iconbox
---@param item table
---@return string
local function iconbox(item)
	local color = "3"
	local caption = "[["..item.name
	if count(item.rarities) == 1 then
		color = item.rarities[1]
		caption = caption.."|<b class=cr"..color..">"..item.name.."</b>"
	end
	local wikitext = {}
	insert(wikitext,"<div class='iconbox' style='display:inline-flex;width:max-content;max-width:initial;flex-direction:column;align-items:center;flex-wrap:wrap;white-space:pre-wrap'>")
	insert(wikitext,"<div class='rarity"..color.." rounded relative'>")
	insert(wikitext,"[[File:"..item.name..".png|45x45px|link="..item.name.."]]")
	insert(wikitext,caption.."]]</div>")
	return concat(wikitext)
end


---Marks up a list of values with color based on rarity
---@param values string|table
---@param accessory table
---@return string
local function color_values(values,accessory)
	if values == nil then return "" end
	if type(values)=="string" then
		if count(accessory.rarities) == 1 then return "<span class='cr"..accessory.rarities[1].."'>"..values.."</span>" end
		return values
	end

	--TODO this assumes i is the same as the color rating, this may result in a bug
	local wikitext = {}
	local newline = ""
	for i, value in ipairs(values) do
		insert(wikitext,newline.."<span class='cr"..i.."'>"..value.."</span>")
		if i == 1 then newline = "<br>" end
	end
	return concat(wikitext)
end


---Marks up a stat block with the stat name and colored values and appropriate margins and alignment
--- @param stat string
--- @param accessory table
--- @return string
local function inline_block(stat, accessory)
	if accessory.stats[(stat):lower()] == nil then return "" end
	return "<div style='display:inline-block;vertical-align:top;margin:0 15px 0 15px'><b style='color:#eee8'>"..stat.."</b><br>"..color_values(accessory.stats[(stat):lower()],accessory).."</div>"
end


---Return a table row of data cells containing accessory information
--- @param accessory table
--- @return string
local function row(accessory)
	local wikitext = {}
	insert(wikitext,"<tr><td>")
	insert(wikitext,iconbox(accessory))
	insert(wikitext,"</td><td>")
	-- create the table data cell for all of the stats
	for _, stat in ipairs(accessory.stats.order) do
		insert(wikitext,inline_block(stat,accessory))
	end
	insert(wikitext,"</td></tr>")
	return concat(wikitext)
end


--- Return a list of accessory keys to be used in the table
--- @param frame table
--- @return table - strings
local function get_list(frame)
	return AD[frame.args[1]] or {}
end


--- Return a table row of appropriate headers cells
--- @return string
local function table_header()
	return [=[<table cellspacing="0" class="wikitable sortable jquery-tablesorter" style="width:20%;color:#eee;background:transparent;text-align:center;vertical-align:middle;"><tr><th style="width:50%">Name</th><th style="width:50%">Stats</th></tr>]=]
end

---Create Accessory table wikitext
---- Test on wiki with:  mw.log(p.draw_table({args={"Neck"}}))
----                     mw.log(p.draw_table({args={"Ring"}}))
--- @param frame table
--- @return string
function p.draw_table(frame)
	if not AD then return "<span style='color:red;'>Error: Could not load Accessory data in [[Module:Accessory]]</span>" end

	local wikitext = {}
	insert(wikitext, table_header())
	for _, key in ipairs(get_list(frame)) do
		insert(wikitext, row(AD.Accessory[key]))
	end
	insert(wikitext, "</table>")
	return concat(wikitext)
end


return p