From Dark and Darker Wiki
No edit summary |
(Abandoning module inheritance for now. Doing the dumb way of having a manual category argument handle the differences in infoboxes.) |
||
| Line 4: | Line 4: | ||
local WD = mw.loadJsonData("Data:Weapon.json") | local WD = mw.loadJsonData("Data:Weapon.json") | ||
local concat = table.concat | local concat = table.concat | ||
local function count(t) | |||
local c = 0 | |||
for _,_ in pairs(t) do c = c + 1 end | |||
return c | |||
end | |||
local function search(t,v) | |||
for ind,val in ipairs(t) do | |||
if v == val then return true end | |||
end | |||
return false | |||
end | |||
function p:hline() | function p:hline() | ||
| Line 72: | Line 85: | ||
local function panel(rarity, args) | local function panel(rarity, args) | ||
if not WD.Weapon[args.name].rarities | if not search(WD.Weapon[args.name].rarities,rarity) then return "" end | ||
args.rarity = rarity | args.rarity = rarity | ||
local hidden_panel = "cardtabs__panel--js-hidden" | local hidden_panel = "cardtabs__panel--js-hidden" | ||
if args.is_active==rarity then hidden_panel = "" end | if args.is_active==rarity then hidden_panel = "" end | ||
return string.format("<div data-cardtabs-panel='%s' style='overflow:auto' class='cardtabs__panel %s'>%s</div>", rarity, hidden_panel, infobox(args)) | return string.format("<div data-cardtabs-panel='%s' style='overflow:auto' class='cardtabs__panel %s'>%s</div>", rarity, hidden_panel, infobox(args)) | ||
end | end | ||
| Line 98: | Line 111: | ||
local function button(rarity, args) | local function button(rarity, args) | ||
if not WD.Weapon[args.name].rarities | if not search(WD.Weapon[args.name].rarities,rarity) then return "" end | ||
local is_active_button = "" | local is_active_button = "" | ||
| Line 117: | Line 130: | ||
wt[#wt+1] = button("8", args) | wt[#wt+1] = button("8", args) | ||
wt[#wt+1] = "</div>" | wt[#wt+1] = "</div>" | ||
end | |||
local function stat_block(wt, weapon, args) | |||
if count(weapon.stats.order) == 0 or weapon.numenchants[args.rarity] == 0 then return end | |||
wt[#wt+1] = "<div style='text-align:center'>" | |||
for i,stat_name in ipairs(weapon.stats.order) do | |||
if i==1 then wt[#wt+1] = "<div style='margin-top:10px;display:flex;width:100%;flex-direction:row;justify-content:space-between'>" | |||
else wt[#wt+1] = "<div style='display:flex;width:100%;flex-direction:row;justify-content:space-between'>" end | |||
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div>" | |||
wt[#wt+1] = string.format("<div>%s %s</div>",stat_name,weapon.stats[(stat_name):lower()][tonumber(args.rarity)] or weapon.stats[(stat_name):lower()]) | |||
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div></div>" | |||
end | |||
if weapon.numenchants[tonumber(args.rarity)] then | |||
wt[#wt+1] = "<div class='cr4' style='margin-top:10px;display:flex; width:100%;flex-direction:row; justify-content:space-between'>" | |||
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div>" | |||
wt[#wt+1] = string.format("<div>Up to %i extra enchantments</div>",weapon.numenchants[tonumber(args.rarity)]) | |||
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div></div>" | |||
end | |||
if weapon.haspassive then | |||
wt[#wt+1] = "<div style='margin-top:10px;display:flex;width:100%;flex-direction:row;justify-content:space-between;color:rgb(211,178,125)'>" | |||
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div>" | |||
wt[#wt+1] = string.format("<div>%s</div>",weapon.artifactpower) | |||
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div></div>" | |||
end | |||
wt[#wt+1] = "</div>" | |||
end | |||
local function class_list(list) | |||
local ret = "" | |||
for i,v in ipairs(list) do | |||
if i~=1 then ret = ret.."," end | |||
ret = ret..v | |||
end | |||
end | |||
local function type_list(t,type) | |||
local ret = "" | |||
for k,v in pairs(t) do | |||
if v==type then ret=ret..k end | |||
end | |||
return ret | |||
end | |||
function p:getRows(args) | |||
local rows = {} | |||
local weapon = WD.Weapon[args.name] | |||
rows[#rows+1] = self:hline() | |||
stat_block(rows,weapon,args) | |||
rows[#rows+1] = self:hline() | |||
rows[#rows+1] = self:row_v("Required Class",class_list(weapon.classes)) | |||
rows[#rows+1] = self:row_h("Weapon Type",type_list(weapon.types,"Weapon")) | |||
rows[#rows+1] = self:row_h("Utility Type",type_list(weapon.types,"Utility")) | |||
rows[#rows+1] = self:row_h("Slot Type",weapon.slottype) | |||
rows[#rows+1] = self:row_h("Hand Type",weapon.handtype) | |||
rows[#rows+1] = self:row_h("Reload Speed",weapon.reloadtime) | |||
rows[#rows+1] = self:row_h("Quiver Size",weapon.maxammocount) | |||
rows[#rows+1] = self:hline() | |||
rows[#rows+1] = self:row_h("Hitbox",string.format("%sx%sx%s",weapon.hitbox.height,weapon.hitbox.width,weapon.hitbox.depth)) | |||
rows[#rows+1] = self:hline() | |||
rows[#rows+1] = self:row_v2(string.format("[[File:%sx%sInvSlot.jpg]]",weapon.invwidth,weapon.invheight)) | |||
rows[#rows+1] = self:row_h("Gear Score",weapon.gearscore[args.rarity]) | |||
rows[#rows+1] = self:row_h("Sell Price",weapon.sellprices[args.rarity]) | |||
rows[#rows+1] = self:row_h("Stack Size",weapon.maxcount) | |||
rows[#rows+1] = self:hline() | |||
rows[#rows+1] = self:row_v3(weapon.flavortext) | |||
return rows | |||
end | end | ||
| Line 127: | Line 215: | ||
return concat(wt) | return concat(wt) | ||
end | end | ||
| Line 139: | Line 221: | ||
--[=[ | --[=[ | ||
mw.log(p.draw({args={name="Halberd",link="nolink"}})) | mw.log(p.draw({args={name="Halberd",link="nolink"}})) | ||
mw.log(p.draw({args={name="Halberd"}})) | mw.log(p.draw({args={name="Halberd",is_active="2"}})) | ||
mw.log(p.draw({args={name="Cinder",is_active="8"}})) | |||
]=] | ]=] | ||
Revision as of 05:11, 23 March 2026
Overview
Functions for making Iconbox table. Data comes from various data jsons: Data:Weapon.json, Data:Armor.json, Data:Accessory.json, Data:Utility.json, Data:Misc.json, Data:Monster.json, Data:Prop.json.
Functions
draw
Creates an iconbox that floats to the right.
Parameters
- name - <Name>
- is_active - {1,2,3,4,5,6,7,8,Common,Elite,Nightmare}
- category - {Weapon,Armor,Accessory,Utility,Misc,Monster,Prop}
draw examples
Halberd,7,Weapon
{{#invoke:Infobox|draw|name=Halberd|category=Weapon}}
-
Physical Base Weapon Damage 46~47
-
-
Move Speed -45
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.68x15.84x2.25
Stack Size:
1
A two handed pole-arm with a long reach, devised with an axe blade containing a sharp spike firmly fasted to the end.
-
Physical Base Weapon Damage 48~49
-
-
Move Speed -45
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.68x15.84x2.25
Stack Size:
1
A two handed pole-arm with a long reach, devised with an axe blade containing a sharp spike firmly fasted to the end.
-
Physical Base Weapon Damage 50~51
-
-
Move Speed -45
-
-
Up to 1 extra enchantments
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.68x15.84x2.25
Stack Size:
1
A two handed pole-arm with a long reach, devised with an axe blade containing a sharp spike firmly fasted to the end.
-
Physical Base Weapon Damage 52~53
-
-
Move Speed -45
-
-
Up to 2 extra enchantments
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.68x15.84x2.25
Stack Size:
1
A two handed pole-arm with a long reach, devised with an axe blade containing a sharp spike firmly fasted to the end.
-
Physical Base Weapon Damage 54~55
-
-
Move Speed -45
-
-
Up to 3 extra enchantments
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.68x15.84x2.25
Stack Size:
1
A two handed pole-arm with a long reach, devised with an axe blade containing a sharp spike firmly fasted to the end.
-
Physical Base Weapon Damage 56~57
-
-
Move Speed -45
-
-
Up to 4 extra enchantments
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.68x15.84x2.25
Stack Size:
1
A two handed pole-arm with a long reach, devised with an axe blade containing a sharp spike firmly fasted to the end.
-
Physical Base Weapon Damage 58~59
-
-
Move Speed -45
-
-
Up to 1 extra enchantments
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.68x15.84x2.25
Stack Size:
1
A two handed pole-arm with a long reach, devised with an axe blade containing a sharp spike firmly fasted to the end.
Cinder,8,Weapon
{{#invoke:Infobox|draw|name=Cinder|is_active=8|category=Weapon}}
-
Physical Base Weapon Damage 60~61
-
-
Move Speed -45
-
-
Up to 5 extra enchantments
-
-
Successful weapon attacks sears the target for 10
Fire Magical Base Damage (100% Scaling) and burns them for 27
Fire Magical Base Damage (50% Scaling) over 9 seconds.
-
Weapon Type:
Polearm
Utility Type:
Slot Type:
Main-Hand
Hand Type:
Two Handed
Reload Speed:
Quiver Size:
0
Hitbox:
119.7x15.84x2.14
Stack Size:
1
It will be difficult to keep track of your kill count for they have all been reduced to a pile of ash.
Ranger Hood,5,Armor
{{#invoke:Infobox|draw|name=Ranger Hood|is_active=5|category=Armor}}
Lua error at line 113: attempt to index field '?' (a nil value).
Code
local p = {}
p.__index = p
local WD = mw.loadJsonData("Data:Weapon.json")
local concat = table.concat
local function count(t)
local c = 0
for _,_ in pairs(t) do c = c + 1 end
return c
end
local function search(t,v)
for ind,val in ipairs(t) do
if v == val then return true end
end
return false
end
function p:hline()
return "<div class='line' style='background-image:linear-gradient(to right,rgb(10,10,10),rgb(100,100,100),rgb(10,10,10))'></div>"
end
function p:row_h(title, content)
if not content then return "" end
return string.format("<div style='display:flex;flex-direction:row;justify-content:center;white-space:pre-wrap;color:rgb(160,160,140)'><div style='text-align:right; color:rgb(70,70,70)'>%s: </div><div>%s</div></div>", title, content)
end
function p:row_v(title, content)
if not content then return "" end
return string.format("<div style='display:flex;flex-direction:column;align-items:center;color:rgb(160,160,140);margin-bottom:5px'><div style='color:rgb(70,70,70)'>%s: </div><div>%s</div></div>", title, content)
end
function p:row_v2(content)
if not content then return "" end
return string.format("<div style='display:flex;margin-top:10px;flex-direction:column;align-items:center;text-align:center;margin-bottom:15px'>%s</div>",content)
end
function p:row_v3(content)
if not content then return "" end
return string.format("<div style='display:flex;flex-direction:column;align-items:center;text-align:center;color:rgb(115,83,67)'>%s</div>",content)
end
local function header(args)
local header_content = ""
if args.link == "nolink" then
header_content = string.format("<span class='bold cr%s'>%s</span>", args.rarity, args.name)
elseif args.link then
header_content = string.format("[[%s|<span class='cr%s'>%s</span>]]", args.link, args.rarity, args.name)
else
header_content = string.format("[[%s|<span class='cr%s'>%s</span>]]", args.name, args.rarity, args.name)
end
return string.format(
"<div class='itemboxheader' style='width:280px;padding:20px;box-shadow:inset 0px 0px 20px 5px rgb(0 0 0 / 0.5);display:flex;flex-direction:column;align-items:center;background-color:rgb(var(--rarity-%s),0.1);border:2px solid rgb(var(--rarity-%s),0.5)'><div class='bold' style='margin-top:0px!important;font-size:22px'>%s</div></div>",
args.rarity, args.rarity, header_content
)
end
local function image(args)
if not args.name then return end
return "<div style='display:flex;flex-direction:column;align-items:center'><div class='iconbox' style='width:max-content;align-items:center'><div class='rarity-1 rounded relative'>[[File:"..args.name..".png|90px|link=]]</div></div></div>"
end
local function infobox(args)
local wt = {}
wt[#wt+1] = "<div style='background-color:rgb(var(--background-color),0.3);max-width:470px;float:right'>" --Infobox container
wt[#wt+1] = header(args)
wt[#wt+1] = "<div style='width:280px;border:2px solid rgb(70,70,70,0.5);padding:20px'>" -- Content container
wt[#wt+1] = image(args)
-- Category-specific rows
local rows = p:getRows(args)
for _, row in ipairs(rows) do
wt[#wt+1] = row
end
wt[#wt+1] = "</div></div>"
return concat(wt)
end
local function panel(rarity, args)
if not search(WD.Weapon[args.name].rarities,rarity) then return "" end
args.rarity = rarity
local hidden_panel = "cardtabs__panel--js-hidden"
if args.is_active==rarity then hidden_panel = "" end
return string.format("<div data-cardtabs-panel='%s' style='overflow:auto' class='cardtabs__panel %s'>%s</div>", rarity, hidden_panel, infobox(args))
end
local function tab_panels(args, wt)
wt[#wt+1] = "<div class='mytabs__panels' data-cardtabs-panels>"
wt[#wt+1] = panel("1", args)
wt[#wt+1] = panel("2", args)
wt[#wt+1] = panel("3", args)
wt[#wt+1] = panel("4", args)
wt[#wt+1] = panel("5", args)
wt[#wt+1] = panel("6", args)
wt[#wt+1] = panel("7", args)
wt[#wt+1] = panel("8", args)
wt[#wt+1] = "</div>"
end
local ROMAN_NUMERAL = {"I","II","III","IV","V","VI","VII","VIII"}
local function button(rarity, args)
if not search(WD.Weapon[args.name].rarities,rarity) then return "" end
local is_active_button = ""
if args.is_active==rarity then is_active_button = " cardtabs__button--active" end
return string.format("<div data-cardtabs-btn='%s' class='cardtabs__button rarity%s%s'> %s </div>", rarity, rarity, is_active_button, ROMAN_NUMERAL[tonumber(rarity)])
end
local function tab_buttons(args, wt)
wt[#wt+1] = "<div class='cardtabs__buttons' data-cardtabs-btns>"
wt[#wt+1] = button("1", args)
wt[#wt+1] = button("2", args)
wt[#wt+1] = button("3", args)
wt[#wt+1] = button("4", args)
wt[#wt+1] = button("5", args)
wt[#wt+1] = button("6", args)
wt[#wt+1] = button("7", args)
wt[#wt+1] = button("8", args)
wt[#wt+1] = "</div>"
end
local function stat_block(wt, weapon, args)
if count(weapon.stats.order) == 0 or weapon.numenchants[args.rarity] == 0 then return end
wt[#wt+1] = "<div style='text-align:center'>"
for i,stat_name in ipairs(weapon.stats.order) do
if i==1 then wt[#wt+1] = "<div style='margin-top:10px;display:flex;width:100%;flex-direction:row;justify-content:space-between'>"
else wt[#wt+1] = "<div style='display:flex;width:100%;flex-direction:row;justify-content:space-between'>" end
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div>"
wt[#wt+1] = string.format("<div>%s %s</div>",stat_name,weapon.stats[(stat_name):lower()][tonumber(args.rarity)] or weapon.stats[(stat_name):lower()])
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div></div>"
end
if weapon.numenchants[tonumber(args.rarity)] then
wt[#wt+1] = "<div class='cr4' style='margin-top:10px;display:flex; width:100%;flex-direction:row; justify-content:space-between'>"
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div>"
wt[#wt+1] = string.format("<div>Up to %i extra enchantments</div>",weapon.numenchants[tonumber(args.rarity)])
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div></div>"
end
if weapon.haspassive then
wt[#wt+1] = "<div style='margin-top:10px;display:flex;width:100%;flex-direction:row;justify-content:space-between;color:rgb(211,178,125)'>"
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div>"
wt[#wt+1] = string.format("<div>%s</div>",weapon.artifactpower)
wt[#wt+1] = "<div style='padding:0px 5px' class='bold'>-</div></div>"
end
wt[#wt+1] = "</div>"
end
local function class_list(list)
local ret = ""
for i,v in ipairs(list) do
if i~=1 then ret = ret.."," end
ret = ret..v
end
end
local function type_list(t,type)
local ret = ""
for k,v in pairs(t) do
if v==type then ret=ret..k end
end
return ret
end
function p:getRows(args)
local rows = {}
local weapon = WD.Weapon[args.name]
rows[#rows+1] = self:hline()
stat_block(rows,weapon,args)
rows[#rows+1] = self:hline()
rows[#rows+1] = self:row_v("Required Class",class_list(weapon.classes))
rows[#rows+1] = self:row_h("Weapon Type",type_list(weapon.types,"Weapon"))
rows[#rows+1] = self:row_h("Utility Type",type_list(weapon.types,"Utility"))
rows[#rows+1] = self:row_h("Slot Type",weapon.slottype)
rows[#rows+1] = self:row_h("Hand Type",weapon.handtype)
rows[#rows+1] = self:row_h("Reload Speed",weapon.reloadtime)
rows[#rows+1] = self:row_h("Quiver Size",weapon.maxammocount)
rows[#rows+1] = self:hline()
rows[#rows+1] = self:row_h("Hitbox",string.format("%sx%sx%s",weapon.hitbox.height,weapon.hitbox.width,weapon.hitbox.depth))
rows[#rows+1] = self:hline()
rows[#rows+1] = self:row_v2(string.format("[[File:%sx%sInvSlot.jpg]]",weapon.invwidth,weapon.invheight))
rows[#rows+1] = self:row_h("Gear Score",weapon.gearscore[args.rarity])
rows[#rows+1] = self:row_h("Sell Price",weapon.sellprices[args.rarity])
rows[#rows+1] = self:row_h("Stack Size",weapon.maxcount)
rows[#rows+1] = self:hline()
rows[#rows+1] = self:row_v3(weapon.flavortext)
return rows
end
function p.draw(frame)
local wt = {}
wt[#wt+1] = "<div class='cardtabs' data-cardtabs>"
tab_buttons(frame.args, wt)
tab_panels(frame.args, wt)
wt[#wt+1] = "</div>"
return concat(wt)
end
return p
--[=[
mw.log(p.draw({args={name="Halberd",link="nolink"}}))
mw.log(p.draw({args={name="Halberd",is_active="2"}}))
mw.log(p.draw({args={name="Cinder",is_active="8"}}))
]=]
