From Dark and Darker Wiki
m (Testing) Tag: Reverted |
(Reverting tests) Tag: Undo |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local AD = mw.loadJsonData("Data:Armor.json") | 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 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 | return p | ||
Revision as of 06:33, 2 March 2026
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}}
| Name | Armor/magical Rating | Attributes | Other |
|---|---|---|---|
Armor Rating 11 | Will 2 | Spell Casting Speed 3% | |
Armor Rating 10 | Agility 3 | Action Speed 1% | |
Armor Rating 15 | Dexterity 1 Vigor 1 Will 1 Resourcefulness 1 | Luck 40 All Attributes 1 | |
Armor Rating 19 | Strength 2 Dexterity 2 Will 2 | ||
Armor Rating 8 | Vigor 3 | Debuff Duration Bonus 2% |
Head
{{#invoke:Armor|draw_table|Head|Uncraftable}}
| Name | Class Requirements | Movement Speed | Armor/magical Rating | Attributes | Other |
|---|---|---|---|---|---|
| Wizard Warlock Druid Sorcerer | -2 | Armor Rating 21 22 23 24~25 26~27 28 29 | Will 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Fighter | -5 | Armor Rating 54 55 56~57 58~59 60~61 62 63 | Strength 1 2 2 3 4 5 5 | Projectile Damage Reduction 2.1% Headshot Damage Reduction 18% | |
| Fighter Barbarian | -4 | Armor Rating 26 27 28~29 30~31 32~33 34 35 Magical Resistance 30 | Dexterity 1 2 2 3 4 5 5 | Projectile Damage Reduction 1.2% Headshot Damage Reduction 15% | |
| Warlock | -3 | Armor Rating 33 34 35~36 37~38 39~40 41 42 | Will 1 1 1 2 2 3 3 | Projectile Damage Reduction 1.8% Headshot Damage Reduction 15% Headshot Damage Modifier 2.5% 3% 3% 3% 3.5% 3.5% 4% | |
| Ranger | -2 | Armor Rating 24 25 26 27 28 29 30 | Dexterity 1 1 1 2 2 3 3 | Headshot Damage Reduction 8% Headshot Damage Modifier 2.5% 3% 3% 3% 3.5% 3.5% 4% | |
| Cleric Sorcerer | -2 | Armor Rating 21 22 23 24~25 26~27 28 29 Magical Resistance 20 | Resourcefulness 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Fighter Cleric | -3 | Armor Rating 39 40 41~42 43~44 45~46 47 48 Magical Resistance 10 | Agility 1 2 2 3 4 5 5 | Projectile Damage Reduction 0.6% Headshot Damage Reduction 13% | |
| Cleric Sorcerer | -2 | Armor Rating 23 24 25 26~27 28~29 30 31 Magical Resistance 20 | Will 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Wizard Cleric Druid Sorcerer | -1 | Armor Rating 17 18 19 20~21 22~23 24 25 | Knowledge 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Fighter Cleric | -5 | Armor Rating 52 53 54~55 56~57 58~59 60 61 | Strength 1 1 1 2 2 3 3 Vigor 1 1 1 2 2 2 | Projectile Damage Reduction 1.8% Headshot Damage Reduction 18% | |
| Druid | -2 | Armor Rating 24 25 26 27~28 29~30 31 32 | Strength 1 1 1 2 2 3 3 Will 1 1 1 2 2 2 | Headshot Damage Reduction 8% | |
| Warlock Druid | -2 | Armor Rating 26 27 28 29~30 31~32 33 34 | Strength 1 1 1 2 2 2 2 Knowledge 1 1 1 1 2 2 2 Agility 1 1 1 1 2 2 | Headshot Damage Reduction 10% | |
| Druid | -3 | Armor Rating 31 32 33~34 35~36 37~38 39 40 | Vigor 1 1 1 2 2 3 3 Dexterity 1 1 1 2 2 2 | Headshot Damage Reduction 11% | |
| Bard | -2 | Armor Rating 28 29 30 31~32 33~34 35 36 | Knowledge 1 2 2 3 4 5 5 | Headshot Damage Reduction 9% | |
| Ranger Druid | -2 | Armor Rating 25 26 27 28~29 30~31 32 33 Magical Resistance 15 | Strength 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Barbarian | -4 | Armor Rating 41 42 43~44 45~46 47~48 49 50 Magical Resistance 15 | Vigor 1 2 2 3 4 5 5 | Projectile Damage Reduction 1.2% Headshot Damage Reduction 15% | |
| Fighter Cleric | -5 | Armor Rating 55 56 57~58 59~60 61~62 63 64 | Knowledge 1 2 2 3 4 5 5 | Projectile Damage Reduction 2.1% Headshot Damage Reduction 23% | |
| Fighter Cleric | -5 | Armor Rating 58 59 60~61 62~63 64~65 66 67 Magical Resistance -10 | Vigor 1 2 2 3 4 5 5 | Projectile Damage Reduction 2.1% Headshot Damage Reduction 23% | |
| Rogue Bard | -2 | Armor Rating 24 25 26 27 28 29 30 | Dexterity 1 1 1 2 2 3 3 | Headshot Damage Reduction 8% Headshot Damage Modifier 2.5% 3% 3% 3% 3.5% 3.5% 4% | |
| Fighter Cleric | -3 | Armor Rating 36 37 38~39 40~41 42~43 44 45 Magical Resistance 10 | Knowledge 1 2 2 3 4 5 5 | Projectile Damage Reduction 0.6% Headshot Damage Reduction 13% | |
| Bard | -2 | Armor Rating 29 30 31 32~33 34~35 36 37 | Resourcefulness 1 2 2 3 4 5 5 | Headshot Damage Reduction 10% | |
| -3 | Armor Rating 31 32 33~34 35~36 37~38 39 40 | Vigor 1 2 2 3 4 5 5 | Headshot Damage Reduction 11% | ||
| Cleric | -2 | Armor Rating 28 29 30 31 32 33 34 | Will 1 1 1 2 2 3 3 | Headshot Damage Reduction 11% Undead Race Damage Bonus 5% 6% 6% 6% 7% 7% 8% | |
| Barbarian | -3 | Armor Rating 37 38 39~40 41~42 43~44 45 46 | Vigor 1 1 1 2 2 3 3 Strength 1 1 1 2 2 2 | Projectile Damage Reduction 0.9% Headshot Damage Reduction 13% | |
| Warlock | -2 | Armor Rating 25 26 27 28~29 30~31 32 33 | Headshot Damage Reduction 8% Outgoing Magical Healing Add 1 1 1 2 2 3 3 Magical Power 1 1 1 2 2 2 | ||
| Fighter Ranger Cleric Bard | -3 | Armor Rating 35 36 37~38 39~40 41~42 43 44 | Will 1 1 1 2 2 2 2 Knowledge 1 1 1 1 2 2 2 Resourcefulness 1 1 1 1 2 2 | Projectile Damage Reduction 0.9% Headshot Damage Reduction 14% | |
| Ranger | -2 | Armor Rating 25 26 27 28~29 30~31 32 33 | Agility 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Cleric | -2 | Armor Rating 28 29 30 31 32 33 34 | Will 1 1 1 2 2 3 3 | Headshot Damage Reduction 11% Demon Race Damage Bonus 5% 6% 6% 6% 7% 7% 8% | |
| Rogue | -2 | Armor Rating 25 26 27 28~29 30~31 32 33 | Agility 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Fighter Cleric | -3 | Armor Rating 33 34 35~36 37~38 39~40 41 42 | Strength 1 1 1 2 2 3 3 Vigor 1 1 1 2 2 2 | Projectile Damage Reduction 0.9% Headshot Damage Reduction 13% | |
| Rogue Warlock | -2 | Armor Rating 18 19 20 21~22 23~24 25 26 Magical Resistance 15 | Strength 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Rogue Warlock | -1 | Armor Rating 5 6 7 8 9 10 11 | Agility 1 1 1 2 2 2 2 Dexterity 1 1 1 1 2 2 2 Strength 1 1 1 1 2 2 | ||
| Fighter Ranger Cleric | -4 | Armor Rating 40 41 42~43 44~45 46~47 48 49 | Agility 1 1 1 2 2 3 3 Dexterity 1 1 1 2 2 2 | Projectile Damage Reduction 1.2% Headshot Damage Reduction 16% | |
| Rogue Bard | -2 | Armor Rating 21 22 23 24 25 26 27 | Strength 1 1 1 2 2 3 3 Dexterity 1 1 1 2 2 2 | Headshot Damage Reduction 8% | |
| Bard Druid | -2 | Armor Rating 26 27 28 29~30 31~32 33 34 | Strength 1 2 2 3 4 5 5 | Headshot Damage Reduction 8% | |
| Fighter Cleric | -5 | Armor Rating 57 58 59~60 61~62 63~64 65 66 | Vigor 1 1 1 2 2 3 3 Will 1 1 1 2 2 2 | Projectile Damage Reduction 2.1% Headshot Damage Reduction 24% | |
| Ranger Barbarian | -3 | Armor Rating 33 34 35 36 37 38 39 | Strength 1 1 1 2 2 3 3 | Headshot Damage Reduction 11% Headshot Damage Modifier 2.5% 3% 3% 3% 3.5% 3.5% 4% | |
| Barbarian | -3 | Armor Rating 37 38 39~40 41~42 43~44 45 46 | Agility 1 2 2 3 4 5 5 | Projectile Damage Reduction 2% Headshot Damage Reduction 15% | |
| Fighter | -4 | Armor Rating 48 49 50~51 52~53 54~55 56 57 | Will 1 2 2 3 4 5 5 | Projectile Damage Reduction 1.8% Headshot Damage Reduction 16% Action Speed 1.4% 1.4% 1.4% 1.6% 1.8% 2% 2.2% | |
| Barbarian | -5 | Armor Rating 50 51 52~53 54~55 56~57 58 59 | Agility 1 1 1 2 2 3 3 Dexterity 1 1 1 2 2 2 | Projectile Damage Reduction 2.1% Headshot Damage Reduction 18% | |
| Wizard Warlock | -2 | Armor Rating 20 21 22 23~24 25~26 27 28 | Headshot Damage Reduction 5% Magical Power 1 2 2 3 4 5 5 | ||
| -2 | Armor Rating 20 21 22 23 24 25 26 | Vigor 1 1 1 2 2 2 2 Dexterity 1 1 1 1 2 2 2 Agility 1 1 1 1 2 2 | Headshot Damage Reduction 5% |
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 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