| 🌟 | 現在、 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
「モジュール:Utility/ApexLibrary」の版間の差分
ナビゲーションに移動
検索に移動
(新しいアンビルレシーバーのデータ構造に対応) |
(ディスラプター弾の計算順番が間違っていた不具合の修正) |
||
| 105行目: | 105行目: | ||
end | end | ||
-- | -- 部位倍率、小柄・鉄壁 | ||
base = apex. | base = apex.calcDamageFromPartAndPassive(base, partmul, passive, opts) | ||
-- ディスラプター弾 | -- ディスラプター弾 | ||
| 112行目: | 112行目: | ||
base = apex.calcDisruptorDamage(base, opts.disruptorRounds) | base = apex.calcDisruptorDamage(base, opts.disruptorRounds) | ||
end | end | ||
-- ビームダメージ | -- ビームダメージ | ||
2021年8月7日 (土) 13:54時点における版
このモジュールについての説明文ページを モジュール:Utility/ApexLibrary/doc に作成できます
local apex = {}
local aw = require('Module:Utility/Library')
-- 部位ダメージ用定数
apex.HEAD = 1
apex.HEAD_NOHLM = 1
apex.HEAD_HLMLV1 = 2
apex.HEAD_HLMLV2 = 3
apex.HEAD_HLMLV3 = 4
apex.BODY = 10
apex.LEGS = 100
apex.SKY = 1000
-- [[ ヘッドショット倍率の計算 ]]
function apex.calcHeadshotMultiplier(headmul, part)
if part == apex.HEAD_HLMLV1 then
return 0.2 + 0.8 * headmul
elseif part == apex.HEAD_HLMLV2 then
return 0.4 + 0.6 * headmul
elseif part == apex.HEAD_HLMLV3 then
return 0.5 + 0.5 * headmul
else
return headmul
end
end
-- [[ ハンマーポイント弾倍率を考慮したダメージ計算 ]]
function apex.calcHammerpointDamage(base, hammerpoint)
return math.floor(hammerpoint * base)
end
-- [[ 貫通減衰倍率を考慮したダメージ計算 ]]
function apex.calcPassthroughDamage(base, passthrough)
return aw.round(passthrough * base)
end
-- [[ 部位倍率を考慮したダメージ計算 ]]
function apex.calcPartDamage(base, partmul)
if partmul ~= 1 then
return aw.round(partmul * base)
else
return base
end
end
-- [[ ディスラプター弾倍率を考慮したダメージ計算 ]]
function apex.calcDisruptorDamage(base, disruptor)
return math.floor(disruptor * base)
end
-- [[ パッシブ倍率を考慮したダメージ計算 ]]
function apex.calcPassiveDamage(base, passive, opts)
if passive == 1.05 then
if not opts.round then
return aw.roundover(passive * base)
else
return aw.round(passive * base)
end
elseif passive ~= 1 then
return aw.round(passive * base)
else
return base
end
end
-- [[ 部位倍率とパッシブ倍率を考慮したダメージ計算 ]]
function apex.calcDamageFromPartAndPassive(base, partmul, passive, opts)
-- 部位倍率
base = apex.calcPartDamage(base, partmul)
-- 小柄・鉄壁
base = apex.calcPassiveDamage(base, passive, opts)
return base
end
-- [[ ダメージ計算 ]]
function apex.calcDamage(base, partmul, passive, opts)
opts = opts or {}
opts.hammerpointRounds = opts.hammerpointRounds or 0
opts.passthrough = opts.passthrough or 1
opts.disruptorRounds = opts.disruptorRounds or 0
-- 増幅バリケード
if opts.ampedCover then
base = aw.round(1.2 * base)
else
base = aw.round(base)
end
-- チャージ倍率
if opts.charged > 1 then
base = aw.round(opts.charged * base)
end
-- ハンマーポイント弾
if opts.hammerpointRounds > 1 then
base = apex.calcHammerpointDamage(base, opts.hammerpointRounds)
end
-- 貫通減衰倍率
if opts.passthrough < 1 then
base = apex.calcPassthroughDamage(base, opts.passthrough)
end
-- 部位倍率、小柄・鉄壁
base = apex.calcDamageFromPartAndPassive(base, partmul, passive, opts)
-- ディスラプター弾
if opts.disruptorRounds > 1 then
base = apex.calcDisruptorDamage(base, opts.disruptorRounds)
end
-- ビームダメージ
if opts.beam and aw.isNumberAndGreaterThanOrEqualToZero(opts.beam.damage) then
local beamdamage = apex.calcDamageFromPartAndPassive(opts.beam.damage, partmul, passive, opts)
base = base + opts.beam.ticks * beamdamage
end
return base
end
-- 射撃モード
apex.BURST = 0
apex.DOUBLE_TAP_TRIGGER = apex.BURST
apex.AUTO = 100
apex.SINGLE = 200
apex.ANVIL_RECEIVER = 201
apex.SELECTFIRE_RECEIVER = 300
-- [[ 複数の射撃レートが定義されているかどうか ]]
function apex.hasMultipleFirerate(stat, mode)
local firerate = stat.firarate
if not firarate then
return false
end
if mode == apex.BURST then
return type(firerate.burst_delay) == 'table'
elseif mode == apex.AUTO then
return type(firerate.auto) == 'table'
elseif mode == apex.SINGLE then
return type(firerate.single) == 'table' or type(firerate.single_rechamber) == 'table'
else
return false
end
end
-- [[ 射撃レート計算 ]]
local function chooseData(data, level)
local typename = type(data)
if typename == 'table' then
return data[level]
elseif typename == 'number' then
return data
elseif typename == 'string' then
return tonumber(data)
else
return 0
end
end
function apex.calcFirerate(stat, mode, level)
level = (1 + level) or 1
local rps = 0
if mode == apex.BURST then
if aw.isNumberAndGreaterThanZero(stat.mode.burst) then
local firerate = chooseData(stat.firerate.burst, level)
if firerate > 0 then
local delay = chooseData(stat.firerate.burst_delay, level)
if delay > 0 then
rps = stat.mode.burst / ((stat.mode.burst - 1) / firerate + delay)
else
rps = firerate
end
end
end
elseif mode == apex.AUTO then
if stat.mode.auto then
rps = chooseData(stat.firerate.auto, level)
end
elseif mode == apex.SINGLE then
if stat.mode.single then
local firerate = chooseData(stat.firerate.single, level)
if firerate > 0 then
local rechamber = chooseData(stat.firerate.single_rechamber, level)
if rechamber > 0 then
rps = 1 / (1 / firerate + rechamber)
else
rps = firerate
end
end
end
elseif mode == apex.ANVIL_RECEIVER then
if stat.mode.single and stat.anvil_receiver then
rps = chooseData(stat.anvil_receiver.firerate.single, level)
end
end
return rps
end
return apex