From Dark and Darker Wiki

Revision as of 07:04, 2 March 2026 by Raw Salad (talk | contribs) (Data validation bug)

Overview

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

Functions

draw_table

Creates a table of armors

Parameters

  • 1 - <Slot Type>
  • 2 - Craftable or Uncraftable


draw_table examples

Back


{{#invoke:Armor|draw_table|Back|Craftable}}


NameArmor/magical RatingAttributesOther
Armor Rating
11
Will
2
Spell Casting Speed
3%
Armor Rating
10
Agility
3
Action Speed
1%
Armor Rating
15
Dexterity
3
Vigor
3
Will
3
Resourcefulness
3
Luck
40
All Attributes
3
Armor Rating
13
Knowledge
3
Armor Penetration
3.5%
Magical Penetration
3.5%
Armor Rating
19
Strength
3
Dexterity
3
Will
3
Armor Rating
8
Vigor
3
Debuff Duration Bonus
2%


Head


{{#invoke:Armor|draw_table|Head|Uncraftable}}


NameClass RequirementsMovement SpeedArmor/magical RatingAttributesOther
Wizard
Warlock
Druid
Sorcerer
-5
Armor Rating
4
4
5
6
6
7
8
Magical Resistance
20
25
31
37
41
49
54
Headshot Damage Reduction
6%
Spell Casting Speed
1.5%
Fighter-12
Armor Rating
25~27
28~31
31~33
33~35
34~36
37~39
39~42
Headshot Damage Reduction
18%
Projectile Damage Reduction
7%
Physical Damage Reduction
1.5%
Fighter
Barbarian
-10
Armor Rating
20~21
22~23
23~24
25~26
27~28
29~30
30~31
Magical Resistance
10
Headshot Damage Reduction
12%
Projectile Damage Reduction
4%
Physical Power
2
Warlock-7
Armor Rating
18
20
21
23
26
27
28
Headshot Damage Reduction
9%
Projectile Damage Reduction
5.5%
Undead Race Damage Bonus
2%
Ranger-5
Armor Rating
6
6
7
8
9
10
11
Headshot Damage Reduction
6%
Headshot Damage Modifier
2%
Cleric
Sorcerer
-5
Armor Rating
6
6
6
8
8~9
9
11
Magical Resistance
16
20
25
29
33
39
43
Headshot Damage Reduction
6%
Cooldown Reduction Bonus
2%
Fighter
Cleric
-8
Armor Rating
16~17
18~19
20~21
21~22
23~24
24~25
26
Magical Resistance
10
Headshot Damage Reduction
10%
Projectile Damage Reduction
2%
Physical Power Bonus
1.5%
Cleric
Sorcerer
-5
Armor Rating
4
4
5
5
6
7
8
Magical Resistance
16
20
25
29
33
39
43
Headshot Damage Reduction
5%
Magical Damage Reduction
1.5%
Wizard
Cleric
Druid
Sorcerer
-2
Armor Rating
5
5
6
6~7
7~8
8
10
Headshot Damage Reduction
6%
Memory Capacity Add
3
Fighter
Cleric
-17
Armor Rating
23
25
27
28
30
33
34
Headshot Damage Reduction
15%
Projectile Damage Reduction
5.5%
Demon Race Damage Reduction
2%
Druid-5
Armor Rating
11
13
15
15
18~19
20
21
Headshot Damage Reduction
7%
Cooldown Reduction Bonus
2%
Warlock
Druid
-5
Armor Rating
11
13
16
15~16
19~20
21
22
Headshot Damage Reduction
8%
Physical Power Bonus
1.5%
Druid-7
Armor Rating
12
14
16~18
17~18
20~21
22
25
Headshot Damage Reduction
8%
Undead Race Damage Bonus
2%
Bard-5
Armor Rating
11
13
16
16~17
20
21
22
Headshot Damage Reduction
7%
Buff Duration Bonus
1.5%
Ranger
Druid
-7
Armor Rating
6
6
7
8
9
10
12
Magical Resistance
14
18
21
26
29
34
38
Headshot Damage Reduction
6%
Magical Interaction Speed
1.5%
Barbarian-10
Armor Rating
20~21
22~24
25~26
27~28
28~30
31~32
32~33
Magical Resistance
8
9
10
11
12
13
15
Headshot Damage Reduction
12%
Projectile Damage Reduction
4%
Max Health Add
2
Fighter
Cleric
-17
Armor Rating
23
26
28
29
31
34
34
Headshot Damage Reduction
16%
Projectile Damage Reduction
6.5%
Max Health Bonus
1%
Fighter
Cleric
-17
Armor Rating
25
27
28
30
32
35
35
Magical Resistance
-5
Headshot Damage Reduction
17%
Projectile Damage Reduction
6.5%
Max Health Add
2
Rogue
Bard
-5
Armor Rating
6
6
7
8
9
10
11
Headshot Damage Reduction
6%
Headshot Damage Modifier
2%
Fighter
Cleric
-8
Armor Rating
16~17
18~19
20~21
21~22
23~24
24~25
26
Magical Resistance
10
Headshot Damage Reduction
10%
Projectile Damage Reduction
2%
Luck
15
Bard-5
Armor Rating
11
13
16
16~17
20
22
22
Headshot Damage Reduction
8%
Luck
15
-5
Armor Rating
12
14
16~18
19~20
20~21
22~23
23~25
Headshot Damage Reduction
7%
Outgoing Physical Healing Add
1
Cleric-5
Armor Rating
11
13
16
16
20
21
22
Headshot Damage Reduction
8%
Undead Race Damage Bonus
2%
Barbarian-7
Armor Rating
19
21
22
24
27
28
30
Headshot Damage Reduction
9%
Projectile Damage Reduction
2.5%
Action Speed
0.5%
Warlock-5
Armor Rating
6
6
7
8
9
10
12
Headshot Damage Reduction
6%
Outgoing Magical Healing Add
1
Fighter
Ranger
Cleric
Bard
-7
Armor Rating
18
21
22
23
26
28
29
Headshot Damage Reduction
10%
Projectile Damage Reduction
2.5%
Undead Race Damage Reduction
2%
Ranger-5
Armor Rating
8
8
9
9~10
11~12
12~13
15
Headshot Damage Reduction
4%
Action Speed
0.5%
Cleric-5
Armor Rating
11
13
16
16
20
21
22
Headshot Damage Reduction
8%
Demon Race Damage Bonus
2%
Rogue-5
Armor Rating
6
7
7~8
8~9
10~11
11~12
13~14
Headshot Damage Reduction
4%
Item Swap Speed
1.5%
Fighter
Cleric
-7
Armor Rating
18
20
21
23
26
27
28
Headshot Damage Reduction
9%
Projectile Damage Reduction
2.5%
Magical Damage Reduction
1.5%
Rogue
Warlock
-5
Armor Rating
5
6
6
7~8
8
9
10
Magical Resistance
14
18
21
26
29
34
38
Headshot Damage Reduction
6%
Debuff Duration Bonus
1.5%
Rogue
Warlock
-2
Armor Rating
3
3
4
5
5
6
8
Action Speed
0.5%
Fighter
Ranger
Cleric
-10
Armor Rating
19
22
23
25
27
29
30
Headshot Damage Reduction
10%
Projectile Damage Reduction
3.5%
Armor Penetration
2%
Rogue
Bard
-5
Armor Rating
6
6
6
8
8
9
11
Headshot Damage Reduction
6%
Buff Duration Bonus
1.5%
Bard
Druid
-5
Armor Rating
6
6
7
8
9
10
12
Headshot Damage Reduction
6%
Regular Interaction Speed
1.5%
Fighter
Cleric
-17
Armor Rating
24
26
28
29
32
34
35
Headshot Damage Reduction
16%
Projectile Damage Reduction
6.5%
Cooldown Reduction Bonus
2%
Ranger
Barbarian
-7
Armor Rating
12
15
18
17
21
22
23
Headshot Damage Reduction
8%
Headshot Damage Modifier
2%
Barbarian-11
Armor Rating
22~23
25~26
27~28
29~30
30~32
33~34
34~35
Headshot Damage Reduction
12%
Projectile Damage Reduction
4%
Physical Power Bonus
1.5%
Fighter-10
Armor Rating
20~21
22~23
23~24
25~26
27~28
29~30
30~31
Headshot Damage Reduction
13%
Action Speed
0.5%
Projectile Damage Reduction
6%
Barbarian-12
Armor Rating
22
25
26
28
30
32
33
Headshot Damage Reduction
11%
Projectile Damage Reduction
6.5%
Max Health Bonus
1%
Wizard
Warlock
-5
Armor Rating
4
5
5
6
7
8
9
Headshot Damage Reduction
2.5%
Magical Power
2
-5
Armor Rating
5
6
6
8
8
9
10
Headshot Damage Reduction
4%
Max Health Add
2

local p = {}
local AD = mw.loadJsonData("Data:Armor.json")
local is_special = {["Move Speed"]=true, ["Armor Rating"]=true, ["Magical Resistance"]=true}
local is_primitive = {["Strength"]=true, ["Vigor"]=true, ["Agility"]=true, ["Dexterity"]=true, ["Will"]=true, ["Knowledge"]=true, ["Resourcefulness"]=true}


local function get_type(item)
	--Assumes that the item only has one type
	local key,_ = next(item.types)
	return key or ""
end


local function size(item)
	return tostring(item.invwidth*45).."x"..tostring(item.invheight*45).."px"
end


local function count(t)
	local count = 0
	for _ in pairs(t) do count = count + 1 end
	return count
end


---Create css/html wikitext for iconbox
---@param item table
---@return string
local function iconbox(item)
	local color = "2"
	local caption = "[["..item.name
	if count(item.rarities) == 1 then
		color = item.rarities[1]
		caption = caption.."|<b class=cr"..color..">"..item.name.."</b>"
	end
	return "<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'>"
			.."<div class='rarity"..color.." rounded relative'>"
				.."[[File:"..item.name..".png|"..size(item).."|link="..item.name.."]]"
				.."<span class='iconamount' style='pointer-events:none;color:#EEEA;font-size:16px'>"..get_type(item).."</span></div>"
			..caption.."]]</div>"
end


local function classes(list)
	local wikitext = ""
	local newline = ""
	for i, class in ipairs(list) do
		wikitext = wikitext..newline..class
		if i == 1 then newline = "<br>" end
	end
	return wikitext
end

local function color_values(values,armor)
	if values == nil then return "" end
	if type(values)=="string" then
		if count(armor.rarities) == 1 then return "<span class='cr"..armor.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
		wikitext = wikitext..newline.."<span class='cr"..i.."'>"..value.."</span>"
		if i == 1 then newline = "<br>" end
	end

	return wikitext
end


local function inline_block(stat, armor)
	if armor.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(armor.stats[(stat):lower()],armor).."</div>"
end


---Return a table row of data cells containing armor information
--- @param armor table
--- @return string
local function row(armor)
	local wikitext = "<tr><td>"
		..iconbox(armor)
		.."</td><td>"

	if armor.slottype ~= "Back" then
		wikitext = wikitext
			..classes(armor.classes)
			.."</td><td>"
			..color_values(armor.stats["move speed"],armor)
			.."</td><td>"
	-- elseif armor.stats["move speed"] then
	-- 	wikitext = wikitext.."<span style='color:red;'>Error: Back "..armor.name.." has unpresented move speed.</span>"
	-- elseif next(armor.classes) then
	-- 	wikitext = wikitext.."<span style='color:red;'>Error: Back "..armor.name.." has unpresented class requirements.</span>"
	end

	wikitext = wikitext
		..inline_block("Armor Rating",armor)
		..inline_block("Magical Resistance",armor)
		.."</td><td>"

	-- create the table data cell for attributes
	for _,stat in ipairs(armor.stats.order) do
		if is_primitive[stat] then
			wikitext = wikitext..inline_block(stat,armor)
		end
	end
	wikitext = wikitext.."</td><td>"

	-- create the table data cell for the rest of the stats
	for _, stat in ipairs(armor.stats.order) do
		if not is_primitive[stat] and not is_special[stat] then
			wikitext = wikitext..inline_block(stat,armor)
		end
	end
	return wikitext.."</td></tr>"
end


--- Return a list of armor keys to be used in the table
--- @param frame table
--- @return table - strings
local function get_armor_list(frame)
	--TODO add minor string validation and correction, e.g. "DeMoN" -> "demon"  ("DeMoN"):lower()
	return AD[frame.args[1]][frame.args[2]] or {}
end


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

	if (frame.args[1] or ""):lower() ~= "back" then
		wikitext = wikitext..[=[<th style="width:5%">Class Requirements</th><th style="width:5%">Movement Speed</th>]=]
	end

	return wikitext..[=[<th style="width:10%">Armor/magical Rating</th><th style="width:10%">Attributes</th><th style="width:25%">Other</th></tr>]=]
end

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

	local wikitext = table_header(frame)

	for _, key in ipairs(get_armor_list(frame)) do
		wikitext = wikitext..row(AD.Armor[key])
	end

	return wikitext.."</table>"
end


return p