| 🌟 | 現在、 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
モジュール:WeaponInfobox/Spread
ナビゲーションに移動
検索に移動
このモジュールについての説明文ページを モジュール:WeaponInfobox/Spread/doc に作成できます
require('Module:Utility/mw.html Extensions')
local p = {}
local cfg = mw.loadData('Module:WeaponInfobox/configuration')
local aw = require('Module:Utility/Library')
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 isAllSpreadSame(k)
return k.stand_hip_run == k.stand_hip
and k.stand_hip_sprint == k.stand_hip
and k.stand_ads == k.stand_hip
and k.crouch_hip == k.stand_hip
and k.crouch_ads == k.stand_hip
and k.air_hip == k.stand_hip
and k.air_ads == k.stand_hip
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 getDiffFormatString3(num)
if num == 0 then
return '-'
else
return string.format('%+.3f°', num)
end
end
local function getFormatStringFunction(stat, qkdw, hasHipfire)
if (qkdw and hasSecondDecimalPlace(qkdw.stand_hip))
or (qkdw and hasSecondDecimalPlace(qkdw.stand_hip_run))
or (hasHipfire and hasSecondDecimalPlace(stat.stand_hip))
or (hasHipfire and hasSecondDecimalPlace(stat.stand_hip_run))
or (hasHipfire and hasSecondDecimalPlace(stat.stand_hip_sprint))
or hasSecondDecimalPlace(stat.stand_ads)
or (hasHipfire and hasSecondDecimalPlace(stat.crouch_hip))
or hasSecondDecimalPlace(stat.crouch_ads)
or (hasHipfire and hasSecondDecimalPlace(stat.air_hip))
or hasSecondDecimalPlace(stat.air_ads)
or (hasHipfire and hasSecondDecimalPlace(stat.max_kick.stand_hip))
or hasSecondDecimalPlace(stat.max_kick.stand_ads)
or (hasHipfire and hasSecondDecimalPlace(stat.max_kick.crouch_hip))
or hasSecondDecimalPlace(stat.max_kick.crouch_ads)
or (hasHipfire and 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, lsrs, hasHipfire)
if (hasHipfire and hasSecondDecimalPlace(stat.kick_on_fire.stand_hip))
or hasSecondDecimalPlace(stat.kick_on_fire.stand_ads)
or (hasHipfire and hasSecondDecimalPlace(stat.kick_on_fire.crouch_hip))
or hasSecondDecimalPlace(stat.kick_on_fire.crouch_ads)
or (hasHipfire and hasSecondDecimalPlace(stat.kick_on_fire.air_hip))
or hasSecondDecimalPlace(stat.kick_on_fire.air_ads) then
if lsrs then
return getDiffFormatString3
else
return getDiffFormatString2
end
elseif lsrs then
return getDiffFormatString2
else
return getDiffFormatString1
end
end
local function renderKickOnFireCell(row, stat, target, env)
local base = stat[target]
row:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(env.getFormatString(stat[target]))
if not env.hideKickOnFire then
local incr = stat.kick_on_fire[target]
if incr == 0 then
row:tag('td')
:addClass('disabled')
:attr('align', 'center')
:attr('colspan', 2)
:wikitext(env.cfg.na)
else
row
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(env.getDiffFormatString(incr))
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(env.getFormatString(base + stat.max_kick[target]))
end
end
end
local lazerSightRatio = { 0.8, 0.6, 0.4 }
local function renderLazerRow(tbl, stat, level, colspan, env, target, target2)
local mul = lazerSightRatio[level]
local lazerhip = tbl:tag('tr')
:tag('th')
:css('border-top', '0 none transparent')
:wikitext(' ')
:done()
:tag('th')
:attrIf(colspan > 1, { colspan = colspan })
:wikitext(iu.attachment('レーザーサイト', level))
:done()
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(env.getFormatString(mul * stat[target]))
:done()
if not env.hideKickOnFire then
lazerhip
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(env.getDiffFormatString(mul * stat.kick_on_fire[target2 or target]))
:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(env.getFormatString(mul * (stat[target] + stat.max_kick[target2 or target])))
end
end
local function renderLazerRows(tbl, stat, colspan, env, target, target2)
renderLazerRow(tbl, stat, 1, colspan, env, target, target2)
renderLazerRow(tbl, stat, 2, colspan, env, target, target2)
renderLazerRow(tbl, stat, 3, colspan, env, target, target2)
end
function p.renderSpread(stat, lazer_sight, quickdraw_holster, lang)
local spread = cfg[lang].spread
local hasHipfire = aw.isNumberAndGreaterThanOrEqualToZero(stat.stand_hip)
local getFormatString = getFormatStringFunction(stat, quickdraw_holster, hasHipfire)
local getDiffFormatString = getDiffFormatStringFunction(stat, lazer_sight, hasHipfire)
local layout
if lazer_sight then
layout = {
state_colspan = 4,
hip_rowspan = 20,
stand_rowspan = 12,
hipads_colspan = 3,
concat_incr = false,
}
elseif quickdraw_holster then
layout = {
state_colspan = 4,
hip_rowspan = 7,
stand_rowspan = 5,
hipads_colspan = 3,
concat_incr = true,
}
else
layout = {
state_colspan = 3,
hip_rowspan = 5,
stand_rowspan = 3,
hipads_colspan = 2,
concat_incr = true,
}
end
local hideKickOnFire = isAllKickOnFireZero(stat.kick_on_fire)
local env = {
cfg = spread,
hideKickOnFire = hideKickOnFire,
getFormatString = getFormatString,
getDiffFormatString = getDiffFormatString,
}
if hideKickOnFire and isAllSpreadSame(stat) then
return mw.html.create('span')
:wikitext(getFormatString(stat.stand_hip))
end
local tbl = mw.html.create('table')
:addClass('intable')
local header = tbl:tag('tr')
:tag('th')
:attr('colspan', layout.state_colspan)
:wikitext(spread.state.name)
:done()
:tag('th')
:wikitext(spread.first_shot)
:done()
if not hideKickOnFire then
header:tag('th')
:wikitext(spread.increment)
:done()
:tag('th')
:wikitext(spread.maximum)
end
-- Hipfire
if hasHipfire then
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(lazer_sight or quickdraw_holster, { colspan = 2 })
: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')
:attrIf(layout.concat_incr, { 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 lazer_sight then
renderLazerRows(tbl, stat, 1, env, 'stand_hip')
elseif 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
if not layout.concat_incr then
quickhip:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(getDiffFormatString(stat.kick_on_fire.stand_hip))
end
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(lazer_sight or quickdraw_holster, { colspan = 2 })
: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
if not layout.concat_incr then
run:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(getDiffFormatString(stat.kick_on_fire.stand_hip))
end
run:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(getFormatString(stat.stand_hip_run + stat.max_kick.stand_hip))
end
if lazer_sight then
renderLazerRows(tbl, stat, 1, env, 'stand_hip_run', 'stand_hip')
elseif 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
if not layout.concat_incr then
quickrun:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(getDiffFormatString(stat.kick_on_fire.stand_hip))
end
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(lazer_sight or 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
if not layout.concat_incr then
sprint:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(getDiffFormatString(stat.kick_on_fire.stand_hip))
end
sprint:tag('td')
:addClass('cell-type-number')
:attr('align', 'right')
:wikitext(getFormatString(stat.stand_hip_sprint + stat.max_kick.stand_hip))
end
if lazer_sight then
renderLazerRows(tbl, stat, 1, env, 'stand_hip_sprint', 'stand_hip')
end
-- Hipfire while crouching
local crouch = tbl:tag('tr')
:tag('th')
:attr('colspan', layout.hipads_colspan)
:wikitext(spread.state.crouch)
:done()
renderKickOnFireCell(crouch, stat, 'crouch_hip', env)
if lazer_sight then
renderLazerRows(tbl, stat, layout.hipads_colspan - 1, env, 'crouch_hip')
end
-- Hipfire in the air
local air = tbl:tag('tr')
:tag('th')
:attr('colspan', layout.hipads_colspan)
:wikitext(spread.state.air)
:done()
renderKickOnFireCell(air, stat, 'air_hip', env)
if lazer_sight then
renderLazerRows(tbl, stat, layout.hipads_colspan - 1, env, 'air_hip')
end
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()
renderKickOnFireCell(ads, stat, 'stand_ads', env)
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()
renderKickOnFireCell(hipads, stat, 'stand_ads', env)
-- ADS while crouching
local crouchads = tbl:tag('tr')
:tag('th')
:attr('colspan', layout.hipads_colspan)
:wikitext(spread.state.crouch)
:done()
renderKickOnFireCell(crouchads, stat, 'crouch_ads', env)
end
-- ADS in the air
local airads = tbl:tag('tr')
:tag('th')
:attr('colspan', layout.hipads_colspan)
:wikitext(spread.state.air)
:done()
renderKickOnFireCell(airads, stat, 'air_ads', env)
return tbl
end
function p._main(name, lang)
lang = lang or 'ja'
local stat = mw.loadData('Module:Stat/Weapon')[name]
local lsrs = stat.attachments.laser_sight
local qkdw = stat.quickdraw_holster and stat.quickdraw_holster.spread
local node = p.renderSpread(stat.spread, lsrs, qkdw, lang)
return tostring(node)
end
return p