Documentation for this module may be created at Module:Tier category/doc
--<pre>
--Implements [[Template:Tier category]]
local p = {}
local tier, f_tank, f_pow, f_hyb, lp_bod, lp_shield
--data for the tables
--doesn't really need to be a separate page, since every single thing here is used (so basically no saving from mw.loadData)
local data = {
head = {
name = 'Head', --name of slot to go into th
armour = 0.2, --armour multiplier
lifepoints = 20, --lifepoints multiplier
damagebonus = 0.25, --damage bonus multiplier (not weapon damage)
},
body = {
name = 'Body',
armour = 0.23,
lifepoints = 40,
damagebonus = 0.375,
},
legs = {
name = 'Legs',
armour = 0.22,
lifepoints = 30,
damagebonus = 0.3125,
},
hands = {
name = 'Hands',
armour = 0.05,
lifepoints = 0, --0 shows a 0 in the column; missing/nil shows NA
damagebonus = 0.15625,
},
feet = {
name = 'Feet',
armour = 0.05,
lifepoints = 0,
damagebonus = 0.15625,
},
--total = {
-- name = 'Total',
-- armour = 0.75, -- total armor (head + body + legs + hands + feet)
-- damagebonus = 1.25, -- same as above
-- lifepoints = 90, -- same as above
-- },
shield = {
name = 'Shield',
armour = 0.2,
lifepoints = 35,
damagebonus = -1, -- damagebonus = -1 => N/A in 2 columns (power armour)
},
cape = {
name = 'Cape',
armour = 0.03,
damagebonus = -1,
},
ring = {
name = 'Ring',
armour = 0.02,
damagebonus = -1,
},
shieldbow = {
name = 'Shieldbow',
armour = 0.2,
lifepoints = 35,
damagebonus = -1,
average = 5.3,
ability = 9.6, --ability damage
nohybrid = true, --no hybrid variants available, put NA
},
defender = { --all for the reworked defenders
name = 'Defender',
armour = 0.2/2,
lifepoints = 35/2,
damagebonus = -1,
fastest = 2.4,
nohybrid = true,
},
mainhand = {
name = 'Main-hand',
fastest = 9.6, --damage multipliers at each speed
fast = 12.25, --if missing, defaults to NA
average = 14.9,
},
offhand = {
name = 'Off-hand',
fastest = 4.8,
fast = 6.125,
average = 7.45,
},
twohand = {
name = 'Two-handed',
fastest = 14.4,
fast = 18.375,
average = 22.35,
},
dualwield = {
name = 'Dual-wielding',
note = 'Wielding a main and off-hand of the same tier and matching speeds (excluding ability damage).', --hover note
ital = true, --make it italic
fastest = 14.4,
fast = 18.375,
average = 22.35,
},
armour_order = {
'head', 'body', 'legs', 'hands', 'feet', 'cape', 'ring', 'shield', 'shieldbow', 'defender',
},
weapon_order = {
'mainhand', 'offhand', 'dualwield', 'twohand', 'shieldbow', 'defender',
},
}
-- add a vertical separator
local function sep(tr, rows)
tr:tag('th')
:css('width', '3px')
:attr('rowspan', rows)
:wikitext(' ')
:done()
end
--adds hover text
local function hover(td, txt, hovertxt)
td :attr('title', hovertxt)
:css('cursor', 'help')
:tag('span')
:css('border-bottom', '1px black dotted')
:wikitext(txt)
:done()
:done()
end
--formats the cell into a N/A cell
local function na(td, cols)
td :addClass('table-na')
:wikitext('N/A')
if cols and cols > 1 then
td:attr('colspan', cols)
end
td:done()
end
--the armour value function (also applies to accuracy)
local function armourfunc(t)
local r = 2.5 * (t^3/1250 + 4*t + 40)
if r > 0 then
return r
else
return 0
end
end
--create a row in the armour table
local function make_armour_row(table, name)
local v = data[name]
local tr = table:tag('tr')
local namestr = v.name
--name
if v.ital then
namestr = "''" .. namestr .. "''"
end
if v.note then
hover(tr:tag('th'), namestr, v.note)
else
tr :tag('th')
:wikitext(namestr)
:done()
end
--tank armour
tr :tag('td')
:wikitext(math.floor(v.armour * f_tank))
:done()
--tank LP
if v.lifepoints == nil then
na(tr:tag('td'))
elseif name == 'shield' then
tr :tag('td')
:wikitext(v.lifepoints * lp_shield)
:done()
else
tr :tag('td')
:wikitext(v.lifepoints * lp_bod)
:done()
end
-- power armour
if v.damagebonus == -1 then
na(tr:tag('td'), 2) --N/A both cells if -1
else
--power armour value
tr :tag('td')
:wikitext(math.floor(v.armour * f_pow))
:done()
--power damage bonus
:tag('td')
:wikitext(math.floor(v.damagebonus * tier))
:done()
end
--hybrid
if v.nohybrid then
na(tr:tag('td'))
else
tr :tag('td')
:wikitext(math.floor(v.armour * f_hyb))
:done()
end
end
--create a row in the weapon table
local function make_weapon_row(table, name, acc)
local v = data[name]
local tr = table:tag('tr')
local namestr = v.name
--name
if v.ital then
namestr = "''" .. namestr .. "''"
end
if v.note then
hover(tr:tag('th'), namestr, v.note)
else
tr :tag('th')
:wikitext(namestr)
:done()
end
--accuracy, only if acc is true
if acc then
tr :tag('td')
:attr('rowspan', 6)
:wikitext(math.floor(armourfunc(tier)))
:done()
end
--fastest damage
if v.fastest then
tr :tag('td')
:wikitext(math.floor(v.fastest * tier))
:done()
else
na(tr:tag('td'))
end
--fast damage
if v.fast then
tr :tag('td')
:wikitext(math.floor(v.fast * tier))
:done()
else
na(tr:tag('td'))
end
--average damage
if v.average then
tr :tag('td')
:wikitext(math.floor(v.average * tier))
:done()
else
na(tr:tag('td'))
end
--ability damage
if v.ability then
tr :tag('td')
:wikitext(math.floor(v.ability * tier))
:done()
else
tr :tag('td')
:wikitext(math.floor(v.fastest * tier))
:done()
end
end
--make the tables
local function make_tables()
local armour = mw.html.create('table')
local _tr
--calculate the basic armour value, before slot multipliers, for each type
f_tank, f_pow, f_hyb = armourfunc(tier), armourfunc(tier-5), armourfunc(tier-15)
--life point values
lp_bod, lp_shield = (tier >= 80 and tier - 69) or 0, (tier >= 70 and tier - 69) or 0
--create table and caption
armour:addClass('wikitable')
:css('text-align', 'center')
:tag('caption')
:wikitext('Tier ' .. tier .. ' armour stats')
:done()
_tr = armour:tag('tr')
:tag('th')
:attr('rowspan', 2)
:wikitext('Slot')
:done()
:tag('th')
:attr('colspan', 2)
:wikitext('Tank')
:done()
sep(_tr, 12)
_tr :tag('th')
:attr('colspan', 2)
:wikitext('Power')
:done()
sep(_tr, 12)
_tr :tag('th')
:wikitext('Hybrid/All')
:done()
:done()
armour :tag('tr')
:tag('th')
:wikitext('Armour')
:done()
:tag('th')
:wikitext('Life points')
:done()
:tag('th')
:wikitext('Armour')
:done()
:tag('th')
:wikitext('Damage')
:done()
:tag('th')
:wikitext('Armour')
:done()
:done()
:done()
--add all the slots in order
for _, i in ipairs(data.armour_order) do
make_armour_row(armour,i)
end
armour:done()
--move on to weapons
local weapons = mw.html.create('table')
weapons:addClass('wikitable')
:css('text-align', 'center')
:tag('caption')
:wikitext('Tier ' .. tier .. ' weapon stats')
:done()
weapons:tag('tr')
:tag('th')
:attr('rowspan', 2)
:wikitext('Type')
:done()
:tag('th')
:attr('rowspan', 2)
:wikitext('Accuracy')
:done()
:tag('th')
:attr('colspan', 5)
:wikitext('Damage')
:done()
_tr = weapons :tag('tr')
:tag('th')
:wikitext('Fastest')
:done()
:tag('th')
:wikitext('Fast')
:done()
:tag('th')
:wikitext('Average')
:done()
sep(_tr, 7)
hover(_tr:tag('th'), 'Ability', 'Ability damage is the damage value used by abilities, scaled by speed such that all weapons of the same tier and handedness have the same ability damage.')
_tr:done()
--add all the weapon types in order
for n, i in ipairs(data.weapon_order) do
make_weapon_row(weapons, i, n==1)
end
weapons:done()
--footer with notes
local footer = mw.html.create('span'):css('font-size', 'smaller')
:wikitext("Values may differ by ±1 due to rounding errors, either here or in-game. For a full list of stats at every tier, see [[Calculator:Combat stats]].")
:done()
return tostring(armour) .. '\n' .. tostring(weapons) .. '\n' .. tostring(footer)
end
--accessor for just the table
function p.table(frame)
local args = frame:getParent().args
_, _, tier = string.find(mw.title.getCurrentTitle().text, 'Tier (%d+) equipment')
tier = args.tier or args[1] or tier or 1
tier = tonumber(tier)
return make_tables()
end
--main accessor for the preamble and category generation
function p.main(frame)
local t = p.table(frame)
local c = ''
local tierstr
local intro = "This category contains all '''tier " .. tier .. " equipment'''. Tier is based on the stats a piece of equipment has, and is usually (but not necessarily always) the requirement to use it. The tier-based stats of the items in this category are given by the following tables; however, the items may have additional bonuses which are unrelated to tier. ''For more details on tier, see [[equipment tier]].''"
if mw.title.getCurrentTitle().namespace == 14 then
if tier < 10 then
tierstr = '00' .. tostring(tier)
elseif tier < 100 then
tierstr = '0' .. tostring(tier)
else
tierstr = tostring(tier)
end
c = '[[Category:Equipment by tier|Tier ' .. tierstr .. ' equipment]]' --SORTKEY SUPER IMPORTANT DO NOT FORGET
end
return intro .. '\n' .. t .. c
end
return p