| 🌟 | 現在、 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
「モジュール:WeaponInfobox/DPS」の版間の差分
ナビゲーションに移動
検索に移動
(空白の削除) |
(増幅モードやフルチャージDPSに対応) |
||
| 11行目: | 11行目: | ||
-- Constants | -- Constants | ||
local leftBorder = { | local leftBorder = { | ||
['border-left-width'] = '1px', | |||
['border-left-style'] = 'solid', | |||
} | |||
local leftBorderWithoutTopRightBorder = { | |||
['border-top'] = '0 none transparent', | |||
['border-right'] = '0 none transparent', | |||
['border-left-width'] = '1px', | ['border-left-width'] = '1px', | ||
['border-left-style'] = 'solid', | ['border-left-style'] = 'solid', | ||
| 132行目: | 138行目: | ||
local row = tbl:tag('tr') | local row = tbl:tag('tr') | ||
if aw.isNumberAndGreaterThanZero(opts.offset) then | if aw.isNumberAndGreaterThanZero(opts.offset) then | ||
row:tag('th') | for i = 1, opts.offset do | ||
:css('border', '0 none transparent') | local hasLeftBorder = opts.offsetStyles and opts.offsetStyles[i] and opts.offsetStyles[i].leftBorder | ||
if hasLeftBorder then | |||
row:tag('th') | |||
:css(leftBorderWithoutTopRightBorder) | |||
:wikitext(' ') | |||
else | |||
row:tag('th') | |||
:css('border', '0 none transparent') | |||
:wikitext(' ') | |||
end | |||
end | |||
end | end | ||
row:tag('th') | row:tag('th') | ||
| 180行目: | 196行目: | ||
local pellet = aw.getAsNumber(stat.pellet, 1) | local pellet = aw.getAsNumber(stat.pellet, 1) | ||
local useRound = aw.getAsBoolean(stat.damage.round, false) | local useRound = aw.getAsBoolean(stat.damage.round, false) | ||
local hasAnvil = proto.validateTypes(stat.anvil_receiver, AnvilReceiverProto) | local hasAnvil = proto.validateTypes(stat.anvil_receiver, AnvilReceiverProto) | ||
local hasShat = proto.validateTypes(stat.shatter_caps, ShatterCapsProto) | local hasShat = proto.validateTypes(stat.shatter_caps, ShatterCapsProto) | ||
local hasTempo = proto.validateTypes(stat.deadeyes_tempo, DeadeyesTempoWithRechamberProto) | local hasTempo = proto.validateTypes(stat.deadeyes_tempo, DeadeyesTempoWithRechamberProto) | ||
local hasHopup = hasAnvil or hasShat or hasTempo | local hasHopup = hasAnvil or hasShat or hasTempo | ||
local hasAmped = aw.isNumberAndGreaterThanZero(stat.damage.amped) | |||
local hasChgd = aw.isNumberAndGreaterThanZero(stat.damage.charged) | |||
local hasExtra = hasAmped or hasChgd | |||
-- Load firerate | -- Load firerate | ||
| 209行目: | 230行目: | ||
local hasMultiple = proto.validateTypes(firerate, MultipleFirerateProto) | local hasMultiple = proto.validateTypes(firerate, MultipleFirerateProto) | ||
local defopts, mpopts, huopts | local headerColspan | ||
local defopts, mpopts, huopts, exopts, ex2opts | |||
if hasMultiple then | if hasMultiple then | ||
defopts = { colspan = 2 } | if hasExtra then | ||
muopts = { offset = 1 } | headerColspan = 3 | ||
huopts | defopts = { colspan = 3 } | ||
muopts = { offset = 1, colspan = 2 } | |||
exopts = { offset = 2 } | |||
ex2opts = { offset = 2, offsetStyles = { nil, { leftBorder = true } } } | |||
else | |||
headerColspan = 2 | |||
defopts = { colspan = 2 } | |||
muopts = { offset = 1 } | |||
exopts = {} | |||
ex2opts = {} | |||
end | |||
huopts = {} | |||
elseif hasHopup then | elseif hasHopup then | ||
if hasExtra then | |||
headerColspan = 3 | |||
defopts = { colspan = 3 } | |||
huopts = { offset = 1, colspan = 2, hasLegs = damages.legs ~= 1 } | |||
exopts = { offset = 2 } | |||
ex2opts = { offset = 2, offsetStyles = { nil, { leftBorder = true } } } | |||
else | |||
headerColspan = 2 | |||
defopts = { colspan = 2 } | |||
huopts = { offset = 1, hasLegs = damages.legs ~= 1 } | |||
exopts = {} | |||
ex2opts = {} | |||
end | |||
muopts = {} | |||
elseif hasExtra then | |||
headerColspan = 1 | |||
defopts = { colspan = 2 } | defopts = { colspan = 2 } | ||
muopts = {} | muopts = {} | ||
huopts = { | huopts = {} | ||
exopts = {} | |||
ex2opts = { offset = 1 } | |||
else | else | ||
headerColspan = 1 | |||
defopts = {} | defopts = {} | ||
muopts = {} | muopts = {} | ||
huopts = {} | huopts = {} | ||
exopts = {} | |||
ex2opts = {} | |||
end | end | ||
| 243行目: | 297行目: | ||
firerate2 = calcRechamberRPS(stat.firerate, stat.deadeyes_tempo.firerate.single_rechamber) | firerate2 = calcRechamberRPS(stat.firerate, stat.deadeyes_tempo.firerate.single_rechamber) | ||
label = string.format(cfg.hopup.deadeyes_tempo, iu.hopup('deadeyes_tempo')) | label = string.format(cfg.hopup.deadeyes_tempo, iu.hopup('deadeyes_tempo')) | ||
end | |||
-- Extra damages | |||
local damagesE, labelE, damages2E | |||
if hasAmped then | |||
local extra = aw.shallowCopy(basic) | |||
extra.base = stat.damage.amped | |||
damagesE = getDamages(extra, shieldinfo.helmets) | |||
labelE = iu.item('シールドセル') | |||
elseif hasChgd then | |||
local extra = aw.shallowCopy(basic) | |||
extra.base = stat.damage.charged | |||
damagesE = getDamages(extra, shieldinfo.helmets) | |||
labelE = iu.scope('スロット') | |||
if hasShat then | |||
local shat2 = getStats(stat, stat.shatter_caps) | |||
shat2.base = stat.shatter_caps.damage.charged | |||
damages2E = getDamages(shat2, shieldinfo.helmets) | |||
end | |||
end | end | ||
| 249行目: | 323行目: | ||
-- Header | -- Header | ||
local header = tbl:tag('tr'):tag('th') | local header = tbl:tag('tr'):tag('th') | ||
:attrIf( | :attrIf(headerColspan > 1, { colspan = headerColspan }) | ||
:wikitext('') | :wikitext('') | ||
:done() | :done() | ||
| 278行目: | 352行目: | ||
local normalDPS = getDPSs(damages, 1, pellet, firerate, useRound) | local normalDPS = getDPSs(damages, 1, pellet, firerate, useRound) | ||
renderDPSRow(tbl, cfg.perk.normal, cfg.complex, normalDPS, defopts) | renderDPSRow(tbl, cfg.perk.normal, cfg.complex, normalDPS, defopts) | ||
end | |||
--- Extra | |||
if hasExtra then | |||
local extraDPS = getDPSs(damagesE, 1, pellet, firerate, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, extraDPS, exopts) | |||
end | end | ||
| 284行目: | 364行目: | ||
local hopupDPS = getDPSs(damages2, 1, pellet2, firerate2, useRound) | local hopupDPS = getDPSs(damages2, 1, pellet2, firerate2, useRound) | ||
renderDPSRow(tbl, label, cfg.complex, hopupDPS, huopts) | renderDPSRow(tbl, label, cfg.complex, hopupDPS, huopts) | ||
---- Extra | |||
if hasTempo and hasAmped then | |||
local tempoExtraDPS = getDPSs(damagesE, 1, pellet2, firerate2, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, tempoExtraDPS, ex2opts) | |||
elseif hasShat and hasChgd then | |||
local shatChargedDPS = getDPSs(damages2E, 1, pellet2, firerate2, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, shatChargedDPS, ex2opts) | |||
end | |||
end | end | ||
| 300行目: | 389行目: | ||
local lowprofileDPS = getDPSs(damages, shieldinfo.lowprofile, pellet, firerate, useRound) | local lowprofileDPS = getDPSs(damages, shieldinfo.lowprofile, pellet, firerate, useRound) | ||
renderDPSRow(tbl, cfg.perk.lowprofile, cfg.complex, lowprofileDPS, defopts) | renderDPSRow(tbl, cfg.perk.lowprofile, cfg.complex, lowprofileDPS, defopts) | ||
end | |||
--- Extra | |||
if hasExtra then | |||
local extraLowProfileDPS = getDPSs(damagesE, shieldinfo.lowprofile, pellet, firerate, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, extraLowProfileDPS, exopts) | |||
end | end | ||
| 306行目: | 401行目: | ||
local hopupLowProfileDPS = getDPSs(damages2, shieldinfo.lowprofile, pellet2, firerate2, useRound) | local hopupLowProfileDPS = getDPSs(damages2, shieldinfo.lowprofile, pellet2, firerate2, useRound) | ||
renderDPSRow(tbl, label, cfg.complex, hopupLowProfileDPS, huopts) | renderDPSRow(tbl, label, cfg.complex, hopupLowProfileDPS, huopts) | ||
---- Extra | |||
if hasTempo and hasAmped then | |||
local tempoAmpedLowProfileDPS = getDPSs(damagesE, shieldinfo.lowprofile, pellet2, firerate2, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, tempoAmpedLowProfileDPS, ex2opts) | |||
elseif hasShat and hasChgd then | |||
local shatChargedLowProfileDPS = getDPSs(damages2E, shieldinfo.lowprofile, pellet2, firerate2, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, shatChargedLowProfileDPS, ex2opts) | |||
end | |||
end | end | ||
end | end | ||
| 323行目: | 427行目: | ||
local lowprofileDPS = getDPSs(damages, shieldinfo.fortified, pellet, firerate, useRound) | local lowprofileDPS = getDPSs(damages, shieldinfo.fortified, pellet, firerate, useRound) | ||
renderDPSRow(tbl, cfg.perk.fortified, cfg.complex, lowprofileDPS, defopts) | renderDPSRow(tbl, cfg.perk.fortified, cfg.complex, lowprofileDPS, defopts) | ||
end | |||
--- Extra | |||
if hasExtra then | |||
local extraFortifiedDPS = getDPSs(damagesE, shieldinfo.fortified, pellet, firerate, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, extraFortifiedDPS, exopts) | |||
end | end | ||
| 329行目: | 439行目: | ||
local hopupFortifiedDPS = getDPSs(damages2, shieldinfo.fortified, pellet2, firerate2, useRound) | local hopupFortifiedDPS = getDPSs(damages2, shieldinfo.fortified, pellet2, firerate2, useRound) | ||
renderDPSRow(tbl, label, cfg.complex, hopupFortifiedDPS, huopts) | renderDPSRow(tbl, label, cfg.complex, hopupFortifiedDPS, huopts) | ||
---- Extra | |||
if hasTempo and hasAmped then | |||
local tempoAmpedFortifiedDPS = getDPSs(damagesE, shieldinfo.fortified, pellet2, firerate2, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, tempoAmpedFortifiedDPS, ex2opts) | |||
elseif hasShat and hasChgd then | |||
local shatChargedFortifiedDPS = getDPSs(damages2E, shieldinfo.fortified, pellet2, firerate2, useRound) | |||
renderDPSRow(tbl, labelE, cfg.complex, shatChargedFortifiedDPS, ex2opts) | |||
end | |||
end | end | ||
end | end | ||
2021年5月21日 (金) 16:39時点における版
このモジュールについての説明文ページを モジュール:WeaponInfobox/DPS/doc に作成できます
require('Module:Utility/mw.html Extensions')
local p = {}
local cfg = mw.loadData('Module:WeaponInfobox/configuration')
local aw = require('Module:Utility/Library')
local apex = require('Module:Utility/ApexLibrary')
local iu = require('Module:Utility/Image')
local proto = require('Module:Utility/Prototypes')
-- Constants
local leftBorder = {
['border-left-width'] = '1px',
['border-left-style'] = 'solid',
}
local leftBorderWithoutTopRightBorder = {
['border-top'] = '0 none transparent',
['border-right'] = '0 none transparent',
['border-left-width'] = '1px',
['border-left-style'] = 'solid',
}
-- Protos
local MinMaxProto = {
proto.NumberRange(0),
proto.NumberRange(0),
}
local MultipleFirerateProto = {
proto.NumberRange(0),
proto.NumberRange(0),
proto.NumberRange(0),
proto.NumberRange(0),
}
local AnvilReceiverProto = {
damage = {
base = proto.NumberRange(1),
headshot = proto.NumberRange(1, 10),
legshot = proto.NumberRange(0, 1),
},
firerate = {
single = proto.NumberRange(0),
},
}
local ShatterCapsProto = {
damage = {
base = proto.NumberRange(1),
headshot = proto.NumberRange(1, 10),
legshot = proto.NumberRange(0, 1),
},
pellet = proto.NumberRange(1),
}
local DeadeyesTempoWithRechamberProto = {
firerate = {
single_rechamber = proto.NumberRange(0),
},
}
local function calcBurstRPS(stat, delay)
delay = delay or stat.firerate.burst_delay
return stat.mode.burst / ((stat.mode.burst - 1) / stat.firerate.burst + delay)
end
local function calcRechamberRPS(firerate, rechamber)
rechamber = rechamber or firerate.single_rechamber
return 1 / (1 / firerate.single + rechamber)
end
local function getStats(stat1, stat2)
local ret
if stat2 then
ret = {
base = stat2.damage.base or stat1.damage.base,
head = stat2.damage.headshot or stat1.damage.headshot or 1.75,
legs = stat2.damage.legshot or stat1.damage.legshot or 0.75,
}
else
ret = {
base = stat1.damage.base,
head = stat1.damage.headshot or 1.75,
legs = stat1.damage.legshot or 0.75,
}
end
return ret
end
local function getDamages(stat, helmets)
local helmet = helmets.level0.disabled and helmets.level1 or helmets.level0
local ret
if stat.legs > 0 and stat.legs < 1 then
ret = {
aw.round(stat.legs * stat.base),
stat.base,
{
aw.round(helmets.level3.func(stat.head) * stat.base),
aw.round(helmet.func(stat.head) * stat.base),
},
}
else
ret = {
stat.base,
{
aw.round(helmets.level3.func(stat.head) * stat.base),
aw.round(helmet.func(stat.head) * stat.base),
},
}
end
return ret
end
local function getDPSs(damages, perk, pellets, firerate, useRound)
local ret = {}
for _, damage in ipairs(damages) do
if proto.validateTypes(damage, MinMaxProto) then
local minPerked = apex.calcPassiveDamage(damage[1], perk, { round = useRound })
local maxPerked = apex.calcPassiveDamage(damage[2], perk, { round = useRound })
table.insert(ret, { minPerked * firerate, pellets * maxPerked * firerate })
elseif pellets > 1 then
local perked = apex.calcPassiveDamage(damage, perk, { round = useRound })
table.insert(ret, { perked * firerate, pellets * perked * firerate })
else
local perked = apex.calcPassiveDamage(damage, perk, { round = useRound })
table.insert(ret, pellets * perked * firerate)
end
end
return ret
end
local function toDPSText(value, format)
if proto.validateTypes(value, MinMaxProto) then
return string.format(format, string.format("%.1f", value[1]), string.format("%.1f", value[2]))
else
return string.format("%.1f", value)
end
end
local function renderDPSRow(tbl, name, format, data, opts)
local row = tbl:tag('tr')
if aw.isNumberAndGreaterThanZero(opts.offset) then
for i = 1, opts.offset do
local hasLeftBorder = opts.offsetStyles and opts.offsetStyles[i] and opts.offsetStyles[i].leftBorder
if hasLeftBorder then
row:tag('th')
:css(leftBorderWithoutTopRightBorder)
:wikitext(' ')
else
row:tag('th')
:css('border', '0 none transparent')
:wikitext(' ')
end
end
end
row:tag('th')
:attrIf(aw.isNumber(opts.colspan), { colspan = opts.colspan })
:cssIf(aw.isNumberAndGreaterThanZero(opts.offset), leftBorder)
:wikitext(name)
if #data >= 3 then
if data[1] == nil then
row:tag('td')
:attr('align', 'center')
:addClass('disabled')
:wikitext('–')
else
row:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(toDPSText(data[1], format))
end
row
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(toDPSText(data[2], format))
:done()
:tag('td')
:attr('align', 'right')
:wikitext(toDPSText(data[3], format))
else
row
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:attrIf(opts.hasLegs, { colspan = 2 })
:wikitext(toDPSText(data[1], format))
:done()
:tag('td')
:attr('align', 'right')
:wikitext(toDPSText(data[2], format))
end
end
function p.renderDPS(stat, shieldinfo, lang)
local cfg = cfg[lang].dps
local basic = getStats(stat)
local damages = getDamages(basic, shieldinfo.helmets)
local pellet = aw.getAsNumber(stat.pellet, 1)
local useRound = aw.getAsBoolean(stat.damage.round, false)
local hasAnvil = proto.validateTypes(stat.anvil_receiver, AnvilReceiverProto)
local hasShat = proto.validateTypes(stat.shatter_caps, ShatterCapsProto)
local hasTempo = proto.validateTypes(stat.deadeyes_tempo, DeadeyesTempoWithRechamberProto)
local hasHopup = hasAnvil or hasShat or hasTempo
local hasAmped = aw.isNumberAndGreaterThanZero(stat.damage.amped)
local hasChgd = aw.isNumberAndGreaterThanZero(stat.damage.charged)
local hasExtra = hasAmped or hasChgd
-- Load firerate
local firerate
if aw.isNumber(stat.mode.burst) and stat.mode.burst > 1 then
firerate = calcBurstRPS(stat)
elseif stat.mode.auto then
firerate = stat.firerate.auto
elseif stat.mode.single then
if aw.isNumberAndGreaterThanZero(stat.firerate.single_rechamber) then
firerate = calcRechamberRPS(stat.firerate)
elseif proto.validateTypes(stat.firerate.single_rechamber, MultipleFirerateProto) then
firerate = {
calcRechamberRPS(stat.firerate, stat.firerate.single_rechamber[1]),
calcRechamberRPS(stat.firerate, stat.firerate.single_rechamber[2]),
calcRechamberRPS(stat.firerate, stat.firerate.single_rechamber[3]),
calcRechamberRPS(stat.firerate, stat.firerate.single_rechamber[4]),
}
else
firerate = stat.firerate.single
end
else
return nil
end
local hasMultiple = proto.validateTypes(firerate, MultipleFirerateProto)
local headerColspan
local defopts, mpopts, huopts, exopts, ex2opts
if hasMultiple then
if hasExtra then
headerColspan = 3
defopts = { colspan = 3 }
muopts = { offset = 1, colspan = 2 }
exopts = { offset = 2 }
ex2opts = { offset = 2, offsetStyles = { nil, { leftBorder = true } } }
else
headerColspan = 2
defopts = { colspan = 2 }
muopts = { offset = 1 }
exopts = {}
ex2opts = {}
end
huopts = {}
elseif hasHopup then
if hasExtra then
headerColspan = 3
defopts = { colspan = 3 }
huopts = { offset = 1, colspan = 2, hasLegs = damages.legs ~= 1 }
exopts = { offset = 2 }
ex2opts = { offset = 2, offsetStyles = { nil, { leftBorder = true } } }
else
headerColspan = 2
defopts = { colspan = 2 }
huopts = { offset = 1, hasLegs = damages.legs ~= 1 }
exopts = {}
ex2opts = {}
end
muopts = {}
elseif hasExtra then
headerColspan = 1
defopts = { colspan = 2 }
muopts = {}
huopts = {}
exopts = {}
ex2opts = { offset = 1 }
else
headerColspan = 1
defopts = {}
muopts = {}
huopts = {}
exopts = {}
ex2opts = {}
end
-- Hop-ups
local damages2, pellet2, firerate2, label
if hasAnvil then
local anvil = getStats(stat, stat.anvil_receiver)
damages2 = getDamages(anvil, shieldinfo.helmets)
pellet2 = pellet
firerate2 = stat.anvil_receiver.firerate.single
label = iu.hopup('anvil_receiver')
elseif hasShat then
local shat = getStats(stat, stat.shatter_caps)
damages2 = getDamages(shat, shieldinfo.helmets)
pellet2 = stat.shatter_caps.pellet
firerate2 = firerate
label = iu.hopup('shatter_caps')
elseif hasTempo then
damages2 = damages
pellet2 = pellet
firerate2 = calcRechamberRPS(stat.firerate, stat.deadeyes_tempo.firerate.single_rechamber)
label = string.format(cfg.hopup.deadeyes_tempo, iu.hopup('deadeyes_tempo'))
end
-- Extra damages
local damagesE, labelE, damages2E
if hasAmped then
local extra = aw.shallowCopy(basic)
extra.base = stat.damage.amped
damagesE = getDamages(extra, shieldinfo.helmets)
labelE = iu.item('シールドセル')
elseif hasChgd then
local extra = aw.shallowCopy(basic)
extra.base = stat.damage.charged
damagesE = getDamages(extra, shieldinfo.helmets)
labelE = iu.scope('スロット')
if hasShat then
local shat2 = getStats(stat, stat.shatter_caps)
shat2.base = stat.shatter_caps.damage.charged
damages2E = getDamages(shat2, shieldinfo.helmets)
end
end
local tbl = mw.html.create('table'):addClass('intable')
-- Header
local header = tbl:tag('tr'):tag('th')
:attrIf(headerColspan > 1, { colspan = headerColspan })
:wikitext('')
:done()
if #damages >= 3 then
header
:tag('th')
:wikitext(cfg.part.legs)
:tag('th')
:wikitext(cfg.part.body)
else
header:tag('th')
:wikitext(cfg.part.bodylegs)
end
header:tag('th')
:wikitext(cfg.part.head)
-- Normal
if hasMultiple then
local normalDPS0 = getDPSs(damages, 1, pellet, firerate[1], useRound)
local normalDPS1 = getDPSs(damages, 1, pellet, firerate[2], useRound)
local normalDPS2 = getDPSs(damages, 1, pellet, firerate[3], useRound)
local normalDPS3 = getDPSs(damages, 1, pellet, firerate[4], useRound)
renderDPSRow(tbl, cfg.perk.normal, cfg.complex, normalDPS0, defopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 1), cfg.complex, normalDPS1, muopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 2), cfg.complex, normalDPS2, muopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 3), cfg.complex, normalDPS3, muopts)
else
local normalDPS = getDPSs(damages, 1, pellet, firerate, useRound)
renderDPSRow(tbl, cfg.perk.normal, cfg.complex, normalDPS, defopts)
end
--- Extra
if hasExtra then
local extraDPS = getDPSs(damagesE, 1, pellet, firerate, useRound)
renderDPSRow(tbl, labelE, cfg.complex, extraDPS, exopts)
end
--- Hop-up
if hasHopup then
local hopupDPS = getDPSs(damages2, 1, pellet2, firerate2, useRound)
renderDPSRow(tbl, label, cfg.complex, hopupDPS, huopts)
---- Extra
if hasTempo and hasAmped then
local tempoExtraDPS = getDPSs(damagesE, 1, pellet2, firerate2, useRound)
renderDPSRow(tbl, labelE, cfg.complex, tempoExtraDPS, ex2opts)
elseif hasShat and hasChgd then
local shatChargedDPS = getDPSs(damages2E, 1, pellet2, firerate2, useRound)
renderDPSRow(tbl, labelE, cfg.complex, shatChargedDPS, ex2opts)
end
end
-- Low Profile
if aw.isNumber(shieldinfo.lowprofile) and shieldinfo.lowprofile > 1 then
if hasMultiple then
local normalDPS0 = getDPSs(damages, shieldinfo.lowprofile, pellet, firerate[1], useRound)
local normalDPS1 = getDPSs(damages, shieldinfo.lowprofile, pellet, firerate[2], useRound)
local normalDPS2 = getDPSs(damages, shieldinfo.lowprofile, pellet, firerate[3], useRound)
local normalDPS3 = getDPSs(damages, shieldinfo.lowprofile, pellet, firerate[4], useRound)
renderDPSRow(tbl, cfg.perk.lowprofile, cfg.complex, normalDPS0, defopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 1), cfg.complex, normalDPS1, muopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 2), cfg.complex, normalDPS2, muopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 3), cfg.complex, normalDPS3, muopts)
else
local lowprofileDPS = getDPSs(damages, shieldinfo.lowprofile, pellet, firerate, useRound)
renderDPSRow(tbl, cfg.perk.lowprofile, cfg.complex, lowprofileDPS, defopts)
end
--- Extra
if hasExtra then
local extraLowProfileDPS = getDPSs(damagesE, shieldinfo.lowprofile, pellet, firerate, useRound)
renderDPSRow(tbl, labelE, cfg.complex, extraLowProfileDPS, exopts)
end
--- Hop-up
if hasHopup then
local hopupLowProfileDPS = getDPSs(damages2, shieldinfo.lowprofile, pellet2, firerate2, useRound)
renderDPSRow(tbl, label, cfg.complex, hopupLowProfileDPS, huopts)
---- Extra
if hasTempo and hasAmped then
local tempoAmpedLowProfileDPS = getDPSs(damagesE, shieldinfo.lowprofile, pellet2, firerate2, useRound)
renderDPSRow(tbl, labelE, cfg.complex, tempoAmpedLowProfileDPS, ex2opts)
elseif hasShat and hasChgd then
local shatChargedLowProfileDPS = getDPSs(damages2E, shieldinfo.lowprofile, pellet2, firerate2, useRound)
renderDPSRow(tbl, labelE, cfg.complex, shatChargedLowProfileDPS, ex2opts)
end
end
end
-- Fortified
if aw.isNumber(shieldinfo.fortified) and shieldinfo.fortified < 1 then
if hasMultiple then
local normalDPS0 = getDPSs(damages, shieldinfo.fortified, pellet, firerate[1], useRound)
local normalDPS1 = getDPSs(damages, shieldinfo.fortified, pellet, firerate[2], useRound)
local normalDPS2 = getDPSs(damages, shieldinfo.fortified, pellet, firerate[3], useRound)
local normalDPS3 = getDPSs(damages, shieldinfo.fortified, pellet, firerate[4], useRound)
renderDPSRow(tbl, cfg.perk.fortified, cfg.complex, normalDPS0, defopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 1), cfg.complex, normalDPS1, muopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 2), cfg.complex, normalDPS2, muopts)
renderDPSRow(tbl, iu.attachment('ショットガンボルト', 3), cfg.complex, normalDPS3, muopts)
else
local lowprofileDPS = getDPSs(damages, shieldinfo.fortified, pellet, firerate, useRound)
renderDPSRow(tbl, cfg.perk.fortified, cfg.complex, lowprofileDPS, defopts)
end
--- Extra
if hasExtra then
local extraFortifiedDPS = getDPSs(damagesE, shieldinfo.fortified, pellet, firerate, useRound)
renderDPSRow(tbl, labelE, cfg.complex, extraFortifiedDPS, exopts)
end
--- Hop-up
if hasHopup then
local hopupFortifiedDPS = getDPSs(damages2, shieldinfo.fortified, pellet2, firerate2, useRound)
renderDPSRow(tbl, label, cfg.complex, hopupFortifiedDPS, huopts)
---- Extra
if hasTempo and hasAmped then
local tempoAmpedFortifiedDPS = getDPSs(damagesE, shieldinfo.fortified, pellet2, firerate2, useRound)
renderDPSRow(tbl, labelE, cfg.complex, tempoAmpedFortifiedDPS, ex2opts)
elseif hasShat and hasChgd then
local shatChargedFortifiedDPS = getDPSs(damages2E, shieldinfo.fortified, pellet2, firerate2, useRound)
renderDPSRow(tbl, labelE, cfg.complex, shatChargedFortifiedDPS, ex2opts)
end
end
end
return tbl
end
function p._main(name, lang)
lang = lang or 'ja'
local stat = mw.loadData('Module:Stat/Weapon')[name]
local sld = require('Module:Stat/Shield')['removelowprofile']
local node = p.renderDPS(stat, sld, lang)
local div = mw.html.create('div')
:addClass('tpl-infobox-right')
:addClass('tpl-weapon')
if aw.stringstarts(stat.ammo, "special_") then
div:addClass('tpl-weapon-special')
else
div:addClass('tpl-weapon-' .. stat.ammo)
end
div
:tag('div')
:addClass('tpl-weapon-header')
:wikitext(name .. iu.ammo(stat.ammo, { size = 40 }))
:done()
:tag('table')
:tag('tr')
:tag('th'):wikitext('DPS'):done()
:tag('td'):done()
:tag('tr')
:tag('td'):attr('colspan', 2):node(node)
return tostring(div)
end
return p