| 🌟 | 現在、 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
「モジュール:WeaponInfobox/Duration」の版間の差分
ナビゲーションに移動
検索に移動
(ブーステッドローダーのファストリロードに対応) |
(時間用のリソースの項目名を変更による調整) |
||
| 436行目: | 436行目: | ||
renderRow( | renderRow( | ||
tbl, | tbl, | ||
duration.reload.name, | duration.reload.name .. ' ', | ||
stat.time.reload.tactical, | stat.time.reload.tactical, | ||
reloadConfig) | reloadConfig) | ||
| 466行目: | 466行目: | ||
renderRow( | renderRow( | ||
tbl, | tbl, | ||
duration.reloadempty.name, | duration.reloadempty.name .. ' ', | ||
stat.time.reload.full, | stat.time.reload.full, | ||
reloademptyConfig) | reloademptyConfig) | ||
| 490行目: | 490行目: | ||
renderRow( | renderRow( | ||
tbl, | tbl, | ||
duration.zoomin.name, | duration.zoomin.name .. ' ', | ||
stat.time.zoom_in, | stat.time.zoom_in, | ||
zoominConfig) | zoominConfig) | ||
| 584行目: | 584行目: | ||
renderRow( | renderRow( | ||
tbl, | tbl, | ||
duration.zoomout.name, | duration.zoomout.name .. ' ', | ||
stat.time.zoom_out, | stat.time.zoom_out, | ||
zoomoutConfig) | zoomoutConfig) | ||
2021年8月6日 (金) 14:48時点における版
このモジュールについての説明文ページを モジュール:WeaponInfobox/Duration/doc に作成できます
require('Module:Utility/mw.html Extensions')
local p = {}
local cfg = mw.loadData('Module:WeaponInfobox/configuration')
local attachment = mw.loadData('Module:Stat/Attachment')
local aw = require('Module:Utility/Library')
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 ZoomProto = {
zoom_in = proto.NumberRange(0),
zoom_out = proto.NumberRange(0),
}
-- Duration for multiple value
local function createMultipleRow(tbl, name, default, common, rare, epic, opts)
opts = opts or {}
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 common then
row
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(default)
:done()
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:tag('span')
:addClass('text-rarity')
:addClass('text-rarity-common')
:wikitext(common)
:done()
:done()
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:tag('span')
:addClass('text-rarity')
:addClass('text-rarity-rare')
:wikitext(rare)
:done()
:done()
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:tag('span')
:addClass('text-rarity')
:addClass('text-rarity-epic')
:wikitext(epic)
:done()
:done()
else
row
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:attr('colspan', 4)
:wikitext(default)
:done()
end
return row
end
local function renderDurationWithStock(stat, duration, stock, canModdedLoader, isSniper)
local tbl = mw.html.create('table')
:addClass('intable')
local rootOpts = { colspan = 2 }
local secondOpts = { offset = 1 }
-- Header
local stockName = isSniper and 'スナイパーストック' or '標準ストック'
tbl:tag('tr')
:tag('th')
:attr('colspan', 2)
:wikitext(name)
:done()
:tag('th'):done()
:tag('th'):wikitext(iu.attachment(stockName, 1)):done()
:tag('th'):wikitext(iu.attachment(stockName, 2)):done()
:tag('th'):wikitext(iu.attachment(stockName, 3))
-- Reload
if aw.isNumber(stat.time.reload.tactical) then
createMultipleRow(
tbl,
duration.reload.name,
string.format(duration.reload.format, stat.time.reload.tactical),
string.format(duration.reload.format, stat.time.reload.tactical * stock.reload[1]),
string.format(duration.reload.format, stat.time.reload.tactical * stock.reload[2]),
string.format(duration.reload.format, stat.time.reload.tactical * stock.reload[3]),
rootOpts)
if canModdedLoader then
createMultipleRow(
tbl,
iu.passive('modded_loader'),
string.format(duration.reload.format, stat.time.reload.tactical * 0.75),
string.format(duration.reload.format, stat.time.reload.tactical * 0.75 * stock.reload[1]),
string.format(duration.reload.format, stat.time.reload.tactical * 0.75 * stock.reload[2]),
string.format(duration.reload.format, stat.time.reload.tactical * 0.75 * stock.reload[3]),
secondOpts)
end
if stat.boosted_loader and aw.isNumberAndGreaterThanZero(stat.boosted_loader.reloadfast) then
createMultipleRow(
tbl,
iu.hopup('boosted_loader') .. ' ',
string.format(duration.reload.format, stat.boosted_loader.reloadfast),
nil,
nil,
nil,
secondOpts)
end
-- Reload (Empty)
if aw.isNumber(stat.time.reload.full) and stat.time.reload.tactical ~= stat.time.reload.full then
createMultipleRow(
tbl,
duration.reloadempty.name,
string.format(duration.reloadempty.format, stat.time.reload.full),
string.format(duration.reloadempty.format, stat.time.reload.full * stock.reload[1]),
string.format(duration.reloadempty.format, stat.time.reload.full * stock.reload[2]),
string.format(duration.reloadempty.format, stat.time.reload.full * stock.reload[3]),
rootOpts)
if canModdedLoader then
createMultipleRow(
tbl,
iu.passive('modded_loader'),
string.format(duration.reloadempty.format, stat.time.reload.full * 0.75),
string.format(duration.reloadempty.format, stat.time.reload.full * 0.75 * stock.reload[1]),
string.format(duration.reloadempty.format, stat.time.reload.full * 0.75 * stock.reload[2]),
string.format(duration.reloadempty.format, stat.time.reload.full * 0.75 * stock.reload[3]),
secondOpts)
end
end
end
-- Zoom In
if aw.isNumber(stat.time.zoom_in) then
createMultipleRow(
tbl,
duration.zoomin.name,
string.format(duration.zoomin.format, stat.time.zoom_in),
string.format(duration.zoomin.format, stat.time.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.zoom_in * stock.zoom[3]),
rootOpts)
-- HCOG Classic/Bruiser, Holosight, 1x Digital Threat
if proto.validateTypes(stat.time.hcog_classic, ZoomProto) then
local label
if proto.validateTypes(stat.time.threat, ZoomProto) then
label = iu.scope('1倍HCOG\'クラシック\'') .. iu.scope('2倍HCOG\'ブルーザー\'') .. iu.scope('1倍ホロサイト') .. iu.scope('1~2倍可変式ホロサイト') .. iu.scope('1倍デジタルスレット')
else
label = iu.scope('1倍HCOG\'クラシック\'') .. iu.scope('2倍HCOG\'ブルーザー\'') .. '<br>' .. iu.scope('1倍ホロサイト') .. iu.scope('1~2倍可変式ホロサイト')
end
createMultipleRow(
tbl,
label,
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_in),
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_in * stock.zoom[3]),
secondOpts)
end
-- 3x HCOG 'Ranger', 2x-4x Variable AOG
if proto.validateTypes(stat.time.hcog_ranged, ZoomProto) then
if proto.validateTypes(stat.time.aog_variable, ZoomProto) then
if stat.time.hcog_ranged.zoom_in ~= stat.time.aog_variable.zoom_in then
createMultipleRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\''),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[3]),
secondOpts)
createMultipleRow(
tbl,
iu.scope('2~4倍可変式AOG'),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_in),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_in * stock.zoom[3]),
secondOpts)
else
createMultipleRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. iu.scope('2~4倍可変式AOG'),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[3]),
secondOpts)
end
else
createMultipleRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\''),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_in * stock.zoom[3]),
secondOpts)
end
end
-- 6x Sniper Scope
if proto.validateTypes(stat.time.sniper, ZoomProto) then
createMultipleRow(
tbl,
iu.scope('6倍スナイパー'),
string.format(duration.zoomin.format, stat.time.sniper.zoom_in),
string.format(duration.zoomin.format, stat.time.sniper.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.sniper.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.sniper.zoom_in * stock.zoom[3]),
secondOpts)
end
-- 4x-8x Variable Sniper Scope
if proto.validateTypes(stat.time.sniper_variable, ZoomProto) then
createMultipleRow(
tbl,
iu.scope('4~8倍可変式スナイパー'),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_in),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_in * stock.zoom[3]),
secondOpts)
end
-- 4x-10x Digital Sniper Threat
if proto.validateTypes(stat.time.sniper_threat, ZoomProto) then
createMultipleRow(
tbl,
iu.scope('4~10倍デジタルスレット'),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_in),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_in * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_in * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_in * stock.zoom[3]),
secondOpts)
end
end
-- Zoom Out
if aw.isNumber(stat.time.zoom_out) then
createMultipleRow(
tbl,
duration.zoomout.name,
string.format(duration.zoomout.format, stat.time.zoom_out),
string.format(duration.zoomout.format, stat.time.zoom_out * stock.zoom[1]),
string.format(duration.zoomout.format, stat.time.zoom_out * stock.zoom[2]),
string.format(duration.zoomout.format, stat.time.zoom_out * stock.zoom[3]),
rootOpts)
-- HCOG Classic/Bruiser, Holosight, 1x Digital Threat
if proto.validateTypes(stat.time.hcog_classic, ZoomProto) then
local label
if proto.validateTypes(stat.time.threat, ZoomProto) then
label = iu.scope('1倍HCOG\'クラシック\'') .. iu.scope('2倍HCOG\'ブルーザー\'') .. iu.scope('1倍ホロサイト') .. iu.scope('1~2倍可変式ホロサイト') .. iu.scope('1倍デジタルスレット')
else
label = iu.scope('1倍HCOG\'クラシック\'') .. iu.scope('2倍HCOG\'ブルーザー\'') .. '<br>' .. iu.scope('1倍ホロサイト') .. iu.scope('1~2倍可変式ホロサイト')
end
createMultipleRow(
tbl,
label,
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_out),
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_classic.zoom_out * stock.zoom[3]),
secondOpts)
end
-- 3x HCOG 'Ranger', 2x-4x Variable AOG
if proto.validateTypes(stat.time.hcog_ranged, ZoomProto) then
if proto.validateTypes(stat.time.aog_variable, ZoomProto) then
if stat.time.hcog_ranged.zoom_out ~= stat.time.aog_variable.zoom_out then
createMultipleRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\''),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[3]),
secondOpts)
createMultipleRow(
tbl,
iu.scope('2~4倍可変式AOG'),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_out),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.aog_variable.zoom_out * stock.zoom[3]),
secondOpts)
else
createMultipleRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. iu.scope('2~4倍可変式AOG'),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[3]),
secondOpts)
end
else
createMultipleRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\''),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.hcog_ranged.zoom_out * stock.zoom[3]),
secondOpts)
end
end
-- 6x Sniper Scope
if proto.validateTypes(stat.time.sniper, ZoomProto) then
createMultipleRow(
tbl,
iu.scope('6倍スナイパー'),
string.format(duration.zoomin.format, stat.time.sniper.zoom_out),
string.format(duration.zoomin.format, stat.time.sniper.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.sniper.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.sniper.zoom_out * stock.zoom[3]),
secondOpts)
end
-- 4x-8x Variable Sniper Scope
if proto.validateTypes(stat.time.sniper_variable, ZoomProto) then
createMultipleRow(
tbl,
iu.scope('4~8倍可変式スナイパー'),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_out),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.sniper_variable.zoom_out * stock.zoom[3]),
secondOpts)
end
-- 4x-10x Digital Sniper Threat
if proto.validateTypes(stat.time.sniper_threat, ZoomProto) then
createMultipleRow(
tbl,
iu.scope('4~10倍デジタルスレット'),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_out),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_out * stock.zoom[1]),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_out * stock.zoom[2]),
string.format(duration.zoomin.format, stat.time.sniper_threat.zoom_out * stock.zoom[3]),
secondOpts)
end
end
return tbl
end
-- Duration for single value
local function renderRow(tbl, name, num, cfg, opts)
opts = opts or {}
if cfg.isSpecial then
num = num * cfg.muls[3]
end
local row = tbl:tag('tr')
:addClassIf(opts.class and type(opts.class) == 'string', opts.class)
:tag('th')
:attrIf(opts.headerAlign and type(opts.headerAlign) == 'string', { align = opts.headerAlign })
:wikitext(name)
:done()
:tag('td')
:addClass('cell-type-number')
:attr('align', 'left')
:wikitext(string.format(cfg.fmt, num))
:done()
:tag('td')
:attr('align', 'left')
:wikitext(cfg.unit)
:done()
return row
end
local function renderDurationWithoutStock(stat, duration, stock, canModdedLoader, isSpecial)
local secondOpts = { class = 'no-list-style', headerAlign = 'right' }
local tbl = mw.html.create('table')
:addClass('condensedtable')
:addClass('listtable')
-- Reload
if aw.isNumber(stat.time.reload.tactical) then
local reloadConfig = {
fmt = duration.reload.format,
muls = stock.reload,
unit = duration.reload.unit,
isSpecial = isSpecial,
}
renderRow(
tbl,
duration.reload.name .. ' ',
stat.time.reload.tactical,
reloadConfig)
if canModdedLoader then
renderRow(
tbl,
iu.passive('modded_loader') .. ' ',
stat.time.reload.tactical * 0.75,
reloadConfig,
secondOpts)
end
if stat.boosted_loader and aw.isNumberAndGreaterThanZero(stat.boosted_loader.reloadfast) then
renderRow(
tbl,
iu.hopup('boosted_loader') .. ' ',
stat.boosted_loader.reloadfast,
reloadConfig,
secondOpts)
end
-- Reload (Empty)
if aw.isNumber(stat.time.reload.full) and stat.time.reload.tactical ~= stat.time.reload.full then
local reloademptyConfig = {
fmt = duration.reloadempty.format,
muls = stock.reload,
unit = duration.reloadempty.unit,
isSpecial = isSpecial,
}
renderRow(
tbl,
duration.reloadempty.name .. ' ',
stat.time.reload.full,
reloademptyConfig)
if canModdedLoader then
renderRow(
tbl,
iu.passive('modded_loader') .. ' ',
stat.time.reload.full * 0.75,
reloademptyConfig,
secondOpts)
end
end
end
-- Zoom In
if aw.isNumber(stat.time.zoom_in) then
local zoominConfig = {
fmt = duration.zoomin.format,
muls = stock.zoom,
unit = duration.zoomin.unit,
isSpecial = isSpecial,
}
renderRow(
tbl,
duration.zoomin.name .. ' ',
stat.time.zoom_in,
zoominConfig)
-- HCOG Classic/Bruiser, Holosight, 1x Digital Threat
if proto.validateTypes(stat.time.hcog_classic, ZoomProto) and stat.time.hcog_classic.zoom_in ~= stat.time.zoom_in then
local label = iu.scope('1倍HCOG\'クラシック\'') .. iu.scope('2倍HCOG\'ブルーザー\'') .. iu.scope('1倍ホロサイト') .. iu.scope('1~2倍可変式ホロサイト')
if proto.validateTypes(stat.time.threat, ZoomProto) then
label = label .. iu.scope('1倍デジタルスレット')
end
renderRow(
tbl,
label .. ' ',
stat.time.hcog_classic.zoom_in,
zoominConfig,
secondOpts)
end
-- 3x HCOG 'Ranger', 2x-4x Variable AOG
if proto.validateTypes(stat.time.hcog_ranged, ZoomProto) then
if proto.validateTypes(stat.time.aog_variable, ZoomProto) then
if stat.time.hcog_ranged.zoom_in ~= stat.time.aog_variable.zoom_in then
renderRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. ' ',
stat.time.hcog_ranged.zoom_in,
zoominConfig,
secondOpts)
renderRow(
tbl,
iu.scope('2~4倍可変式AOG') .. ' ',
stat.time.aog_variable.zoom_in,
zoominConfig,
secondOpts)
else
renderRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. iu.scope('2~4倍可変式AOG') .. ' ',
stat.time.hcog_ranged.zoom_in,
zoominConfig,
secondOpts)
end
elseif stat.time.hcog_ranged.zoom_in ~= stat.time.zoom_in then
renderRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. ' ',
stat.time.hcog_ranged.zoom_in,
zoominConfig,
secondOpts)
end
end
-- 6x Sniper Scope
if proto.validateTypes(stat.time.sniper, ZoomProto) then
renderRow(
tbl,
iu.scope('6倍スナイパー') .. ' ',
stat.time.sniper.zoom_in,
zoominConfig,
secondOpts)
end
-- 4x-8x Variable Sniper Scope
if proto.validateTypes(stat.time.sniper_variable, ZoomProto) then
renderRow(
tbl,
iu.scope('4~8倍可変式スナイパー') .. ' ',
stat.time.sniper_variable.zoom_in,
zoominConfig,
secondOpts)
end
-- 4x-10x Digital Sniper Threat
if proto.validateTypes(stat.time.sniper_threat, ZoomProto) then
renderRow(
tbl,
iu.scope('4~10倍デジタルスレット') .. ' ',
stat.time.sniper_threat.zoom_in,
zoominConfig,
secondOpts)
end
end
-- Zoom Out
if aw.isNumber(stat.time.zoom_out) then
local zoomoutConfig = {
fmt = duration.zoomout.format,
muls = stock.zoom,
unit = duration.zoomout.unit,
isSpecial = isSpecial,
}
renderRow(
tbl,
duration.zoomout.name .. ' ',
stat.time.zoom_out,
zoomoutConfig)
-- HCOG Classic/Bruiser, Holosight, 1x Digital Threat
if proto.validateTypes(stat.time.hcog_classic, ZoomProto) and stat.time.hcog_classic.zoom_out ~= stat.time.zoom_out then
local label = iu.scope('1倍HCOG\'クラシック\'') .. iu.scope('2倍HCOG\'ブルーザー\'') .. iu.scope('1倍ホロサイト') .. iu.scope('1~2倍可変式ホロサイト')
if proto.validateTypes(stat.time.threat, ZoomProto) then
label = label .. iu.scope('1倍デジタルスレット')
end
renderRow(
tbl,
label .. ' ',
stat.time.hcog_classic.zoom_out,
zoomoutConfig,
secondOpts)
end
-- 3x HCOG 'Ranger', 2x-4x Variable AOG
if proto.validateTypes(stat.time.hcog_ranged, ZoomProto) then
if proto.validateTypes(stat.time.aog_variable, ZoomProto) then
if stat.time.hcog_ranged.zoom_out ~= stat.time.aog_variable.zoom_out then
renderRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. ' ',
stat.time.hcog_ranged.zoom_out,
zoomoutConfig,
secondOpts)
renderRow(
tbl,
iu.scope('2~4倍可変式AOG') .. ' ',
stat.time.aog_variable.zoom_out,
zoomoutConfig,
secondOpts)
else
renderRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. iu.scope('2~4倍可変式AOG') .. ' ',
stat.time.hcog_ranged.zoom_out,
zoomoutConfig,
secondOpts)
end
elseif stat.time.hcog_ranged.zoom_out ~= stat.time.zoom_out then
renderRow(
tbl,
iu.scope('3倍HCOG\'レンジャー\'') .. ' ',
stat.time.hcog_ranged.zoom_out,
zoomoutConfig,
secondOpts)
end
end
-- 6x Sniper Scope
if proto.validateTypes(stat.time.sniper, ZoomProto) then
renderRow(
tbl,
iu.scope('6倍スナイパー') .. ' ',
stat.time.sniper.zoom_out,
zoomoutConfig,
secondOpts)
end
-- 4x-8x Variable Sniper Scope
if proto.validateTypes(stat.time.sniper_variable, ZoomProto) then
renderRow(
tbl,
iu.scope('4~8倍可変式スナイパー') .. ' ',
stat.time.sniper_variable.zoom_out,
zoomoutConfig,
secondOpts)
end
-- 4x-10x Digital Sniper Threat
if proto.validateTypes(stat.time.sniper_threat, ZoomProto) then
renderRow(
tbl,
iu.scope('4~10倍デジタルスレット') .. ' ',
stat.time.sniper_threat.zoom_out,
zoomoutConfig,
secondOpts)
end
end
return tbl
end
function p.renderDuration(stat, lang)
local duration = cfg[lang].duration
local isSniper = stat.category == 'sniper' or stat.category == 'marksman_weapon'
local stock
if isSniper then
stock = attachment.sniper_stock
else
stock = attachment.standard_stock
end
local canModdedLoader = stat.category == 'light_machine_gun' or stat.ammo == 'minigun'
local isSpecial = aw.stringstarts(stat.ammo, 'special_') and not (stat.ammo == 'special_sniper')
local isSimple = not stat.attachments.stock or isSpecial
local node
if isSimple then
node = renderDurationWithoutStock(stat, duration, stock, canModdedLoader, isSpecial)
else
node = renderDurationWithStock(stat, duration, stock, canModdedLoader, isSniper)
end
return node, isSimple
end
function p._main(name, lang)
lang = lang or 'ja'
local stat = mw.loadData('Module:Stat/Weapon')[name]
local node, _ = p.renderDuration(stat, lang)
return tostring(node)
end
return p