🌟現在、鉄壁 鉄壁ヘッドショットには対応済みです。
鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。

モジュール:WeaponInfobox/Duration

提供:Apex Data
< モジュール:WeaponInfobox
2021年8月5日 (木) 18:43時点におけるMntone (トーク | 投稿記録)による版 (物資投下武器判定の不具合を修正)
ナビゲーションに移動 検索に移動

このモジュールについての説明文ページを モジュール: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 formatter -- lazily initialized

local function renderMultipleRow(tbl, name, default, common, rare, epic, opts)
	opts = opts or {}
	opts.separator = opts.separator or '&thinsp;-&thinsp;'
	
	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(default)
			:done()
		:tag('td'):wikitext(opts.separator):done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'left')
			:wikitext(formatter:common(common))
			:done()
		:tag('td'):wikitext(opts.separator):done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'left')
			:wikitext(formatter:rare(rare))
			:done()
		:tag('td'):wikitext(opts.separator):done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'left')
			:wikitext(formatter:epic(epic))
			:done()
	
	if opts.footer ~= nil then
		row:tag('td')
			:attrIf(opts.footerAlign   and type(opts.footerAlign) == 'string',   { align   = opts.footerAlign }, { align = 'left' })
			:attrIf(opts.footerColspan and type(opts.footerColspan) == 'number', { colspan = opts.footerColspan })
			:wikitext(opts.footer)
	end
	return row
end

local function renderDurationWithStock(stat, duration, stock, canModdedLoader, tbl)
	-- Reload
	if aw.isNumber(stat.time.reload.tactical) then
		renderMultipleRow(
			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]),
			{ footer = duration.reload.unit })
		if canModdedLoader then
			renderMultipleRow(
				tbl,
				iu.passive('modded_loader') .. '&nbsp;',
				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]),
				{ class = 'no-list-style', headerAlign = 'right', footer = duration.reload.unit })
		end
		
		-- Reload (Empty)
		if aw.isNumber(stat.time.reload.full) and stat.time.reload.tactical ~= stat.time.reload.full then
			renderMultipleRow(
				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]),
				{ footer = duration.reload.unit })
			if canModdedLoader then
				renderMultipleRow(
					tbl,
					iu.passive('modded_loader') .. '&nbsp;',
					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]),
					{ class = 'no-list-style', headerAlign = 'right', footer = duration.reload.unit })
			end
		end
	end
	
	-- Zoom In
	if aw.isNumber(stat.time.zoom_in) then
		renderMultipleRow(
			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]),
			{ footer = duration.zoomin.unit })
	end
	
	-- Zoom Out
	if aw.isNumber(stat.time.zoom_out) then
		renderMultipleRow(
			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]),
			{ footer = duration.zoomout.unit })
	end
end

local function renderRow(tbl, name, num, opts)
	opts = opts or {}
	opts.separator = opts.separator or '&thinsp;-&thinsp;'
	
	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(num)
			:done()
	
	if opts.footer ~= nil then
		row:tag('td')
			:attrIf(opts.footerAlign   and type(opts.footerAlign) == 'string',   { align   = opts.footerAlign }, { align = 'left' })
			:attrIf(opts.footerColspan and type(opts.footerColspan) == 'number', { colspan = opts.footerColspan })
			:wikitext(opts.footer)
	end
	return row
end

local function renderDurationWithoutStock(stat, duration, stock, canModdedLoader, tbl, isSpecial)
	-- Reload
	if aw.isNumber(stat.time.reload.tactical) then
		local reload
		if isSpecial then
			reload = stat.time.reload.tactical * stock.reload[3]
		else
			reload = stat.time.reload.tactical
		end
		
		renderRow(
			tbl,
			duration.reload.name,
			string.format(duration.reload.format, reload),
			{ footer = duration.reload.unit })
		if canModdedLoader then
			renderRow(
				tbl,
				iu.passive('modded_loader') .. '&nbsp;',
				string.format(duration.reload.format, reload * 0.75),
				{ class = 'no-list-style', headerAlign = 'right', footer = duration.reload.unit })
		end
		
		-- Reload (Empty)
		if aw.isNumber(stat.time.reload.full) and stat.time.reload.tactical ~= stat.time.reload.full then
			local reloadempty
			if isSpecial then
				reloadempty = stat.time.reload.full * stock.reload[3]
			else
				reloadempty = stat.time.reload.full
			end
			
			renderRow(
				tbl,
				duration.reloadempty.name,
				string.format(duration.reloadempty.format, reloadempty),
				{ footer = duration.reload.unit })
			if canModdedLoader then
				renderRow(
					tbl,
					iu.passive('modded_loader') .. '&nbsp;',
					string.format(duration.reloadempty.format, reloadempty * 0.75),
					{ class = 'no-list-style', headerAlign = 'right', footer = duration.reload.unit })
			end
		end
	end
	
	-- Zoom In
	if aw.isNumber(stat.time.zoom_in) then
		local zoomin
		if isSpecial then
			zoomin = stat.time.zoom_in * stock.zoom[3]
		else
			zoomin = stat.time.zoom_in
		end
		
		renderRow(
			tbl,
			duration.zoomin.name,
			string.format(duration.zoomin.format, zoomin),
			{ footer = duration.zoomin.unit })
	end
	
	-- Zoom Out
	if aw.isNumber(stat.time.zoom_out) then
		local zoomout
		if isSpecial then
			zoomout = stat.time.zoom_out * stock.zoom[3]
		else
			zoomout = stat.time.zoom_out
		end
		
		renderRow(
			tbl,
			duration.zoomout.name,
			string.format(duration.zoomout.format, zoomout),
			{ footer = duration.zoomout.unit })
	end
end

function p.renderDuration(stat, lang)
	formatter = require('Module:Utility/Formatter').new(frame)
	
	local duration = cfg[lang].duration
	local stock
	if stat.ammo == 'sniper' 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 tbl = mw.html.create('table')
		:addClass('condensedtable')
		:addClass('listtable')
	
	if not stat.attachments.stock or isSpecial then
		renderDurationWithoutStock(stat, duration, stock, canModdedLoader, tbl, isSpecial)
	else
		renderDurationWithStock(stat, duration, stock, canModdedLoader, tbl)
	end
	
	return tbl
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