🌟 | 現在、 鉄壁ヘッドショットには対応済みです。 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
「モジュール:WeaponInfobox/Duration」の版間の差分
ナビゲーションに移動
検索に移動
(単一の値を表示する際のセグメントリロードに対応) |
(リロード周りのデータ構造変更に対応) |
||
199行目: | 199行目: | ||
-- Reload | -- Reload | ||
elseif aw.isNumber(stat.time.reload | elseif aw.isNumber(stat.time.reload) then | ||
createMultipleRow( | createMultipleRow( | ||
tbl, | tbl, | ||
duration.reload.name, | duration.reload.name, | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload), | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload * stock.reload[1]), | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload * stock.reload[2]), | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload * stock.reload[3]), | ||
rootOpts) | rootOpts) | ||
if canModdedLoader then | if canModdedLoader then | ||
212行目: | 212行目: | ||
tbl, | tbl, | ||
iu.passive('modded_loader'), | iu.passive('modded_loader'), | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload * 0.75), | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload * 0.75 * stock.reload[1]), | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload * 0.75 * stock.reload[2]), | ||
string.format(duration.reload.format, stat.time.reload | string.format(duration.reload.format, stat.time.reload * 0.75 * stock.reload[3]), | ||
secondOpts) | secondOpts) | ||
end | end | ||
230行目: | 230行目: | ||
-- Reload (Empty) | -- Reload (Empty) | ||
if aw.isNumber(stat.time. | if aw.isNumber(stat.time.reloadempty) and stat.time.reload.tactical ~= stat.time.reload.full then | ||
createMultipleRow( | createMultipleRow( | ||
tbl, | tbl, | ||
duration.reloadempty.name, | duration.reloadempty.name, | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty), | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty * stock.reload[1]), | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty * stock.reload[2]), | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty * stock.reload[3]), | ||
rootOpts) | rootOpts) | ||
if canModdedLoader then | if canModdedLoader then | ||
243行目: | 243行目: | ||
tbl, | tbl, | ||
iu.passive('modded_loader'), | iu.passive('modded_loader'), | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75), | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75 * stock.reload[1]), | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75 * stock.reload[2]), | ||
string.format(duration.reloadempty.format, stat.time. | string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75 * stock.reload[3]), | ||
secondOpts) | secondOpts) | ||
end | end | ||
572行目: | 572行目: | ||
-- Reload | -- Reload | ||
elseif aw.isNumber(stat.time.reload | elseif aw.isNumber(stat.time.reload) then | ||
local reloadConfig = { | local reloadConfig = { | ||
fmt = duration.reload.format, | fmt = duration.reload.format, | ||
582行目: | 582行目: | ||
tbl, | tbl, | ||
duration.reload.name .. ' ', | duration.reload.name .. ' ', | ||
stat.time.reload | stat.time.reload, | ||
reloadConfig) | reloadConfig) | ||
if canModdedLoader then | if canModdedLoader then | ||
588行目: | 588行目: | ||
tbl, | tbl, | ||
iu.passive('modded_loader') .. ' ', | iu.passive('modded_loader') .. ' ', | ||
stat.time.reload | stat.time.reload * 0.75, | ||
reloadConfig, | reloadConfig, | ||
secondOpts) | secondOpts) | ||
602行目: | 602行目: | ||
-- Reload (Empty) | -- Reload (Empty) | ||
if aw.isNumber(stat.time. | if aw.isNumber(stat.time.reloadempty) and stat.time.reload ~= stat.time.reloadempty then | ||
local reloademptyConfig = { | local reloademptyConfig = { | ||
fmt = duration.reloadempty.format, | fmt = duration.reloadempty.format, | ||
612行目: | 612行目: | ||
tbl, | tbl, | ||
duration.reloadempty.name .. ' ', | duration.reloadempty.name .. ' ', | ||
stat.time. | stat.time.reloadempty, | ||
reloademptyConfig) | reloademptyConfig) | ||
if canModdedLoader then | if canModdedLoader then | ||
618行目: | 618行目: | ||
tbl, | tbl, | ||
iu.passive('modded_loader') .. ' ', | iu.passive('modded_loader') .. ' ', | ||
stat.time. | stat.time.reloadempty * 0.75, | ||
reloademptyConfig, | reloademptyConfig, | ||
secondOpts) | secondOpts) |
2021年8月12日 (木) 20:14時点における版
このモジュールについての説明文ページを モジュール: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 nu = require('Module:Utility/Name') 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), } local MagazineProto = { proto.NumberRange(0), proto.NumberRange(0), proto.NumberRange(0), proto.NumberRange(0), } local SegmentReloadProto = { reload_segment_loop = proto.NumberRange(0), reload_segment_end = proto.NumberRange(0), reload_segment_one = 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) :tag('span') :addClass('text-rarity') :addClass('text-rarity-legendary') :wikitext(default) :done() :done() end return row end local function calcSegmentedReloadTime(rounds, time) if rounds <= 1 then return time.reload_segment_one else return (rounds - 1) * time.reload_segment_loop + time.reload_segment_end end 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)) -- Segmented Reload if proto.validateTypes(stat.time, SegmentReloadProto) then if proto.validateTypes(stat.magazine, MagazineProto) then local magName = nu.extmag(stat.ammo, 'ja') local baseTime = calcSegmentedReloadTime(stat.magazine[1], stat.time) createMultipleRow( tbl, duration.reload.name, string.format(duration.reload.format, baseTime), string.format(duration.reload.format, baseTime * stock.reload_segment[1]), string.format(duration.reload.format, baseTime * stock.reload_segment[2]), string.format(duration.reload.format, baseTime * stock.reload_segment[3]), rootOpts) local lvl1Time = calcSegmentedReloadTime(stat.magazine[2], stat.time) createMultipleRow( tbl, iu.attachment(magName, 1), string.format(duration.reload.format, lvl1Time), string.format(duration.reload.format, lvl1Time * stock.reload_segment[1]), string.format(duration.reload.format, lvl1Time * stock.reload_segment[2]), string.format(duration.reload.format, lvl1Time * stock.reload_segment[3]), secondOpts) local lvl2Time = calcSegmentedReloadTime(stat.magazine[3], stat.time) createMultipleRow( tbl, iu.attachment(magName, 2), string.format(duration.reload.format, lvl2Time), string.format(duration.reload.format, lvl2Time * stock.reload_segment[1]), string.format(duration.reload.format, lvl2Time * stock.reload_segment[2]), string.format(duration.reload.format, lvl2Time * stock.reload_segment[3]), secondOpts) local lvl3Time = calcSegmentedReloadTime(stat.magazine[4], stat.time) createMultipleRow( tbl, iu.attachment(magName, 3) .. iu.attachment(magName, 4), string.format(duration.reload.format, lvl3Time), string.format(duration.reload.format, lvl3Time * stock.reload_segment[1]), string.format(duration.reload.format, lvl3Time * stock.reload_segment[2]), string.format(duration.reload.format, lvl3Time * stock.reload_segment[3]), secondOpts) local oneTime = calcSegmentedReloadTime(1, stat.time) createMultipleRow( tbl, duration.reloadsegmentone.name, string.format(duration.reloadsegmentone.format, oneTime), string.format(duration.reloadsegmentone.format, oneTime * stock.reload_segment[1]), string.format(duration.reloadsegmentone.format, oneTime * stock.reload_segment[2]), string.format(duration.reloadsegmentone.format, oneTime * stock.reload_segment[3]), rootOpts) end -- Reload elseif aw.isNumber(stat.time.reload) then createMultipleRow( tbl, duration.reload.name, string.format(duration.reload.format, stat.time.reload), string.format(duration.reload.format, stat.time.reload * stock.reload[1]), string.format(duration.reload.format, stat.time.reload * stock.reload[2]), string.format(duration.reload.format, stat.time.reload * stock.reload[3]), rootOpts) if canModdedLoader then createMultipleRow( tbl, iu.passive('modded_loader'), string.format(duration.reload.format, stat.time.reload * 0.75), string.format(duration.reload.format, stat.time.reload * 0.75 * stock.reload[1]), string.format(duration.reload.format, stat.time.reload * 0.75 * stock.reload[2]), string.format(duration.reload.format, stat.time.reload * 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.reloadempty) and stat.time.reload.tactical ~= stat.time.reload.full then createMultipleRow( tbl, duration.reloadempty.name, string.format(duration.reloadempty.format, stat.time.reloadempty), string.format(duration.reloadempty.format, stat.time.reloadempty * stock.reload[1]), string.format(duration.reloadempty.format, stat.time.reloadempty * stock.reload[2]), string.format(duration.reloadempty.format, stat.time.reloadempty * stock.reload[3]), rootOpts) if canModdedLoader then createMultipleRow( tbl, iu.passive('modded_loader'), string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75), string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75 * stock.reload[1]), string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75 * stock.reload[2]), string.format(duration.reloadempty.format, stat.time.reloadempty * 0.75 * stock.reload[3]), secondOpts) end end end -- Deploy if aw.isNumber(stat.time.draw) then createMultipleRow( tbl, duration.deploy.name, string.format(duration.deploy.format, stat.time.draw), string.format(duration.deploy.format, stat.time.draw * stock.change[1]), string.format(duration.deploy.format, stat.time.draw * stock.change[2]), string.format(duration.deploy.format, stat.time.draw * stock.change[3]), rootOpts) end -- Deploy if aw.isNumber(stat.time.holster) then createMultipleRow( tbl, duration.holster.name, string.format(duration.holster.format, stat.time.holster), string.format(duration.holster.format, stat.time.holster * stock.change[1]), string.format(duration.holster.format, stat.time.holster * stock.change[2]), string.format(duration.holster.format, stat.time.holster * stock.change[3]), rootOpts) 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') -- Segmented Reload if proto.validateTypes(stat.time, SegmentReloadProto) then local reloadSegmentConfig = { fmt = duration.reload.format, muls = stock.reload_segment, unit = duration.reload.unit, isSpecial = isSpecial, } -- with Mags if proto.validateTypes(stat.magazine, MagazineProto) then local lvl3Time = calcSegmentedReloadTime(stat.magazine[4], stat.time) renderRow( tbl, duration.reload.name .. ' ', lvl3Time, reloadSegmentConfig) local oneTime = calcSegmentedReloadTime(1, stat.time) renderRow( tbl, duration.reloadsegmentone.name .. ' ', oneTime, reloadSegmentConfig) -- without Mags elseif aw.isNumber(stat.magazine) then local baseTime = calcSegmentedReloadTime(stat.magazine, stat.time) renderRow( tbl, duration.reload.name .. ' ', baseTime, reloadSegmentConfig) local oneTime = calcSegmentedReloadTime(1, stat.time) renderRow( tbl, duration.reloadsegmentone.name .. ' ', oneTime, reloadSegmentConfig) end -- Reload elseif aw.isNumber(stat.time.reload) then local reloadConfig = { fmt = duration.reload.format, muls = stock.reload, unit = duration.reload.unit, isSpecial = isSpecial, } renderRow( tbl, duration.reload.name .. ' ', stat.time.reload, reloadConfig) if canModdedLoader then renderRow( tbl, iu.passive('modded_loader') .. ' ', stat.time.reload * 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.reloadempty) and stat.time.reload ~= stat.time.reloadempty then local reloademptyConfig = { fmt = duration.reloadempty.format, muls = stock.reload, unit = duration.reloadempty.unit, isSpecial = isSpecial, } renderRow( tbl, duration.reloadempty.name .. ' ', stat.time.reloadempty, reloademptyConfig) if canModdedLoader then renderRow( tbl, iu.passive('modded_loader') .. ' ', stat.time.reloadempty * 0.75, reloademptyConfig, secondOpts) end end end -- Deploy if aw.isNumber(stat.time.draw) then local deployConfig = { fmt = duration.deploy.format, muls = stock.change, unit = duration.deploy.unit, isSpecial = isSpecial, } renderRow( tbl, duration.deploy.name .. ' ', stat.time.draw, deployConfig) end -- Holster if aw.isNumber(stat.time.holster) then local holsterConfig = { fmt = duration.holster.format, muls = stock.change, unit = duration.holster.unit, isSpecial = isSpecial, } renderRow( tbl, duration.holster.name .. ' ', stat.time.holster, holsterConfig) 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