🌟 | 現在、 鉄壁ヘッドショットには対応済みです。 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
「モジュール:WeaponInfobox/Spread」の版間の差分
ナビゲーションに移動
検索に移動
(クイックドローホルスターが有効な場合の桁数も判定するロジックを追加) |
(腰だめ拡散の非表示機能を実装) |
||
4行目: | 4行目: | ||
local cfg = mw.loadData('Module:WeaponInfobox/configuration') | local cfg = mw.loadData('Module:WeaponInfobox/configuration') | ||
local aw = require('Module:Utility/Library') | |||
local iu = require('Module:Utility/Image') | local iu = require('Module:Utility/Image') | ||
53行目: | 54行目: | ||
end | end | ||
local function getFormatStringFunction(stat, qkdw) | local function getFormatStringFunction(stat, qkdw, hasHipfire) | ||
if (qkdw and hasSecondDecimalPlace(qkdw.stand_hip)) | if (qkdw and hasSecondDecimalPlace(qkdw.stand_hip)) | ||
or (qkdw and hasSecondDecimalPlace(qkdw.stand_hip_run)) | or (qkdw and hasSecondDecimalPlace(qkdw.stand_hip_run)) | ||
or hasSecondDecimalPlace(stat.stand_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.stand_hip)) | ||
or hasSecondDecimalPlace(stat.stand_hip_run) | or (hasHipfire and hasSecondDecimalPlace(stat.stand_hip_run)) | ||
or hasSecondDecimalPlace(stat.stand_hip_sprint) | or (hasHipfire and hasSecondDecimalPlace(stat.stand_hip_sprint)) | ||
or hasSecondDecimalPlace(stat.stand_ads) | or hasSecondDecimalPlace(stat.stand_ads) | ||
or hasSecondDecimalPlace(stat.crouch_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.crouch_hip)) | ||
or hasSecondDecimalPlace(stat.crouch_ads) | or hasSecondDecimalPlace(stat.crouch_ads) | ||
or hasSecondDecimalPlace(stat.air_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.air_hip)) | ||
or hasSecondDecimalPlace(stat.air_ads) | or hasSecondDecimalPlace(stat.air_ads) | ||
or hasSecondDecimalPlace(stat.max_kick.stand_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.max_kick.stand_hip)) | ||
or hasSecondDecimalPlace(stat.max_kick.stand_ads) | or hasSecondDecimalPlace(stat.max_kick.stand_ads) | ||
or hasSecondDecimalPlace(stat.max_kick.crouch_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.max_kick.crouch_hip)) | ||
or hasSecondDecimalPlace(stat.max_kick.crouch_ads) | or hasSecondDecimalPlace(stat.max_kick.crouch_ads) | ||
or hasSecondDecimalPlace(stat.max_kick.air_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.max_kick.air_hip)) | ||
or hasSecondDecimalPlace(stat.max_kick.air_ads) then | or hasSecondDecimalPlace(stat.max_kick.air_ads) then | ||
return getFormatString2 | return getFormatString2 | ||
76行目: | 77行目: | ||
end | end | ||
local function getDiffFormatStringFunction(stat) | local function getDiffFormatStringFunction(stat, hasHipfire) | ||
if hasSecondDecimalPlace(stat.kick_on_fire.stand_hip) | if (hasHipfire and hasSecondDecimalPlace(stat.kick_on_fire.stand_hip)) | ||
or hasSecondDecimalPlace(stat.kick_on_fire.stand_ads) | or hasSecondDecimalPlace(stat.kick_on_fire.stand_ads) | ||
or hasSecondDecimalPlace(stat.kick_on_fire.crouch_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.kick_on_fire.crouch_hip)) | ||
or hasSecondDecimalPlace(stat.kick_on_fire.crouch_ads) | or hasSecondDecimalPlace(stat.kick_on_fire.crouch_ads) | ||
or hasSecondDecimalPlace(stat.kick_on_fire.air_hip) | or (hasHipfire and hasSecondDecimalPlace(stat.kick_on_fire.air_hip)) | ||
or hasSecondDecimalPlace(stat.kick_on_fire.air_ads) then | or hasSecondDecimalPlace(stat.kick_on_fire.air_ads) then | ||
return getDiffFormatString2 | return getDiffFormatString2 | ||
120行目: | 121行目: | ||
function p.renderSpread(stat, quickdraw_holster, lang) | function p.renderSpread(stat, quickdraw_holster, lang) | ||
local spread = cfg[lang].spread | local spread = cfg[lang].spread | ||
local getFormatString = getFormatStringFunction(stat, quickdraw_holster) | local hasHipfire = aw.isNumberAndGreaterThanOrEqualToZero(stat.stand_hip) | ||
local getDiffFormatString = getDiffFormatStringFunction(stat) | local getFormatString = getFormatStringFunction(stat, quickdraw_holster, hasHipfire) | ||
local getDiffFormatString = getDiffFormatStringFunction(stat, hasHipfire) | |||
local layout | local layout | ||
if quickdraw_holster then | if quickdraw_holster then | ||
172行目: | 174行目: | ||
-- Hipfire | -- Hipfire | ||
local hipfire = tbl:tag('tr') | 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() | :done() | ||
:tag('th') | |||
:addClass(spread.state.stand_class) | |||
:attr('rowspan', layout.stand_rowspan) | |||
:tag('span') | |||
:wikitext(spread.state.stand) | |||
:done() | |||
:done() | :done() | ||
:tag('th') | |||
:attrIf(quickdraw_holster, { colspan = 2 }) | |||
:wikitext(spread.state.still) | |||
:done() | :done() | ||
:tag('td') | :tag('td') | ||
:addClass('cell-type-number') | :addClass('cell-type-number') | ||
:attr('align', 'right') | :attr('align', 'right') | ||
:wikitext(getFormatString(stat | :wikitext(getFormatString(stat.stand_hip)) | ||
:done() | :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') | :tag('th') | ||
:wikitext( | :attrIf(quickdraw_holster, { colspan = 2 }) | ||
:wikitext(spread.state.run) | |||
:done() | :done() | ||
:tag('td') | :tag('td') | ||
:addClass('cell-type-number') | :addClass('cell-type-number') | ||
:attr('align', 'right') | :attr('align', 'right') | ||
:wikitext(getFormatString( | :wikitext(getFormatString(stat.stand_hip_run)) | ||
:done() | :done() | ||
if not hideKickOnFire then | if not hideKickOnFire then | ||
run:tag('td') | |||
:addClass('cell-type-number') | :addClass('cell-type-number') | ||
:attr('align', 'right') | :attr('align', 'right') | ||
:wikitext(getFormatString( | :wikitext(getFormatString(stat.stand_hip_run + stat.max_kick.stand_hip)) | ||
end | 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)) | |||
local | end | ||
end | |||
local sprint = tbl:tag('tr') | |||
:tag('th') | :tag('th') | ||
:wikitext( | :attrIf(quickdraw_holster, { colspan = 2 }) | ||
:wikitext(spread.state.sprint) | |||
:done() | :done() | ||
:tag('td') | :tag('td') | ||
:addClass('cell-type-number') | :addClass('cell-type-number') | ||
:attr('align', 'right') | :attr('align', 'right') | ||
:wikitext(getFormatString( | :wikitext(getFormatString(stat.stand_hip_sprint)) | ||
:done() | :done() | ||
if not hideKickOnFire then | if not hideKickOnFire then | ||
sprint:tag('td') | |||
:addClass('cell-type-number') | :addClass('cell-type-number') | ||
:attr('align', 'right') | :attr('align', 'right') | ||
:wikitext(getFormatString( | :wikitext(getFormatString(stat.stand_hip_sprint + stat.max_kick.stand_hip)) | ||
end | 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) | |||
-- 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) | |||
end | end | ||
-- ADS | -- ADS |
2021年8月14日 (土) 20:21時点における版
このモジュールについての説明文ページを モジュール: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 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, 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 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 function p.renderSpread(stat, 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, hasHipfire) 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 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(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') :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 }) :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() renderKickOnFireCell(crouch, stat, 'crouch_hip', env) -- 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) 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 qkdw = stat.quickdraw_holster and stat.quickdraw_holster.spread local node = p.renderSpread(stat.spread, qkdw, lang) return tostring(node) end return p