| 🌟 | 現在、  鉄壁ヘッドショットには対応済みです。 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 | 
「モジュール:WeaponInfobox/Spread」の版間の差分
		
		
		
		
		
		ナビゲーションに移動
		検索に移動
		
				
		
		
	
|  (増加量がオール0のケースの実装の不具合を修正) |  (クイックドローホルスターに対応) | ||
| 1行目: | 1行目: | ||
| require('Module:Utility/mw.html Extensions') | |||
| local p = {} | local p = {} | ||
| local cfg = mw.loadData('Module:WeaponInfobox/configuration') | local cfg = mw.loadData('Module:WeaponInfobox/configuration') | ||
| local iu = require('Module:Utility/Image') | |||
| local function isAllKickOnFireZero(k) | local function isAllKickOnFireZero(k) | ||
| 73行目: | 77行目: | ||
| end | end | ||
| function p.renderSpread(stat, lang) | function p.renderSpread(stat, quickdraw_holster, lang) | ||
| 	local spread = cfg[lang].spread | 	local spread = cfg[lang].spread | ||
| 	local getFormatString = getFormatStringFunction(stat) | 	local getFormatString = getFormatStringFunction(stat) | ||
| 	local getDiffFormatString = getDiffFormatStringFunction(stat) | 	local getDiffFormatString = getDiffFormatStringFunction(stat) | ||
| 	local layout | |||
| 	if quickdraw_holster then | |||
| 		layout = { | |||
| 			state_colspan  = 4, | |||
| 			hip_rowspan    = 7, | |||
| 			stand_rowspan  = 5, | |||
| 			hipads_colspan = 3, | |||
| 		} | |||
| 	else | |||
| 		layout = { | |||
| 			state_colspan  = 3, | |||
| 			hip_rowspan    = 5, | |||
| 			stand_rowspan  = 3, | |||
| 			hipads_colspan = 2, | |||
| 		} | |||
| 	end | |||
| 	local tbl = mw.html.create('table') | 	local tbl = mw.html.create('table') | ||
| 		:addClass('intable') | 		:addClass('intable') | ||
| 83行目: | 104行目: | ||
| 	local header = tbl:tag('tr') | 	local header = tbl:tag('tr') | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:attr('colspan',  | 			:attr('colspan', layout.state_colspan) | ||
| 			:wikitext(spread.state.name) | 			:wikitext(spread.state.name) | ||
| 			:done() | 			:done() | ||
| 103行目: | 124行目: | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:addClass(spread.state.hip_class) | 			:addClass(spread.state.hip_class) | ||
| 			:attr('rowspan',  | 			:attr('rowspan', layout.hip_rowspan) | ||
| 			:tag('span') | 			:tag('span') | ||
| 				:wikitext(spread.state.hip) | 				:wikitext(spread.state.hip) | ||
| 110行目: | 131行目: | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:addClass(spread.state.stand_class) | 			:addClass(spread.state.stand_class) | ||
| 			:attr('rowspan',  | 			:attr('rowspan', layout.stand_rowspan) | ||
| 			:tag('span') | 			:tag('span') | ||
| 				:wikitext(spread.state.stand) | 				:wikitext(spread.state.stand) | ||
| 116行目: | 137行目: | ||
| 			:done() | 			:done() | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:attrIf(quickdraw_holster, { colspan = 2 }) | |||
| 			:cssIf(quickdraw_holster, { ['border-bottom'] = '0 none transparent' }) | |||
| 			:wikitext(spread.state.still) | 			:wikitext(spread.state.still) | ||
| 			:done() | 			:done() | ||
| 128行目: | 151行目: | ||
| 				:addClass('cell-type-number') | 				:addClass('cell-type-number') | ||
| 				:attr('align', 'right') | 				:attr('align', 'right') | ||
| 				:attr('rowspan',  | 				:attr('rowspan', layout.stand_rowspan) | ||
| 				:wikitext(getDiffFormatString(stat.kick_on_fire.stand_hip)) | 				:wikitext(getDiffFormatString(stat.kick_on_fire.stand_hip)) | ||
| 				:done() | 				:done() | ||
| 135行目: | 158行目: | ||
| 				:attr('align', 'right') | 				:attr('align', 'right') | ||
| 				:wikitext(getFormatString(stat.stand_hip + stat.max_kick.stand_hip)) | 				:wikitext(getFormatString(stat.stand_hip + stat.max_kick.stand_hip)) | ||
| 	end | |||
| 	if quickdraw_holster then | |||
| 		local quickhip = tbl:tag('tr') | |||
| 			:tag('th') | |||
| 				:css('border-top', '0 none transparent') | |||
| 				:wikitext('  ') | |||
| 				:done() | |||
| 			:tag('th') | |||
| 				:wikitext(iu.hopup('quickdraw_holster')) | |||
| 				:done() | |||
| 			:tag('td') | |||
| 				:addClass('cell-type-number') | |||
| 				:attr('align', 'right') | |||
| 				:wikitext(getFormatString(quickdraw_holster.stand_hip)) | |||
| 				:done() | |||
| 		if not hideKickOnFire then | |||
| 			quickhip:tag('td') | |||
| 				:addClass('cell-type-number') | |||
| 				:attr('align', 'right') | |||
| 				:wikitext(getFormatString(quickdraw_holster.stand_hip + stat.max_kick.stand_hip)) | |||
| 		end | |||
| 	end | 	end | ||
| 	local run = tbl:tag('tr') | 	local run = tbl:tag('tr') | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:attrIf(quickdraw_holster, { colspan = 2 }) | |||
| 			:cssIf(quickdraw_holster, { ['border-bottom'] = '0 none transparent' }) | |||
| 			:wikitext(spread.state.run) | 			:wikitext(spread.state.run) | ||
| 			:done() | 			:done() | ||
| 151行目: | 198行目: | ||
| 			:attr('align', 'right') | 			:attr('align', 'right') | ||
| 			:wikitext(getFormatString(stat.stand_hip_run + stat.max_kick.stand_hip)) | 			:wikitext(getFormatString(stat.stand_hip_run + stat.max_kick.stand_hip)) | ||
| 	end | |||
| 	if quickdraw_holster then | |||
| 		local quickrun = tbl:tag('tr') | |||
| 			:tag('th') | |||
| 				:css('border-top', '0 none transparent') | |||
| 				:wikitext('  ') | |||
| 				:done() | |||
| 			:tag('th') | |||
| 				:wikitext(iu.hopup('quickdraw_holster')) | |||
| 				:done() | |||
| 			:tag('td') | |||
| 				:addClass('cell-type-number') | |||
| 				:attr('align', 'right') | |||
| 				:wikitext(getFormatString(quickdraw_holster.stand_hip_run)) | |||
| 				:done() | |||
| 		if not hideKickOnFire then | |||
| 			quickrun:tag('td') | |||
| 				:addClass('cell-type-number') | |||
| 				:attr('align', 'right') | |||
| 				:wikitext(getFormatString(quickdraw_holster.stand_hip_run + stat.max_kick.stand_hip)) | |||
| 		end | |||
| 	end | 	end | ||
| 	local sprint = tbl:tag('tr') | 	local sprint = tbl:tag('tr') | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:attrIf(quickdraw_holster, { colspan = 2 }) | |||
| 			:wikitext(spread.state.sprint) | 			:wikitext(spread.state.sprint) | ||
| 			:done() | 			:done() | ||
| 172行目: | 242行目: | ||
| 	local crouch = tbl:tag('tr') | 	local crouch = tbl:tag('tr') | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:attr('colspan',  | 			:attr('colspan', layout.hipads_colspan) | ||
| 			:wikitext(spread.state.crouch) | 			:wikitext(spread.state.crouch) | ||
| 			:done() | 			:done() | ||
| 196行目: | 266行目: | ||
| 	local air = tbl:tag('tr') | 	local air = tbl:tag('tr') | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:attr('colspan',  | 			:attr('colspan', layout.hipads_colspan) | ||
| 			:wikitext(spread.state.air) | 			:wikitext(spread.state.air) | ||
| 			:done() | 			:done() | ||
| 228行目: | 298行目: | ||
| 				:done() | 				:done() | ||
| 			:tag('th') | 			:tag('th') | ||
| 				:attr('colspan',  | 				:attr('colspan', layout.hipads_colspan) | ||
| 				:wikitext(spread.state.standcrouch) | 				:wikitext(spread.state.standcrouch) | ||
| 				:done() | 				:done() | ||
| 257行目: | 327行目: | ||
| 				:done() | 				:done() | ||
| 			:tag('th') | 			:tag('th') | ||
| 				:attr('colspan',  | 				:attr('colspan', layout.hipads_colspan) | ||
| 				:wikitext(spread.state.stand) | 				:wikitext(spread.state.stand) | ||
| 				:done() | 				:done() | ||
| 280行目: | 350行目: | ||
| 		local crouchads = tbl:tag('tr') | 		local crouchads = tbl:tag('tr') | ||
| 			:tag('th') | 			:tag('th') | ||
| 				:attr('colspan',  | 				:attr('colspan', layout.hipads_colspan) | ||
| 				:wikitext(spread.state.crouch) | 				:wikitext(spread.state.crouch) | ||
| 				:done() | 				:done() | ||
| 304行目: | 374行目: | ||
| 	local airads = tbl:tag('tr') | 	local airads = tbl:tag('tr') | ||
| 		:tag('th') | 		:tag('th') | ||
| 			:attr('colspan',  | 			:attr('colspan', layout.hipads_colspan) | ||
| 			:wikitext(spread.state.air) | 			:wikitext(spread.state.air) | ||
| 			:done() | 			:done() | ||
| 330行目: | 400行目: | ||
| 	lang = lang or 'ja' | 	lang = lang or 'ja' | ||
| 	local stat = mw.loadData('Module:Stat/Weapon')[name].spread | 	local stat = mw.loadData('Module:Stat/Weapon')[name] | ||
| 	local node = p.renderSpread(stat, lang) | 	local qkdw = stat.quickdraw_holster and stat.quickdraw_holster.spread | ||
| 	local node = p.renderSpread(stat.spread, qkdw, lang) | |||
| 	return tostring(node) | 	return tostring(node) | ||
| end | end | ||
| return p | return p | ||
2021年5月11日 (火) 10:36時点における版
このモジュールについての説明文ページを モジュール:WeaponInfobox/Spread/doc に作成できます
require('Module:Utility/mw.html Extensions')
local p = {}
local cfg = mw.loadData('Module:WeaponInfobox/configuration')
local iu = require('Module:Utility/Image')
local function isAllKickOnFireZero(k)
	return k.stand_hip == 0
		and k.stand_ads == 0
		and k.crouch_hip == 0
		and k.crouch_ads == 0
		and k.air_hip == 0
		and k.air_ads == 0
end
local function hasSecondDecimalPlace(num)
	return math.floor(10 * num) ~= 10 * num
end
local function getFormatString1(num)
	return string.format('%.1f°', num)
end
local function getFormatString2(num)
	return string.format('%.2f°', num)
end
local function getDiffFormatString1(num)
	if num <= 0 then
		return '-'
	else
		return string.format('%+.1f°', num)
	end
end
local function getDiffFormatString2(num)
	if num == 0 then
		return '-'
	else
		return string.format('%+.2f°', num)
	end
end
local function getFormatStringFunction(stat)
	if hasSecondDecimalPlace(stat.stand_hip)
	or hasSecondDecimalPlace(stat.stand_hip_run)
	or hasSecondDecimalPlace(stat.stand_hip_sprint)
	or hasSecondDecimalPlace(stat.stand_ads)
	or hasSecondDecimalPlace(stat.crouch_hip)
	or hasSecondDecimalPlace(stat.crouch_ads)
	or hasSecondDecimalPlace(stat.air_hip)
	or hasSecondDecimalPlace(stat.air_ads)
	or hasSecondDecimalPlace(stat.max_kick.stand_hip)
	or hasSecondDecimalPlace(stat.max_kick.stand_ads)
	or hasSecondDecimalPlace(stat.max_kick.crouch_hip)
	or hasSecondDecimalPlace(stat.max_kick.crouch_ads)
	or hasSecondDecimalPlace(stat.max_kick.air_hip)
	or hasSecondDecimalPlace(stat.max_kick.air_ads) then
		return getFormatString2
	else
		return getFormatString1
	end
end
local function getDiffFormatStringFunction(stat)
	if hasSecondDecimalPlace(stat.kick_on_fire.stand_hip)
	or hasSecondDecimalPlace(stat.kick_on_fire.stand_ads)
	or hasSecondDecimalPlace(stat.kick_on_fire.crouch_hip)
	or hasSecondDecimalPlace(stat.kick_on_fire.crouch_ads)
	or hasSecondDecimalPlace(stat.kick_on_fire.air_hip)
	or hasSecondDecimalPlace(stat.kick_on_fire.air_ads) then
		return getDiffFormatString2
	else
		return getDiffFormatString1
	end
end
function p.renderSpread(stat, quickdraw_holster, lang)
	local spread = cfg[lang].spread
	local getFormatString = getFormatStringFunction(stat)
	local getDiffFormatString = getDiffFormatStringFunction(stat)
	local layout
	if quickdraw_holster then
		layout = {
			state_colspan  = 4,
			hip_rowspan    = 7,
			stand_rowspan  = 5,
			hipads_colspan = 3,
		}
	else
		layout = {
			state_colspan  = 3,
			hip_rowspan    = 5,
			stand_rowspan  = 3,
			hipads_colspan = 2,
		}
	end
	
	local tbl = mw.html.create('table')
		:addClass('intable')
		:css('font-size', '92%')
	
	local header = tbl:tag('tr')
		:tag('th')
			:attr('colspan', layout.state_colspan)
			:wikitext(spread.state.name)
			:done()
		:tag('th')
			:wikitext(spread.first_shot)
			:done()
	
	local hideKickOnFire = isAllKickOnFireZero(stat.kick_on_fire)
	if not hideKickOnFire then
		header:tag('th')
				:wikitext(spread.increment)
				:done()
			:tag('th')
				:wikitext(spread.maximum)
	end
	
	-- Hipfire
	local hipfire = tbl:tag('tr')
		:tag('th')
			:addClass(spread.state.hip_class)
			:attr('rowspan', layout.hip_rowspan)
			:tag('span')
				:wikitext(spread.state.hip)
				:done()
			:done()
		:tag('th')
			:addClass(spread.state.stand_class)
			:attr('rowspan', layout.stand_rowspan)
			:tag('span')
				:wikitext(spread.state.stand)
				:done()
			:done()
		:tag('th')
			:attrIf(quickdraw_holster, { colspan = 2 })
			:cssIf(quickdraw_holster, { ['border-bottom'] = '0 none transparent' })
			:wikitext(spread.state.still)
			:done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.stand_hip))
			:done()
	if not hideKickOnFire then
		hipfire
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:attr('rowspan', layout.stand_rowspan)
				:wikitext(getDiffFormatString(stat.kick_on_fire.stand_hip))
				:done()
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(stat.stand_hip + stat.max_kick.stand_hip))
	end
	
	if quickdraw_holster then
		local quickhip = tbl:tag('tr')
			:tag('th')
				:css('border-top', '0 none transparent')
				:wikitext('  ')
				:done()
			:tag('th')
				:wikitext(iu.hopup('quickdraw_holster'))
				:done()
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(quickdraw_holster.stand_hip))
				:done()
		if not hideKickOnFire then
			quickhip:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(quickdraw_holster.stand_hip + stat.max_kick.stand_hip))
		end
	end
	
	local run = tbl:tag('tr')
		:tag('th')
			:attrIf(quickdraw_holster, { colspan = 2 })
			:cssIf(quickdraw_holster, { ['border-bottom'] = '0 none transparent' })
			:wikitext(spread.state.run)
			:done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.stand_hip_run))
			:done()
	if not hideKickOnFire then
		run:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.stand_hip_run + stat.max_kick.stand_hip))
	end
	
	if quickdraw_holster then
		local quickrun = tbl:tag('tr')
			:tag('th')
				:css('border-top', '0 none transparent')
				:wikitext('  ')
				:done()
			:tag('th')
				:wikitext(iu.hopup('quickdraw_holster'))
				:done()
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(quickdraw_holster.stand_hip_run))
				:done()
		if not hideKickOnFire then
			quickrun:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(quickdraw_holster.stand_hip_run + stat.max_kick.stand_hip))
		end
	end
	
	local sprint = tbl:tag('tr')
		:tag('th')
			:attrIf(quickdraw_holster, { colspan = 2 })
			:wikitext(spread.state.sprint)
			:done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.stand_hip_sprint))
			:done()
	if not hideKickOnFire then
		sprint:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.stand_hip_sprint + stat.max_kick.stand_hip))
	end
	
	-- Hipfire while crouching
	local crouch = tbl:tag('tr')
		:tag('th')
			:attr('colspan', layout.hipads_colspan)
			:wikitext(spread.state.crouch)
			:done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.crouch_hip))
			:done()
		
	if not hideKickOnFire then
		crouch
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getDiffFormatString(stat.kick_on_fire.crouch_hip))
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(stat.crouch_hip + stat.max_kick.crouch_hip))
	end
	
	-- Hipfire in the air
	local air = tbl:tag('tr')
		:tag('th')
			:attr('colspan', layout.hipads_colspan)
			:wikitext(spread.state.air)
			:done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.air_hip))
			:done()
	if not hideKickOnFire then
		air:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getDiffFormatString(stat.kick_on_fire.air_hip))
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.air_hip + stat.max_kick.air_hip))
	end
	
	-- ADS
	if stat.stand_ads == stat.crouch_ads
		and stat.kick_on_fire.stand_ads == stat.kick_on_fire.crouch_ads
		and stat.max_kick.stand_ads == stat.max_kick.crouch_ads then
		local ads = tbl:tag('tr')
			:tag('th')
				:addClass(spread.state.ads_class)
				:attr('rowspan', 3)
				:tag('span')
					:wikitext(spread.state.ads)
					:done()
				:done()
			:tag('th')
				:attr('colspan', layout.hipads_colspan)
				:wikitext(spread.state.standcrouch)
				:done()
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(stat.stand_ads))
				:done()
		if not hideKickOnFire then
			ads
				:tag('td')
					:addClass('cell-type-number')
					:attr('align', 'right')
					:wikitext(getDiffFormatString(stat.kick_on_fire.stand_ads))
				:tag('td')
					:addClass('cell-type-number')
					:attr('align', 'right')
					:wikitext(getFormatString(stat.stand_ads + stat.max_kick.stand_ads))
		end
	else
		local hipads = tbl:tag('tr')
			:tag('th')
				:addClass(spread.state.ads_class)
				:attr('rowspan', 3)
				:tag('span')
					:wikitext(spread.state.ads)
					:done()
				:done()
			:tag('th')
				:attr('colspan', layout.hipads_colspan)
				:wikitext(spread.state.stand)
				:done()
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(stat.stand_ads))
				:done()
		if not hideKickOnFire then
			hipads
				:tag('td')
					:addClass('cell-type-number')
					:attr('align', 'right')
					:wikitext(getDiffFormatString(stat.kick_on_fire.stand_ads))
				:tag('td')
					:addClass('cell-type-number')
					:attr('align', 'right')
					:wikitext(getFormatString(stat.stand_ads + stat.max_kick.stand_ads))
		end
		
		-- ADS while crouching
		local crouchads = tbl:tag('tr')
			:tag('th')
				:attr('colspan', layout.hipads_colspan)
				:wikitext(spread.state.crouch)
				:done()
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(stat.crouch_ads))
				:done()
		if not hideKickOnFire then
			crouchads
				:tag('td')
					:addClass('cell-type-number')
					:attr('align', 'right')
					:wikitext(getDiffFormatString(stat.kick_on_fire.crouch_ads))
				:tag('td')
					:addClass('cell-type-number')
					:attr('align', 'right')
					:wikitext(getFormatString(stat.crouch_ads + stat.max_kick.crouch_ads))
		end
	end
	
	-- ADS in the air
	local airads = tbl:tag('tr')
		:tag('th')
			:attr('colspan', layout.hipads_colspan)
			:wikitext(spread.state.air)
			:done()
		:tag('td')
			:addClass('cell-type-number')
			:attr('align', 'right')
			:wikitext(getFormatString(stat.air_ads))
			:done()
	if not hideKickOnFire then
		airads
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getDiffFormatString(stat.kick_on_fire.air_ads))
			:tag('td')
				:addClass('cell-type-number')
				:attr('align', 'right')
				:wikitext(getFormatString(stat.air_ads + stat.max_kick.air_ads))
	end
	
	return tbl
end
function p._main(name, lang)
	lang = lang or 'ja'
	
	local stat = mw.loadData('Module:Stat/Weapon')[name]
	local qkdw = stat.quickdraw_holster and stat.quickdraw_holster.spread
	local node = p.renderSpread(stat.spread, qkdw, lang)
	return tostring(node)
end
return p