ZDoom 傷害與 DPS 計算機
計算任何 ZDoom / GZDoom 武器或飛彈的精確傷害範圍、期望 DPS 與擊殺時間。包含 random(1,8) 倍率、STRIFEDAMAGE 旗標,以及給 ACS 腳本用的 tic 與秒互換器。
毀滅戰士模組製作者的傷害範圍、DPS 與 tic 換算器。
計算任何飛彈、命中掃描武器或自訂 DamageFunction 的最小/平均/最大傷害。
傷害公式
使用 Damage × random(1, 8) — ZDoom 標準飛彈公式。
選擇原版《毀滅戰士》的飛彈即可自動填入 Damage。事後修改 Damage 會把預設切回自訂。
dmg
DECORATE/ZScript 中 Damage 後面寫的 N 值(例:小鬼火球 Damage 3)。
傷害分布
random(1, N) 為均勻分布——每個倍率機率相同。
| 每次命中傷害 | 機率 |
|---|---|
| 3 | 12.5% |
| 6 | 12.5% |
| 9 | 12.5% |
| 12 | 12.5% |
| 15 | 12.5% |
| 18 | 12.5% |
| 21 | 12.5% |
| 24 | 12.5% |
原版飛彈速查表
點選任一列即可載入到上方輸入欄。
| 飛彈 | Damage | 倍率 | 最小 | 最大 | 平均 | 速度(mu/tic) |
|---|---|---|---|---|---|---|
| 小鬼火球 — DoomImpBall | 3 | × random(1, 8) | 3 | 24 | 13.5 | 10 |
| Cacodemon 電漿彈 — CacodemonBall | 5 | × random(1, 8) | 5 | 40 | 22.5 | 10 |
| 蜘蛛幼龍電漿彈 — ArachnotronPlasma | 5 | × random(1, 8) | 5 | 40 | 22.5 | 25 |
| 電漿步槍彈 — PlasmaBall | 5 | × random(1, 8) | 5 | 40 | 22.5 | 25 |
| 地獄男爵/地獄騎士火球 — BaronBall | 8 | × random(1, 8) | 8 | 64 | 36 | 15 |
| Mancubus 火球 — FatShot | 8 | × random(1, 8) | 8 | 64 | 36 | 20 |
| Revenant 追蹤飛彈 — RevenantTracer | 10 | × random(1, 8) | 10 | 80 | 45 | 10 |
| 火箭(直擊) — Rocket | 20 | × random(1, 8) | 20 | 160 | 90 | 20 |
| BFG 噴射(每束) | 67 | × 1..8 loop | 15 | 120 | 67.5 | — |
| BFG 球體(直擊) — BFGBall | 100 | × random(1, 8) | 100 | 800 | 450 | 25 |
可重現這些數值的 DECORATE/ZScript 片段。
ACTOR CustomProjectile : DoomImpBall{ Damage 3 // Min 3 Max 24 Avg 13.5 (× random(1, 8))}ZDoom 傷害計算機。給毀滅戰士模組作者的傷害幅度、DPS 與 tic 速查表。
ZDoom 傷害與 DPS 計算機是什麼?
如何計算 ZDoom 的傷害、DPS 與 tic 換算(以及這支計算機背後的流程)
傷害、DPS 與 tic 換算——引擎內的數學
- = DECORATE 或 ZScript actor 的 Default 區塊中宣告的 Damage 屬性(整數)
- = 隨機倍率的上下界——預設為 1 與 8,掛 +STRIFEDAMAGE 為 1 與 4,手槍/散彈槍/機關槍的鉛彈為 1 與 3,拳頭/電鋸為 1 與 10
- = 每次攻擊的 tic 數——actor 的 States 區塊中,兩次連續開火呼叫之間 state machine 的時長
- = 目標 HP——殭屍兵 20、小惡魔 60、巨腦魔 400、地獄男爵 1000、蜘蛛首腦 3000、機械巨魔 4000
- = DamageFactor 倍率——1.0 正常、0.5 抗性、2.0 弱點、0.0 無敵
- = 以秒為單位的時間——乘上 TICRATE = 35 並四捨五入為整數 tic,作為 state 時長或 Delay() 引數
- = 飛行距離(map units)與飛彈 Speed(map units/tic);引擎以整數步進,故除法向上取整得到 tic 數
完整數字逐步走過的範例
小惡魔火球 vs 巨腦魔——預設情境
手槍打殭屍兵的 DPS——「手槍真的廢嗎」
超級散彈槍打地獄騎士——貼臉開槍的現實值
BFG 球直擊機械巨魔(不計散射)
ACS Delay 換算——「2.5 秒是幾 tic」
ZDoom 傷害與平衡眉角——模組作者、地圖作者與好奇玩家都用得到
- 讀 actor 的 Damage 屬性時,要用「期望值」而不是「字面值」去想。Damage 5 的飛彈在遊戲裡平均 22.5(5 × 4.5),不是 5。如果你的自製怪物火球要跟小惡魔(期望 13.5)打成同一個等級,Damage 應該寫 3,不是 10。DECORATE 平衡最常見的錯誤就是把 Damage 10 當成「固定 10 傷害」,結果在遊戲裡跑出 10 到 80、平均 45 的數字。
- +STRIFEDAMAGE 旗標是最低成本的「收幅度」手段。Damage 值不變,最大倍率從 8 掉到 4,期望值從 4.5× 掉到 2.5×。想做一支「固定落在 60 到 240 之間,而不是 60 到 480」的自製火箭時非常好用。旗標雖然取名自 Strife(引擎第一個非 Doom IWAD),但跟基底遊戲無關——任何 ZDoom MOD 都能用,連純 Doom 套裝也照樣吃。
- 掃描槍完全無視 Damage 屬性。手槍、散彈槍、機關槍、超級散彈槍的 A_FireBullets/A_FirePistol/A_FireShotgun 內部寫死了每顆鉛彈 $5 \times \text{random}(1, 3)$。想加強掃描槍的傷害,必須改鉛彈數、改 A_CustomBulletAttack 的 damage 參數,或乾脆改造成飛彈型武器。拳頭與電鋸是 $2 \times \text{random}(1, 10)$;狂戰士只對拳頭生效,在亂數之後再乘 10(每拳 20 到 200,期望 110)。
- 比 DPS 時,每次攻擊的 tic 數比單發傷害更重要。機關槍跟手槍的每發公式一模一樣(5 到 15,期望 10),但機關槍每次攻擊大約 4 tic、手槍大約 14 tic——同樣的鉛彈算式,DPS 直接差到 3.5 倍。設計武器 MOD 時,先決定目標 DPS(原版手槍約 25、散彈槍約 70、超級散彈槍約 150、機關槍約 88、電漿槍約 263、火箭直擊約 159),再反推單發傷害與每次攻擊 tic。
- 19 種怪物速查表是設計遭遇戰的好工具。殭屍兵(HP 20)、散彈兵(30)、Wolfenstein SS(50)、小惡魔(60)、機關槍兵(70)、亡魂/指揮官基恩(100)、粉紅魔/影魔(150)、復仇者(300)、痛苦元素/巨腦魔(400)、地獄騎士/蜘蛛兵(500)、肥球(600)、阿奇威爾(700)、地獄男爵(1000)、蜘蛛首腦(3000)、機械巨魔(4000)。超級散彈槍一發(期望 200、最大 300)在最佳運氣下一槍就放倒復仇者(HP 300);痛苦元素與巨腦魔(HP 400)至少要兩發最佳運氣。手槍一發(期望 10)只放得倒殭屍兵。在地圖第一個房間放粉紅魔還是放肥球,是難度 4 倍而非 1.5 倍的差距——HP 曲線是等比上升,不是線性。
- GZDoom v3.2.2(2017 年底)起保證 35 tic 等於實時 1.000 秒。再早的版本因為計時器內整數除法截斷,tic 間隔被顯示為 28 ms,於是 35 tic 顯示成 0.98 秒。如果你的 ACS Delay() 算術需要次秒精度而且要支援 2017 年前的玩家版本,請預留 2% 的偏移:`Delay(35 * 60)` 在舊版計時器上其實只走了實時 58.8 秒,比整整一分鐘少 1.2 秒。
- BFG 散射是唯一一個不照 $\text{Damage} \times \text{random}(1, 8)$ 跑的飛彈。A_BFGSpray 內部把每條光線的傷害定義成 15 次獨立 random(1, 8) 的總和,所以單條光線範圍 15 到 120、期望 67.5,分布是鐘形而非均勻分布。BFG 球在前方 90 度錐裡最多射 40 條,全覆蓋擊發在 BFG 球本體 100 到 800 上面再疊 $40 \times 67.5 = 2700$ 點期望傷害——這就是「BFG 一發秒掉機械巨魔」傳說的真相,前提是直擊跟錐型散射同時命中。
- Map unit 的實尺換算有水平、垂直兩種,不是一條。水平方向:16 map units = 1 英尺(0.3048 m);垂直方向:因為原版 320×200 解析度被縱向拉長 20%,10 map units = 1 英尺。飛彈是沿著地圖平面飛的,所以 Speed 換算用水平比:Speed 10(小惡魔火球)≈ 6.67 m/s ≈ 15 mph;Speed 25(電漿、BFG 球)≈ 16.67 m/s ≈ 60 km/h ≈ 37 mph。毀滅戰士本人跑步速度大約 Speed 16,約 24 mph——這也是為什麼在窄走廊裡偶爾會被小惡魔咬到屁股。
- DamageFactor 讓你不必改傷害程式碼就能做抗性與弱點。在怪物身上寫 `DamageFactor 'Fire', 0.5` 會把 Fire 類傷害減半,2.0 加倍,0.0 完全免疫。計算機 DPS 模式以一個純量 DamageFactor 欄位呈現,可以不必宣告自訂傷害類型就快速比較「對 Fire 0.7 抗性的巨腦魔變體下,原版武器的 TTK 變多少」這種情境。
- 做生存型計算時,最差運氣與最佳運氣比期望值更實用。「期望擊發 = 30」這個數字藏住了一個極端結果:運氣最差時,巨腦魔可以硬吃 134 顆小惡魔火球。計算機之所以把最佳/最差跟期望一起列出來,就是為了這種情境——做大屠殺地圖、要在嚴格的彈藥預算內把怪物清掉時,要照最差運氣設計;做休閒地圖,照期望設計。random(1, 8) 的飛彈兩個數字差到 5 到 10 倍,並不少見。
- 在繁中環境寫 MOD 時,actor 名與屬性名一律維持引擎裡的英文寫法(Damage、Speed、Health、+STRIFEDAMAGE、Cacodemon、Cyberdemon 等)。DECORATE 與 ZScript 都不接受被本地化的識別字。巴哈姆特或維基百科上看到的「巨腦魔」「機械巨魔」只是給玩家看的譯名,程式碼裡仍然是 `Cacodemon`、`Cyberdemon`。PK3 內保持英文寫法,能替其他模組作者打開 WAD 時省下大把 debug 時間。
ZDoom 傷害計算機——常見問題
為什麼我寫 Damage 10 的飛彈有時候打出 80 點?
ZDoom 每次命中都會把飛彈的 Damage 屬性乘上 random(1, 8)。Damage 10 會等機率打出 10、20、30、40、50、60、70 或 80,平均 45。加上 +STRIFEDAMAGE 旗標後倍率變成 random(1, 4),落在 10、20、30、40 之間,平均 25。
原版毀滅戰士的手槍傷害公式是什麼?
手槍每發 $5 \times \text{random}(1, 3)$,也就是 5、10 或 15 等機率落點,期望值 10。機關槍跟散彈槍(每顆鉛彈)用同一條公式。掃描槍 actor 的 Damage 屬性會被忽略,公式是寫死在 A_FirePistol、A_FireShotgun、A_FireCGun 裡。
ZDoom 裡 1 秒等於幾 tic?
35 tic。TICRATE 自 1993 年發行版以來就鎖在 35。GZDoom v3.2.2 之後保證 35 tic 等於實時 1.000 秒;更早的版本把 tic 間隔截斷成 28 ms,所以 35 tic 顯示成 0.98 秒——這在長串 Delay() 累加時會以約 2% 的速率漂移。
ACS 裡要怎麼讓 X 秒延遲?
把秒數乘以 35 並四捨五入。0.5 秒 = 18 tic、1 秒 = 35 tic、2 秒 = 70 tic、5 秒 = 175 tic、10 秒 = 350 tic、60 秒 = 2100 tic。在 ACS 裡可以直接寫 `Delay(35 * seconds)`,引擎會在編譯時把乘法解掉。
+STRIFEDAMAGE 旗標到底在做什麼?
+STRIFEDAMAGE 把飛彈傷害倍率從 random(1, 8) 切成 random(1, 4)。Damage 值不變,幅度更窄、平均值更低。它取名自 Strife,但跟基底遊戲無關——任何 ZDoom MOD 都能用,包括純 Doom/Doom II 套裝。想要傷害更穩、波動更小的中威力飛彈時,這個旗標最划算。
機械巨魔的 HP 是多少?
4000 HP。機械巨魔(Cyberdemon)對爆風完全免疫——火箭與肥球的飛彈打到牠身邊都不會吃到爆風傷害,只能靠直擊。BFG9000 是慣例武器(連同散射約 2 到 4 個 trigger),其他選項包括貼臉超級散彈槍約 20 發、火箭直擊期望約 45 發(前提是彈藥夠)。計算機下方的 19 列怪物表完整列出原版每隻怪物的 HP。
BFG 的傷害為什麼這麼怪?「15 次循環」是什麼?
BFG 球本體照標準公式跑(Damage 100 × random(1, 8) = 100 到 800),可是散射光線不是。每條光線(最多 40 條)是把 15 次獨立 random(1, 8) 加總起來,所以單條光線範圍 15 到 120、期望 67.5。Doom Wiki 上提到的「P_Random 256-byte 偽亂數表決定論性」會把實機觀察到的單條光線範圍收窄到 49 到 87 之間,但理論最大值 120 不變。
ZScript actor 也能用這支計算機嗎?
可以。ZScript 與 DECORATE 共用同一套 Damage/DamageFunction/Speed/Health/+STRIFEDAMAGE 語意,差別只在語法。Default 區塊裡寫 `Damage 5;` 的 ZScript actor 跟同樣寫法的 DECORATE actor 擲出完全一樣的 $5 \times \text{random}(1, 8)$。本工具的輸出對兩者皆適用。
Brutal Doom 或 Project Brutality 也能用嗎?
對於還沿用標準 Damage 屬性與原版掃描槍函式的 actor 是可以的。Brutal Doom(Sergeant Mark IV 作)與 Project Brutality 把大部分武器改寫成自訂 DamageFunction 與 A_FireCustomMissile 路徑,不再遵守 random(1, 8) 倍率。對這類武器,計算機只能給出原版近似值,建議翻一下該 MOD 的 DECORATE/ZScript 自行修正。
PrBoom+、ZDoom、GZDoom、Zandronum 之間,傷害會不一樣嗎?
對原版《毀滅戰士》/《毀滅戰士 II》來說不會。PrBoom+、ZDoom、GZDoom、Zandronum 都把 TICRATE 35、random(1, 8) 與 random(1, 3) 公式、原版 HP 值一字不漏保留下來。不同 source port 的差異發生在進階功能(物理、MAPINFO、ZScript、MBF21 怪物腳本),不會發生在傷害基本算式上。同樣的亂數序列下,HP 400 的巨腦魔在四套引擎裡會用同樣的擊發數倒下。
復仇者的追蹤飛彈為什麼是 10 到 80 而不是 10 到 40?
`RevenantTracer` actor 雖然寫了 Damage 10,但沒有掛 +STRIFEDAMAGE 旗標,所以用預設 random(1, 8) 倍率,範圍 10 到 80、期望 45,不是 10 到 40。很多模組作者直覺以為復仇者火箭該走 Strife 風的數學——它其實不是。
難度(UV/Nightmare)會增加武器傷害嗎?
不會。Nightmare 把怪物攻擊性與彈藥拾取數加倍,但武器傷害在五個難度等級下完全相同。原版裡唯一存在的傷害倍率是狂戰士(Berserk),它把拳頭傷害乘以 10。難度改變的是「誰先開槍、開幾槍」,而不是「每槍打多重」。
這支計算機跟實機遊戲的精度差多少?
在 ZDoom/GZDoom 下跑原版《毀滅戰士》/《毀滅戰士 II》的行為時,引擎級精確。驗證範圍涵蓋每一個飛彈預設、每一支掃描槍、每一個怪物 HP,以及 BFG 散射的 15 次迴圈——傷害幅度、HP 與飛彈 Speed 與原版 actor 定義到單位都相符。DECORATE/ZScript 替換的 actor、自訂 DamageFunction 表達式、新世代《毀滅戰士》(2016、永恆、上古諸神)用不同算式,不在工具對應範圍。
工具是免費的嗎?要不要註冊?
完全免費,不必註冊,全部運算都在你的瀏覽器內完成。輸入會用 localStorage 在頁面重新整理之間保留,所選模式也會反映到網址查詢字串(?mode=damage / dps / tics)裡,方便書籤分享到巴哈姆特、Discord 或 ZDoom 論壇。
ZDoom 傷害與時間術語表
Damage 屬性
DECORATE 或 ZScript actor 的 Default 區塊中的整數屬性。引擎每次命中都會乘上 random(1, 8)(掛 +STRIFEDAMAGE 為 random(1, 4)),所以 Damage 10 在遊戲裡會跑出 10 到 80 的幅度,不是固定 10。
+STRIFEDAMAGE
把飛彈傷害倍率從 random(1, 8) 切成 random(1, 4) 的 actor 旗標。Damage 不變、幅度變窄、平均值降低(Damage × 2.5 而非 Damage × 4.5)。跟基底遊戲無關,任何 ZDoom MOD 都能使用。
tic
Doom 引擎的最小時間單位。TICRATE = 每秒 35 tic,1 tic ≈ 28.5714 ms。DECORATE/ZScript 的 state 時長與 ACS Delay() 引數都以 tic 表示。GZDoom v3.2.2 起保證 35 tic = 實時 1.000 秒,更早版本截斷成 28 ms。
掃描槍(Hitscan)武器
不透過飛彈 actor、沿著直線即時結算傷害的武器。手槍、散彈槍、超級散彈槍、機關槍都是掃描槍。公式直接寫死在 A_Fire* 動作函式裡(每顆鉛彈 $5 \times \text{random}(1, 3)$),actor 的 Damage 屬性會被忽略。
DamageFactor
對特定傷害類型的受擊倍率。`DamageFactor 'Fire', 0.5` 把 Fire 類傷害減半,2.0 雙倍、0.0 完全免疫。計算機 DPS 模式提供單一純量 DamageFactor 欄位,方便快速建模抗性與弱點情境。
狂戰士(Berserk)
把拳頭傷害在 random(1, 10) 結算後再乘 10 的能力強化道具,範圍 20 到 200、期望 110。電鋸、掃描槍、飛彈全都不吃這個 buff,只有拳頭吃。
Map unit
Doom 的空間座標單位。社群公認:水平 16 map units = 1 英尺 = 0.3048 m(毀滅戰士本人垂直 56 個單位高 = 5 英尺 7 英寸)。計算機用水平 16 mu/英尺的比例,把飛彈 Speed(map units/tic)換成 m/s、km/h、mph。
Speed 屬性
飛彈 actor 的速度(map units/tic)。小惡魔火球 Speed 10;火箭 Speed 20;電漿槍球與 BFG 球 Speed 25。乘以 35 得 map units/秒;乘以 0.667 得 m/s;乘以 1.49 得 mph。
BFG 散射(BFG spray)
BFG 球命中時釋放的 40 條光線錐型擴散(從 BFG 球的死亡 state 透過 A_BFGSpray 發射)。每條光線傷害為 15 次獨立 random(1, 8) 的總和——單條 15 到 120、期望 67.5。BFG 一發秒掉機械巨魔的傳說源自散射,本體球並不夠。
TICRATE
把 Doom 影格率鎖在每秒 35 tic 的引擎常數,自 1993 年以來不曾變過。在 id Software 的 doomdef.h 裡宣告,被 ZDoom、GZDoom、Zandronum、PrBoom+、Boom、MBF21 與所有原版相容 source port 一字不漏繼承。所有 state 時長、Delay() 引數、飛彈飛行時間都以 35 作為換算常數。
DamageFunction
Damage 屬性的替代品,讓模組作者在命中時透過 ZScript 表達式回傳任意整數,繞過 random(1, 8) 倍率。可以回傳定值來做確定性傷害,也可以依 inflictor/target/distance 動態計算,做出對情境敏感的行為。
P_Random
Doom 引擎的偽亂數函式,使用一張固定 256 byte、洗牌過的表,索引依序往前推進,每次呼叫回傳下一個 byte。分布並不均勻(值 1 永遠不出現、值 145 出現 5 次),但對戰鬥算術已足夠。所有傷害擲骰都使用它;M_Random 走另一條索引,給非遊戲性效果用,避免破壞多人連線的同步。
內容由 Smart Calculators 團隊審核驗證