Smart Calculators

Smart

Calculators

ZDoom 傷害與 DPS 計算機

計算任何 ZDoom / GZDoom 武器或飛彈的精確傷害範圍、期望 DPS 與擊殺時間。包含 random(1,8) 倍率、STRIFEDAMAGE 旗標,以及給 ACS 腳本用的 tic 與秒互換器。

ZS>ZDoom 傷害與 DPS

毀滅戰士模組製作者的傷害範圍、DPS 與 tic 換算器。

計算任何飛彈、命中掃描武器或自訂 DamageFunction 的最小/平均/最大傷害。

傷害公式

使用 Damage × random(1, 8) — ZDoom 標準飛彈公式。

選擇原版《毀滅戰士》的飛彈即可自動填入 Damage。事後修改 Damage 會把預設切回自訂。

dmg

DECORATE/ZScript 中 Damage 後面寫的 N 值(例:小鬼火球 Damage 3)。

Strife 風格倍率:傷害 × random(1, 4),取代 × random(1, 8)。在任何 ZDoom MOD 的任何 actor 上都能運作,與基礎遊戲無關。

每次命中期望傷害
13.5
每次命中 3–24,平均 13.5
Damage 3 × random(1, 8)
每次命中最小傷害
3
每次命中最大傷害
24

傷害分布

random(1, N) 為均勻分布——每個倍率機率相同。

傷害分布3691215182124每次命中傷害機率期望值(13.5)
傷害分布資料表(螢幕閱讀器專用)。
每次命中傷害機率
312.5%
612.5%
912.5%
1212.5%
1512.5%
1812.5%
2112.5%
2412.5%

原版飛彈速查表

點選任一列即可載入到上方輸入欄。

飛彈Damage倍率最小最大平均速度(mu/tic)
小鬼火球 — DoomImpBall3× random(1, 8)32413.510
Cacodemon 電漿彈 — CacodemonBall5× random(1, 8)54022.510
蜘蛛幼龍電漿彈 — ArachnotronPlasma5× random(1, 8)54022.525
電漿步槍彈 — PlasmaBall5× random(1, 8)54022.525
地獄男爵/地獄騎士火球 — BaronBall8× random(1, 8)8643615
Mancubus 火球 — FatShot8× random(1, 8)8643620
Revenant 追蹤飛彈 — RevenantTracer10× random(1, 8)10804510
火箭(直擊) — Rocket20× random(1, 8)201609020
BFG 噴射(每束)67× 1..8 loop1512067.5
BFG 球體(直擊) — BFGBall100× random(1, 8)10080045025

可重現這些數值的 DECORATE/ZScript 片段。

ACTOR CustomProjectile : DoomImpBall
{
Damage 3
// Min 3 Max 24 Avg 13.5 (× random(1, 8))
}
更新於 2026年5月11日
OpenTTD 貨物收益計算機原神抽卡保底計算機

ZDoom 傷害計算機。給毀滅戰士模組作者的傷害幅度、DPS 與 tic 速查表。

ZDoom 傷害計算機把 Damage 值換算成遊戲內實際擲出的最小、平均、最大傷害,並算出期望 DPS 與 ACS Delay() 用的 tic 數。隨機倍率、+STRIFEDAMAGE 旗標、原版飛彈與掃描槍預設、19 種怪物 HP 表,以及 tic 與秒的換算,全部彙整在同一頁。

ZDoom 傷害與 DPS 計算機是什麼?

ZDoom 傷害與 DPS 計算機是一個網頁工具:輸入一支 actor 的 Damage 屬性、武器或飛彈預設,以及攻擊間隔,它會回傳精確的傷害幅度、期望 DPS、把原版《毀滅戰士》/《毀滅戰士 II》怪物打趴所需的擊發次數,以及 ACS Delay() 呼叫該寫多少 tic。它鎖定 ZDoom 與 GZDoom(也就是 DECORATE 與 ZScript actor 真正跑在上面的兩個 source port),完整重現 id Software 在 1997 年公開的引擎算術,把模組作者每天都會遇到的三道題目,整合進同一頁的三個模式。
這支計算機最想釐清的是「隨機倍率」。Damage 3 的飛彈在遊戲裡並不是固定打 3 點傷害,而是 3 乘上一個介於 1 到 8 的整數亂數,所以小惡魔(Imp)丟出的火球落在 3 到 24 之間,期望值是每發 13.5 點。在 Default 區塊裡寫 `Damage 10` 的自訂飛彈會丟出 10、20、30、40、50、60、70 或 80 點,唯獨不會剛好是 10。+STRIFEDAMAGE 旗標把倍率切成 random(1, 4),同樣的 Damage 10 就會落在 10、20、30、40 之中。掃描槍(hitscan)走另一條路徑:手槍、散彈槍、機關槍每顆鉛彈都是 5 乘上 random(1, 3),也就是 5、10 或 15;拳頭與電鋸則是 2 乘上 random(1, 10)。掃描槍 actor 的 Damage 屬性會被忽略,公式直接寫死在武器的動作函式裡。狂戰士(Berserk)加成只對拳頭生效,且在亂數結算之後再乘 10,其他武器都不吃這個 buff。
模式 2 把單發幅度轉成期望 DPS。輸入每顆鉛彈的傷害、鉛彈數、每次攻擊的 tic 數(actor 的 States 區塊在連續兩次 A_FireProjectile 或 A_FireBullets 之間所有 state 的總長度),再從原版的 19 種怪物挑一個目標:殭屍兵 20 HP、巨腦魔(Cacodemon)400、蜘蛛首腦(Spider Mastermind)3000、機械巨魔(Cyberdemon)4000,或是其他從 ZScript actor 定義一字一句抓出來的怪物。計算機會回傳單發期望傷害、期望 DPS、期望擊發次數、擊殺秒數,以及最佳運氣(每次都丟最大)和最差運氣(每次都丟最小)的擊發數,讓你看到的不只是平均值,而是整個區間。DamageFactor 欄位則對應抗性與弱點:0.5 代表減傷一半、2.0 代表雙倍受擊、0 代表完全免疫。
模式 3 涵蓋兩個換算器,是寫 ACS 腳本與調整飛彈飛行時間時繞不開的工具。第一個用 TICRATE = 35 在 tic 與秒之間互轉,所以新版 GZDoom(v3.2.2 起)裡 `Delay(35 * 2)` 就是準確的兩秒;在更早的版本中,計時器內的整數除法截斷會讓同樣的 35 tic 顯示成 0.98 秒。第二個把飛彈的 Speed 屬性(每 tic 多少 map unit)換成 map unit 每秒、公尺每秒、km/h 與 mph,採用 Doom 社群公認的「水平方向 16 map units = 1 英尺」比例。在 Speed 旁邊填上目標距離,還會得到按引擎方式向上取整成下一個 tic 的飛行時間。

如何計算 ZDoom 的傷害、DPS 與 tic 換算(以及這支計算機背後的流程)

ZDoom 模組討論(不論在巴哈姆特毀滅戰士哈啦板 bsn=5344、PTT、ZDoom 官方論壇還是 Discord)反覆出現三個問題,所以這裡把三組互相獨立的算式集中在同一頁。上方的計算機每次輸入變動都會即時跑完三組;想在丟回 WAD 之前先在紙上驗算的話,請對照下面這份手算流程。
使用計算機
1. 上方先選模式:傷害幅度、DPS 與擊殺時間、tic 與速度換算。切換模式時各自的輸入會保留下來。
2. 傷害幅度模式。挑符合你 actor 的子模式。「飛彈」子模式接受 Damage 值與選用的 +STRIFEDAMAGE 開關,回傳 Damage × 1(最小)、Damage × 4.5(平均)、Damage × 8(最大)。「掃描槍」子模式接受武器預設與鉛彈數,每顆鉛彈的公式已寫死。「自訂」子模式則直接接受最小與最大值,方便處理 DamageFunction 表達式。挑一個飛彈預設(小惡魔火球、巨腦魔電漿、電漿槍球、火箭、BFG 球、BFG 散射光線等共十款),就會自動從原版 actor 的 Default 區塊帶入 Damage。
3. DPS 模式。輸入每顆鉛彈的傷害、公式類型(飛彈/STRIFEDAMAGE/掃描槍)、鉛彈數、每次攻擊的 tic 數,再從 19 列原版怪物清單挑目標(也可手動填 HP)。展開進階摺疊區即可使用 DamageFactor 與目標 HP 覆寫。主結果卡顯示期望 DPS 與期望擊發次數;副卡列出擊殺秒數、最佳運氣(每次都丟最大)與最差運氣(每次都丟最小)的擊發次數。
4. tic 與速度模式。輸入 tic 數即可看到對應的秒數,反之亦然。下方輸入 Speed(每 tic 多少 map unit)以及選填的距離(map units),就會得到 map unit 每秒、m/s、km/h、mph,以及 tic 與秒兩種單位的飛行時間。
自己用紙筆算
1. 飛彈傷害幅度:min = $D$、max = $D \times 8$、期望值 = $D \times 4.5$。掛上 +STRIFEDAMAGE:max = $D \times 4$、期望值 = $D \times 2.5$。分布為均勻分布,1 到 8(或 1 到 4)每個倍率機率相同。
2. 掃描槍每顆鉛彈:手槍/散彈槍/機關槍 = $5 \times \text{random}(1, 3)$,平均 10。拳頭/電鋸 = $2 \times \text{random}(1, 10)$,平均 11。狂戰士對拳頭在亂數之後再乘以 10。把每發傷害乘以鉛彈數即為總傷害:散彈槍 7、超級散彈槍 20、其餘為 1。
3. 期望 DPS:$\text{DPS} = \frac{\text{單發期望傷害} \times 35}{\text{每次攻擊 tic}}$。其中 35 即為 TICRATE,每次攻擊 tic 為 actor 的 States 區塊裡,兩次連續開火呼叫之間所有 state 的時長總和。
4. 擊發次數:$\lceil \frac{\text{HP}}{\text{單發期望傷害} \times \text{damageFactor}} \rceil$。擊殺時間:擊發次數 × 每次攻擊 tic ÷ 35。
5. tic 換秒:tic ÷ 35。秒換 tic:round(秒 × 35)。在 ACS 裡直接寫 `Delay(35 * seconds)` 即可,乘法交給引擎處理。
6. 飛彈飛行:tic = $\lceil \frac{\text{距離}}{\text{Speed}} \rceil$、秒 = tic ÷ 35。引擎以整數 tic 為步進,所以一律向上取整。實際速度換算:$\text{mph} \approx \text{Speed} \times 1.49$、$\text{km/h} \approx \text{Speed} \times 2.4$、$\text{m/s} \approx \text{Speed} \times 0.667$。
預設情境的驗算:Damage 3 的小惡魔火球打巨腦魔(HP 400)。單發期望傷害 = $3 \times 4.5 = 13.5$,400 ÷ 13.5 ≈ 29.6,所以期望擊發 = 30 發。最差運氣(每次都最小)= $\lceil 400 / 3 \rceil$ = 134 發。最佳運氣(每次都最大)= $\lceil 400 / 24 \rceil$ = 17 發。同一隻巨腦魔換成超級散彈槍只要 2 到 4 發(最佳 2、最差 4、期望 2),因為 20 顆鉛彈的正規公式讓單發平均 200 傷害——也就是說,從拳頭、手槍一路換到 BFG 之間,你花在同一隻巨腦魔身上的時間能差到 15 倍。

傷害、DPS 與 tic 換算——引擎內的數學

damagemin=Dmmin,damagemax=Dmmax,E[damage]=Dmmin+mmax2DPS=E[damage per shot]35tattack,shots=HE[damage per shot]ftics=round(s35),travel=dv\begin{aligned} \text{damage}_{\min} &= D \cdot m_{\min}, \quad \text{damage}_{\max} = D \cdot m_{\max}, \quad \mathbb{E}[\text{damage}] = D \cdot \tfrac{m_{\min} + m_{\max}}{2} \\ \text{DPS} &= \frac{\mathbb{E}[\text{damage per shot}] \cdot 35}{t_{\text{attack}}}, \quad \text{shots} = \left\lceil \frac{H}{\mathbb{E}[\text{damage per shot}] \cdot f} \right\rceil \\ \text{tics} &= \text{round}(s \cdot 35), \quad \text{travel} = \left\lceil \frac{d}{v} \right\rceil \end{aligned}
  • DD = DECORATE 或 ZScript actor 的 Default 區塊中宣告的 Damage 屬性(整數)
  • mmin,mmaxm_{\min}, m_{\max} = 隨機倍率的上下界——預設為 1 與 8,掛 +STRIFEDAMAGE 為 1 與 4,手槍/散彈槍/機關槍的鉛彈為 1 與 3,拳頭/電鋸為 1 與 10
  • tattackt_{\text{attack}} = 每次攻擊的 tic 數——actor 的 States 區塊中,兩次連續開火呼叫之間 state machine 的時長
  • HH = 目標 HP——殭屍兵 20、小惡魔 60、巨腦魔 400、地獄男爵 1000、蜘蛛首腦 3000、機械巨魔 4000
  • ff = DamageFactor 倍率——1.0 正常、0.5 抗性、2.0 弱點、0.0 無敵
  • ss = 以秒為單位的時間——乘上 TICRATE = 35 並四捨五入為整數 tic,作為 state 時長或 Delay() 引數
  • d,vd, v = 飛行距離(map units)與飛彈 Speed(map units/tic);引擎以整數步進,故除法向上取整得到 tic 數
DPS 分母裡的 35 就是 TICRATE,id Software 在 1993 年寫進 doomdef.h 開頭那行的常數,從那之後 ZDoom、GZDoom 與所有 Doom source port 全部原封不動繼承下來。同一個常數驅動 DECORATE 與 ZScript 裡每一個 state 的時長:`TNT1 A 24` 這樣的 state 持續 24 tic,也就是塞進 DPS 分母的「每次攻擊 tic 數」。BFG 散射(spray)是 random(1, 8) 規則的唯一例外——每條光線的傷害是 15 次獨立 random(1, 8) 的總和,所以每條光線的範圍是 15 到 120,期望值 67.5;一顆 BFG 球最多射出 40 條光線。狂戰士的拳頭加成是在 random(1, 10) 結算之後乘 10,所以開狂戰士的拳頭傷害落在 20 到 200 之間,期望值 110。

完整數字逐步走過的範例

小惡魔火球 vs 巨腦魔——預設情境

小惡魔火球的 actor `DoomImpBall` 在 Default 區塊裡寫的是 Damage 3。單發範圍 = 3 到 24(3 乘上 1 到 8),期望值 = 13.5。巨腦魔 HP = 400(來自 `Cacodemon` actor 的 Health 屬性)。期望擊發次數 = $\lceil 400 / 13.5 \rceil$ = 30 發。最差運氣(每次都最小)= $\lceil 400 / 3 \rceil$ = 134 發。最佳運氣(每次都最大)= $\lceil 400 / 24 \rceil$ = 17 發。17 到 134 這個區間每次都嚇到剛入坑的模組作者:隨機倍率比 Damage 本身對結果的影響大得多。Damage 改成 6 雖然把期望直接砍半到 15 發,但最差運氣只縮到 67 發。

手槍打殭屍兵的 DPS——「手槍真的廢嗎」

手槍公式:每發 $5 \times \text{random}(1, 3)$,鉛彈數 1。單發範圍 = 5 到 15,期望值 = 10。原版 Doom 的 A_FirePistol 一分鐘大概打 150 發(每次循環 14 tic)。DPS = $10 \times 35 / 14$ ≈ 每秒期望 25 點傷害。殭屍兵 HP = 20,期望擊發 = $\lceil 20 / 10 \rceil$ = 2 發。最佳 2 發(連兩次擲到 15),最差 4 發(連四次擲到 5)。每次攻擊 14 tic 之下,擊殺秒數 = $2 \times (14/35) = 0.8$ 秒(期望),最差 1.6 秒。手槍並不廢——殭屍兵 2 發解決、小惡魔 6 發左右——但 DPS 大約只有機關槍的三分之一(每發公式一樣,可是每次攻擊只要 4 tic),更只有火箭炮的十分之一。這也是為什麼一撿到機關槍,手槍立刻退到備胎位置。

超級散彈槍打地獄騎士——貼臉開槍的現實值

超級散彈槍公式:每顆鉛彈 $5 \times \text{random}(1, 3)$,鉛彈數 20。單發範圍 = 100 到 300,期望值 = 200。地獄騎士 HP = 500。期望擊發 = $\lceil 500 / 200 \rceil$ = 3 發。最差運氣 = $\lceil 500 / 100 \rceil$ = 5 發(每顆鉛彈都擲到 1)。最佳運氣 = $\lceil 500 / 300 \rceil$ = 2 發(每顆鉛彈都擲到 3)。A_FireShotgun2 大概每分鐘 36.8 發(連同上膛、退殼共約 57 tic 一輪),所以三發解決的擊殺秒數 = $3 \times (57/35) \approx 4.9$ 秒。巴哈姆特哈啦板與 ZDoom 論壇常說的「兩發解決地獄騎士」只在運氣好的時候成立;穩當的規劃還是要算 3 發。

BFG 球直擊機械巨魔(不計散射)

BFG 球 actor `BFGBall` 的 Damage 為 100。每次直擊範圍 = 100 到 800,期望值 = 450。機械巨魔 HP = 4000,且對爆風免疫——只吃直擊。期望直擊次數 = $\lceil 4000 / 450 \rceil$ = 9 發。最佳運氣 = $\lceil 4000 / 800 \rceil$ = 5 發。最差運氣 = $\lceil 4000 / 100 \rceil$ = 40 發(每次都擲到最小)。維基百科上常見的「BFG 三到四發解決機械巨魔」是把散射光線也算進去的結論,而且預設玩家距離適中、機械巨魔整隻待在散射錐裡。BFG 真正高效的部位是散射:一發 BFG 球 + 40 條散射光線的全覆蓋擊發,期望輸出 = $450 + 40 \times 67.5 = 3150$,直擊跟錐型散射同時命中時,2 發就能讓機械巨魔倒地。

ACS Delay 換算——「2.5 秒是幾 tic」

每秒 tic 數 = 35。2.5 秒換成 tic = $\text{round}(2.5 \times 35)$ = round(87.5) = 88 tic。在 ACS 裡想保留可讀性可以寫 `Delay(35 * 25 / 10)`,想直接寫死也能用 `Delay(88)`。模組作者必記的常用數字:0.1 秒 = 4 tic、0.5 秒 = 18 tic、1 秒 = 35 tic、1.5 秒 = 53 tic、2 秒 = 70 tic、3 秒 = 105 tic、5 秒 = 175 tic、10 秒 = 350 tic。小惡魔火球 Speed = 10 map units/tic,飛 1024 map units 要 $\lceil 1024 / 10 \rceil$ = 103 tic ≈ 2.94 秒,大約 15 mph(10 × 1.49 ≈ 14.9)。電漿槍球 Speed 25 走同樣 1024 map units 只要 41 tic ≈ 1.17 秒,大約 60 km/h。

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 團隊審核驗證