| 🌟 | 現在、 鉄壁HSは通常HSと同じダメージになります。LMG及びDMR、チャージライフル、ハンマーポイント弾を除き、すべてのダメージ値が一致していることを確認しています。 |
「モジュール:Utility/ApexLibrary」の版間の差分
ナビゲーションに移動
検索に移動
(改造ローダーを使用時のマガジン計算の実装) |
(ヘルメット - レベル3の計算が間違っていた問題の修正) |
||
| (同じ利用者による、間の6版が非表示) | |||
| 18行目: | 18行目: | ||
return 0.2 + 0.8 * headmul | return 0.2 + 0.8 * headmul | ||
elseif part == apex.HEAD_HLMLV2 then | elseif part == apex.HEAD_HLMLV2 then | ||
return 0. | return 0.5 + 0.5 * headmul | ||
elseif part == apex.HEAD_HLMLV3 then | elseif part == apex.HEAD_HLMLV3 then | ||
return 0. | return 0.65 + 0.35 * headmul | ||
else | else | ||
return headmul | return headmul | ||
| 71行目: | 71行目: | ||
-- 小柄・鉄壁 | -- 小柄・鉄壁 | ||
base = apex.calcPassiveDamage(base, passive, opts) | if (opts and not opts.ignorePassiveForHeadshot) or partmul <= 1 then | ||
base = apex.calcPassiveDamage(base, passive, opts) | |||
end | |||
return base | return base | ||
| 139行目: | 141行目: | ||
local magazinesType = type(magazines) | local magazinesType = type(magazines) | ||
if magazinesType == 'table' then | if magazinesType == 'table' then | ||
return calcMagazinesWithModdedLoader(magazines) | return apex.calcMagazinesWithModdedLoader(magazines) | ||
elseif magazinesType == 'number' then | elseif magazinesType == 'number' then | ||
return calcMagazineWithModdedLoader(magazines) | return apex.calcMagazineWithModdedLoader(magazines) | ||
else | else | ||
return nil | return nil | ||
| 148行目: | 150行目: | ||
-- [[ 射撃レート計算 ]] | -- [[ 射撃レート計算 ]] | ||
function apex.calcBurstAverageFirerate(count, delay, firerate) | |||
return count / ((count - 1) / firerate + delay) | |||
end | |||
local function calcBurstAverageFirerate(stat, delay) | local function calcBurstAverageFirerate(stat, delay) | ||
return | return apex.calcBurstAverageFirerate(stat.burst_count, delay, stat.firerate) | ||
end | end | ||
2022年5月26日 (木) 00:01時点における最新版
このモジュールについての説明文ページを モジュール: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.5 + 0.5 * headmul
elseif part == apex.HEAD_HLMLV3 then
return 0.65 + 0.35 * 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)
-- 小柄・鉄壁
if (opts and not opts.ignorePassiveForHeadshot) or partmul <= 1 then
base = apex.calcPassiveDamage(base, passive, opts)
end
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 aw.isNumberAndGreaterThanZero(opts.beamdamage) and aw.isNumberAndGreaterThanZero(opts.beamticks)then
local beamdamage = apex.calcDamageFromPartAndPassive(opts.beamdamage, partmul, passive, opts)
base = base + opts.beamticks * beamdamage
end
return base
end
-- [[ マガジン計算 ]]
function apex.calcMagazineWithModdedLoader(magazine)
return aw.round(1.15 * magazine)
end
function apex.calcMagazinesWithModdedLoader(magazines)
return {
aw.round(1.15 * magazines[1]),
aw.round(1.15 * magazines[2]),
aw.round(1.15 * magazines[3]),
aw.round(1.15 * magazines[4]),
}
end
function apex.getMagazineWithModdedLoader(magazines)
local magazinesType = type(magazines)
if magazinesType == 'table' then
return apex.calcMagazinesWithModdedLoader(magazines)
elseif magazinesType == 'number' then
return apex.calcMagazineWithModdedLoader(magazines)
else
return nil
end
end
-- [[ 射撃レート計算 ]]
function apex.calcBurstAverageFirerate(count, delay, firerate)
return count / ((count - 1) / firerate + delay)
end
local function calcBurstAverageFirerate(stat, delay)
return apex.calcBurstAverageFirerate(stat.burst_count, delay, stat.firerate)
end
function apex.calcRechamberFirerate(firerate, rechamber)
return 1 / (1 / firerate + rechamber)
end
function apex.getFirerate(stat, opts)
stat = stat or mw.loadData('Module:Stat/Weapon')[opts.name]
-- Altfire mode
if opts.useAltfire and aw.isNumberAndGreaterThanZero(stat.altfire.firerate, stat.firerate) then
return stat.altfire.firerate
end
-- Burst mode
if aw.isNumberAndGreaterThanOrEqualToX(stat.burst_count, 2) then
local delay = stat.burst_delay
if type(delay) == 'table' then
return {
calcBurstAverageFirerate(stat, delay[1]),
calcBurstAverageFirerate(stat, delay[2]),
calcBurstAverageFirerate(stat, delay[3]),
calcBurstAverageFirerate(stat, delay[4]),
}
elseif aw.isNumberAndGreaterThanZero(delay) then
return calcBurstAverageFirerate(stat, delay)
end
end
-- Revved Up
if opts.useRevvedUpMode and aw.isNumberAndGreaterThanOrEqualToX(stat.firerate_revvedup, stat.firerate) then
return stat.firerate_revvedup
end
-- w/Turbocharger
if opts.useTurbocharger and stat.turbocharger then
return {
stat.turbocharger.firerate or stat.firerate,
stat.turbocharger.firerate_maximum or stat.firerate_maximum,
}
end
-- Variable firerate
if aw.isNumberAndGreaterThanOrEqualToX(stat.firerate_maximum, stat.firerate) then
return {
stat.firerate,
stat.firerate_maximum,
}
end
-- w/Anvil Receiver
if opts.useAnvilReceiver and stat.anvil_receiver then
return stat.anvil_receiver.firerate
end
-- w/Double Tap Trigger
if opts.useDoubleTapTrigger and stat.double_tap_trigger and aw.isNumberAndGreaterThanOrEqualToX(stat.double_tap_trigger.burst_count, 2) then
local delay = stat.double_tap_trigger.burst_delay
if type(delay) == 'table' then
return {
calcBurstAverageFirerate(stat.double_tap_trigger, delay[1]),
calcBurstAverageFirerate(stat.double_tap_trigger, delay[2]),
calcBurstAverageFirerate(stat.double_tap_trigger, delay[3]),
calcBurstAverageFirerate(stat.double_tap_trigger, delay[4]),
}
elseif aw.isNumberAndGreaterThanZero(delay) then
return calcBurstAverageFirerate(stat.double_tap_trigger, delay)
end
end
-- w/Deadeye's Tempo
if opts.useDeadeyesTempo and stat.deadeyes_tempo then
if aw.isNumberAndGreaterThanZero(stat.deadeyes_tempo.charge) then
if aw.isNumberAndGreaterThanZero(stat.deadeyes_tempo.charge_minimum) then
return {
apex.calcRechamberFirerate(stat.firerate, stat.deadeyes_tempo.charge_minimum),
apex.calcRechamberFirerate(stat.firerate, stat.deadeyes_tempo.charge),
}
else
return apex.calcRechamberFirerate(stat.firerate, stat.deadeyes_tempo.charge)
end
elseif aw.isNumberAndGreaterThanZero(stat.deadeyes_tempo.rechamber) then
return apex.calcRechamberFirerate(stat.firerate, stat.deadeyes_tempo.rechamber)
end
end
-- w/Charge
if aw.isNumberAndGreaterThanZero(stat.charge) then
if aw.isNumberAndGreaterThanZero(stat.charge_minimum) then
return {
apex.calcRechamberFirerate(stat.firerate, stat.charge_minimum),
apex.calcRechamberFirerate(stat.firerate, stat.charge),
}
elseif aw.isNumberAndGreaterThanZero(stat.rechamber) then
return {
apex.calcRechamberFirerate(stat.firerate, stat.rechamber),
apex.calcRechamberFirerate(stat.firerate, stat.rechamber + stat.charge),
}
else
return {
stat.firerate,
apex.calcRechamberFirerate(stat.firerate, stat.charge),
}
end
end
-- w/Rechamber
if type(stat.rechamber) == 'table' then
return {
apex.calcRechamberFirerate(stat.firerate, stat.rechamber[1]),
apex.calcRechamberFirerate(stat.firerate, stat.rechamber[2]),
apex.calcRechamberFirerate(stat.firerate, stat.rechamber[3]),
apex.calcRechamberFirerate(stat.firerate, stat.rechamber[4]),
}
elseif aw.isNumberAndGreaterThanZero(stat.rechamber) then
return apex.calcRechamberFirerate(stat.firerate, stat.rechamber)
end
return stat.firerate
end
return apex