| 🌟 | 現在、 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
モジュール:DPSTable
ナビゲーションに移動
検索に移動
このモジュールについての説明文ページを モジュール:DPSTable/doc に作成できます
local p = {}
local cfg = mw.loadData('Module:DPSTable/configuration')
local aw = require('Module:Utility/Library')
local apex = require('Module:Utility/ApexLibrary')
local iu = require('Module:Utility/Image')
local Shield = require('Module:Stat/Shield')
local table = require('Module:TableExtensions')
local getArgs -- lazily initialized
-- Define values
local fromtoValues = {
damage = 20,
firerate = 10,
pellets = 1,
head = 2,
legs = 0.75,
}
local fromtoStringValues = {
shieldpreset = 'removelowprofile',
}
local booleanValues = {
round = false,
}
local stringValues = {
lang = 'ja',
}
-- Calc the scales
local function calcScales(opts)
local ret = {
hed0_fm = opts.args.head_from,
hed1_fm = opts.shld_fm.helmets.level1.func(opts.args.head_from),
hed2_fm = opts.shld_fm.helmets.level2.func(opts.args.head_from),
hed3_fm = opts.shld_fm.helmets.level3.func(opts.args.head_from),
body_fm = 1,
legs_fm = opts.args.legs_from,
hed0_to = opts.args.head_to,
hed1_to = opts.shld_to.helmets.level1.func(opts.args.head_to),
hed2_to = opts.shld_to.helmets.level2.func(opts.args.head_to),
hed3_to = opts.shld_to.helmets.level3.func(opts.args.head_to),
body_to = 1,
legs_to = opts.args.legs_to,
}
return ret
end
-- Calc the damages
local function calcBaseDamages(scales, opts)
local ret = {
hed0_fm = apex.calcPartDamage(opts.args.damage_from, scales.hed0_fm),
hed1_fm = apex.calcPartDamage(opts.args.damage_from, scales.hed1_fm),
hed2_fm = apex.calcPartDamage(opts.args.damage_from, scales.hed2_fm),
hed3_fm = apex.calcPartDamage(opts.args.damage_from, scales.hed3_fm),
body_fm = opts.args.damage_from,
legs_fm = apex.calcPartDamage(opts.args.damage_from, scales.legs_fm),
hed0_to = apex.calcPartDamage(opts.args.damage_to, scales.hed0_to),
hed1_to = apex.calcPartDamage(opts.args.damage_to, scales.hed1_to),
hed2_to = apex.calcPartDamage(opts.args.damage_to, scales.hed2_to),
hed3_to = apex.calcPartDamage(opts.args.damage_to, scales.hed3_to),
body_to = opts.args.damage_to,
legs_to = apex.calcPartDamage(opts.args.damage_to, scales.legs_to),
}
return ret
end
-- Apply perk scale to base damage as DPS
local function applyPerkToDamages(damages, fmperk, toperk, opts)
if fmperk ~= 1 then
if toperk ~= 1 then
return table.map(damages, function(key, damage)
if aw.stringends(key, '_to') then
return apex.calcPassiveDamage(damage, toperk, { round = opts.args.round })
else
return apex.calcPassiveDamage(damage, fmperk, { round = opts.args.round })
end
end)
else
return table.map(damages, function(key, damage)
if aw.stringends(key, '_to') then
return damage
else
return apex.calcPassiveDamage(damage, fmperk, { round = opts.args.round })
end
end)
end
elseif toperk ~= 1 then
return table.map(damages, function(key, damage)
if aw.stringends(key, '_to') then
return apex.calcPassiveDamage(damage, toperk, { round = opts.args.round })
else
return damage
end
end)
else
return damages
end
end
-- Calc DPSs
local function calcDPSs(damages, opts)
return table.map(damages, function(key, damage)
if aw.stringends(key, '_to') then
return damage * opts.args.firerate_to * opts.args.pellets_to
else
return damage * opts.args.firerate_from * opts.args.pellets_from
end
end)
end
-- Render the cell node base
local function getRenderCellFunction(tag, prefix)
return function(row, suffix, fmval, toval, opts, colspan)
colspan = colspan or 1
local text
if fmval ~= toval then
if fmval <= 0 then
local key = string.format('%s_ft%s_lastonly', prefix, suffix)
text = string.format(opts.cfg[key], toval)
elseif toval <= 0 then
local key = string.format('%s_ft%s_firstonly', prefix, suffix)
text = string.format(opts.cfg[key], fmval)
else
local key = string.format('%s_ft%s', prefix, suffix)
text = string.format(opts.cfg[key], fmval, toval)
end
else
local key = prefix .. suffix
text = string.format(opts.cfg[key], fmval)
end
local cell = row:tag(tag)
if colspan > 1 then
cell:attr('colspan', colspan)
end
cell:wikitext(text)
end
end
-- Render the header cell node
local renderHeaderCell = getRenderCellFunction('th', 'part')
-- Render the header node
local function renderHeaderRow(tbl, scales, opts)
local header = tbl:tag('tr')
:tag('th'):wikitext('DPS'):done()
if not opts.shld_fm.helmets.level0.disabled or not opts.shld_to.helmets.level0.disabled then
renderHeaderCell(header, '_head', scales.hed0_fm, scales.hed0_to, opts)
end
renderHeaderCell(header, '_head_lvl1', scales.hed1_fm, scales.hed1_to, opts)
renderHeaderCell(header, '_head_lvl2', scales.hed2_fm, scales.hed2_to, opts)
renderHeaderCell(header, '_head_lvl3', scales.hed3_fm, scales.hed3_to, opts)
if opts.nolegs then
header:tag('th'):wikitext(opts.cfg.part_bodylegs)
else
header:tag('th'):wikitext(opts.cfg.part_body)
renderHeaderCell(header, '_legs', scales.legs_fm, scales.legs_to, opts)
end
end
-- Render the cell node
local renderCell = getRenderCellFunction('td', 'format')
-- Render the row node
local function renderRow(tbl, suffix, damages, fmperk, toperk, opts)
local perkDamages = applyPerkToDamages(damages, fmperk, toperk, opts)
local dps = calcDPSs(perkDamages, opts)
local row = tbl:tag('tr')
local name
if fmperk ~= toperk then
local key = string.format('perk_ft%s', suffix)
name = string.format(opts.cfg[key], 100 * (fmperk - 1), 100 * (toperk - 1))
else
local key = string.format('perk%s', suffix)
name = string.format(opts.cfg[key], 100 * (fmperk - 1))
end
row:tag('th'):wikitext(name)
if opts.shld_fm.helmets.level0.disabled then
if not opts.shld_to.helmets.level0.disabled then
renderCell(row, '', -1, dps.hed0_to, opts)
end
elseif opts.shld_to.helmets.level0.disabled then
renderCell(row, '', dps.hed0_fm, -1, opts)
else
renderCell(row, '', dps.hed0_fm, dps.hed0_to, opts)
end
renderCell(row, '_head_lvl1', dps.hed1_fm, dps.hed1_to, opts)
renderCell(row, '_head_lvl2', dps.hed2_fm, dps.hed2_to, opts)
renderCell(row, '_head_lvl3', dps.hed3_fm, dps.hed3_to, opts)
if opts.nolegs then
renderCell(row, '', dps.body_fm, dps.body_to, opts)
elseif dps.body_fm == dps.legs_fm and dps.body_to == dps.legs_to then
renderCell(row, '', dps.body_fm, dps.body_to, opts, 2)
else
renderCell(row, '', dps.body_fm, dps.body_to, opts)
renderCell(row, '', dps.legs_fm, dps.legs_to, opts)
end
end
-- Render the table
function p.renderTable(opts)
local scales = calcScales(opts)
local damages = calcBaseDamages(scales, opts)
local tbl = mw.html.create('table')
:addClass('numbertable')
:addClass('patchnotetable')
:addClass('wikitable')
-- Header
renderHeaderRow(tbl, scales, opts)
-- Normal
renderRow(tbl, '_normal', damages, 1, 1, opts)
-- Low Profile
if opts.shld_fm.lowprofile > 1 or opts.shld_to.lowprofile > 1 then
renderRow(tbl, '_lowprofile', damages, opts.shld_fm.lowprofile, opts.shld_to.lowprofile, opts)
end
-- Fortified
if opts.shld_fm.fortified < 1 or opts.shld_to.fortified < 1 then
renderRow(tbl, '_fortified', damages, opts.shld_fm.fortified, opts.shld_to.fortified, opts)
end
return tbl
end
function p._main(args)
args = args or {}
-- Fix arguments
for key, value in pairs(fromtoValues) do
local fromKey = key .. '_from'
args[fromKey] = aw.getAsNumber(args[fromKey], aw.getAsNumber(args[key], value))
local toKey = key .. '_to'
args[toKey] = aw.getAsNumber(args[toKey], aw.getAsNumber(args[key], value))
end
for key, value in pairs(fromtoStringValues) do
local fromKey = key .. '_from'
args[fromKey] = args[fromKey] or args[key] or value
local toKey = key .. '_to'
args[toKey] = args[toKey] or args[key] or value
end
for key, value in pairs(booleanValues) do
args[key] = aw.getAsBoolean(args[key], value)
end
for key, value in pairs(stringValues) do
args[key] = args[key] or value
end
-- Load data
local opts = {
args = args,
cfg = cfg[args.lang],
shld_fm = Shield[args.shieldpreset_from],
shld_to = Shield[args.shieldpreset_to],
nolegs = not (args.legs_from > 0 and args.legs_from < 1 and args.legs_to > 0 and args.legs_to < 1),
}
-- Render the table node
local node = p.renderTable(opts)
return tostring(node)
end
function p.main(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
args = getArgs(frame)
return p._main(args, frame)
end
return p