Smart Calculators

Smart

Calculators

ZDoom ダメージ・DPS 計算機

任意の ZDoom / GZDoom 武器・飛び道具について、正確なダメージ範囲、期待 DPS、撃破時間を算出。random(1,8) 倍率、STRIFEDAMAGE フラグ、ACS スクリプト用の tic ↔ 秒コンバータに対応。

ZS>ZDoom ダメージ・DPS

Doom モッダー向けのダメージ範囲・DPS・tic コンバータ。

任意の飛び道具・ヒットスキャン武器・カスタム DamageFunction について、最小・平均・最大ダメージを算出。

ダメージ計算式

Damage × random(1, 8) を使用 — ZDoom の標準飛び道具計算式。

バニラ Doom の飛び道具を選ぶと Damage が自動入力されます。後から Damage を編集するとプリセットはカスタムに戻ります。

dmg

DECORATE/ZScript の Damage に書く N の値(例:インプの火の玉なら Damage 3)。

Strife 系の倍率:damage × random(1, 8) の代わりに damage × random(1, 4)。ベースゲームを問わずどの ZDoom MOD でも動作します。

1 ヒットの期待ダメージ
13.5
1 ヒット 3–24、平均 13.5
Damage 3 × random(1, 8)
1 ヒットの最小ダメージ
3
1 ヒットの最大ダメージ
24

ダメージ分布

random(1, N) は一様分布 — 各倍率はすべて同確率。

ダメージ分布36912151821241 ヒットのダメージ確率期待値(13.5)
スクリーンリーダー向けダメージ分布データテーブル。
1 ヒットのダメージ確率
312.5%
612.5%
912.5%
1212.5%
1512.5%
1812.5%
2112.5%
2412.5%

バニラ飛び道具早見表

行をクリックすると上の入力欄に読み込まれます。

飛び道具Damage倍率最小最大平均Speed(mu/tic)
インプの火の玉 — DoomImpBall3× random(1, 8)32413.510
カコデーモンのプラズマ弾 — CacodemonBall5× random(1, 8)54022.510
アラクノトロンのプラズマ弾 — ArachnotronPlasma5× random(1, 8)54022.525
プラズマライフル弾 — PlasmaBall5× random(1, 8)54022.525
バロン・オブ・ヘル/ヘルナイトの火球 — BaronBall8× random(1, 8)8643615
マンキュバスの火球 — FatShot8× random(1, 8)8643620
レブナントの追尾ミサイル — RevenantTracer10× random(1, 8)10804510
ロケット(直撃) — Rocket20× random(1, 8)201609020
BFG スプレイ(1 光線あたり)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ダメージ計算機。Doomモッダー向けにダメージ幅・DPS・ticをまとめて算出。

ZDoomダメージ計算機は、Damage値を1発の最小・平均・最大、期待DPS、ACS Delay()用のticに変換するツールです。乱数倍率、+STRIFEDAMAGEフラグ、バニラの飛び道具とヒットスキャンのプリセット、19体ぶんのモンスターHP表、ticと秒の変換を1ページに集約しています。

ZDoomダメージ・DPS計算機とは?

ZDoomダメージ・DPS計算機は、アクターのDamageプロパティ、武器または飛び道具のプリセット、攻撃間隔を入力すると、正確なダメージ幅、期待DPS、バニラのDoom/Doom IIのモンスターをHPゼロにするまでの撃ち込み回数、ACS Delay()呼び出しに必要なtic数までを返すWebツールです。DECORATEとZScriptのアクターが暮らすソースポート、ZDoomとGZDoomを対象にしており、id Softwareが1997年12月に公開したソースコードと同じエンジン算術をそのまま再現しています。モッダーから繰り返し出る3つの質問を、1ページの3モードで一度に片付けます。
この計算機が解消する最大の混乱は乱数倍率です。Damage 3の飛び道具は、ゲーム内で必ず3ダメージを出すわけではありません。3に1から8までの整数乱数を掛けた値が出るので、インプの火の玉は1発あたり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に収まります。ヒットスキャン系の武器は別ルートで、ピストル・ショットガン・チェーンガンはペレット1発あたり5×random(1, 3)(つまり5・10・15のどれか)、パンチとチェーンソーは2×random(1, 10)を使います。ヒットスキャン・アクターのDamageプロパティは無視され、武器のアクション関数の中に式がベタ書きされています。バーサーク効果はパンチに限って乱数の後に×10倍され、他の武器は影響を受けません。
モード2は、その1発の幅を期待DPSへ変換します。ペレット1発のダメージ、ペレット数、攻撃間隔のtic数(アクターのStatesブロックでA_FireProjectileまたはA_FireBulletsを呼び出すまでの状態長の合計)と、攻撃対象を入力します。ゾンビマン20 HP、カコデーモン400、スパイダーマスターマインド3000、サイバーデーモン4000、あるいはZScriptアクター定義から取り出した19体のバニラモンスターのいずれかを選びます。出力は、1発の期待ダメージ、期待DPS、期待撃破回数、撃破までの秒数、ベストケース(毎回最大ロール)とワーストケース(毎回最小ロール)の撃破回数です。平均値だけでなく全範囲を確認できます。DamageFactor欄は耐性・弱点をカバーし、0.5なら半減、2.0なら倍化、0なら無敵を表します。
モード3は、ACSスクリプトを書くときと飛び道具の飛翔時間を調整するときに必要になる2つのコンバータです。1つ目は、TICRATE = 35という定数でticと秒を相互変換します。最新のGZDoom(v3.2.2以降)では `Delay(35 * 2)` がきっちり2秒です。v3.2.2より前は、タイマーコード内の整数除算の切り捨てによって、同じ35 ticが0.98秒と表示されていました。2つ目は、飛び道具のSpeedプロパティ(マップユニット/tic)を、マップユニット/秒、メートル/秒、km/h、mphへ換算します。Doomコミュニティで定着している「水平方向16マップユニット=1フィート」という換算比を採用しています。Speedの隣に目標距離を入れると、エンジンと同じく次のticへ切り上げた飛翔時間も出力されます。

ZDoomのダメージ・DPS・ticを計算する方法(この計算機が裏でやっていること)

DECORATEやZScript、ACSのスレッドでは3つの質問が常に繰り返されるので、ここでは3つの独立した計算を1か所に並べています。上の計算機は入力が変わるたびに3つすべてを再計算します。WADをリロードする前に紙の上で確認するなら、下の手計算手順を使ってください。
計算機の使い方
1. 上部でモードを選びます。ダメージ幅、DPSと撃破時間、ticと速度のコンバータの3つです。モードを切り替えても、それぞれの入力値はそのまま保持されます。
2. ダメージ幅モード。アクターに合わせたサブモードを選びます。「飛び道具」サブモードはDamage値と任意の+STRIFEDAMAGEスイッチを受け取り、Damage × 1(最小)、Damage × 4.5(平均)、Damage × 8(最大)を返します。「ヒットスキャン」サブモードは武器プリセットとペレット数を受け取り、ペレットごとの式はベタ書きで固定されています。「カスタム」サブモードは任意の最小値と最大値を受け取れるので、DamageFunctionで独自の式を組んでいる場合に役立ちます。飛び道具プリセット(インプの火の玉、カコデーモンのプラズマ弾、プラズマライフル弾、ロケット、BFGプラズマ弾、BFGスプレイの光線ほか計10種類)を選ぶと、対応するバニラアクターのDefaultブロックからDamageが自動補完されます。
3. DPSモード。ペレット1発のダメージ、式の種類(飛び道具/STRIFEDAMAGE/ヒットスキャン)、ペレット数、攻撃間隔のtic数を入力し、19体のバニラプリセットから対象モンスターを選びます(HPの直接入力も可)。詳細設定アコーディオンを開くと、DamageFactorと対象HPの上書きが使えます。メインカードは期待DPSと期待撃破回数を表示し、サブカードに撃破までの秒数、ベストケース(毎回最大ロール)、ワーストケース(毎回最小ロール)が並びます。
4. ticと速度モード。tic数を入力すれば対応する秒数が、秒数を入力すればtic数が表示されます。下段ではSpeed(マップユニット/tic)と任意の距離(マップユニット)を入れて、マップユニット/秒、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. ペレット1発のヒットスキャン:ピストル/ショットガン/チェーンガン = $5 \times \text{random}(1, 3)$、平均10。パンチ/チェーンソー = $2 \times \text{random}(1, 10)$、平均11。バーサーク中のパンチは、乱数の後に×10。ペレット数を掛けて合計を出します。ショットガン7、スーパーショットガン20、それ以外は1。
3. 期待DPS:$\text{DPS} = \frac{\text{1発の期待ダメージ} \times 35}{\text{攻撃間隔のtic}}$。35はTICRATE。攻撃間隔のticは、アクターのStatesブロックで連続するA_FireProjectileまたはA_FireBullets呼び出しの間の状態長の合計です。
4. 撃破回数:$\lceil \frac{\text{HP}}{\text{1発の期待ダメージ} \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)を倒します。1発の期待ダメージ = $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ペレットの正式な式では1発の平均が200ダメージになるので、1発あたり15倍の差が出ます。手にしている武器によって、1体のカコデーモンに費やす時間がこれだけ変わります。

ダメージ・DPS・ticの計算式(エンジン公式)

damagemin=Dmmin,damagemax=Dmmax,E[damage]=Dmmin+mmax2DPS=E[1発のdamage]35tattack,shots=HE[1発のdamage]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{1発のdamage}] \cdot 35}{t_{\text{attack}}}, \quad \text{shots} = \left\lceil \frac{H}{\mathbb{E}[\text{1発のdamage}] \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アクターのDefaultブロックに書かれるDamageプロパティ(整数)
  • mmin,mmaxm_{\min}, m_{\max} = 乱数倍率の範囲。デフォルトは1と8、+STRIFEDAMAGEなら1と4、ピストル/ショットガン/チェーンガンのペレットは1と3、パンチ/チェーンソーは1と10
  • tattackt_{\text{attack}} = 攻撃間隔のtic数。アクターのStatesブロックで、連続する射撃呼び出しの間にあるステートマシンの長さ
  • HH = 対象のHP。ゾンビマンは20、インプは60、カコデーモンは400、バロン・オブ・ヘルは1000、スパイダーマスターマインドは3000、サイバーデーモンは4000
  • ff = DamageFactor倍率。1.0で通常、0.5で耐性、2.0で弱点、0.0で無敵
  • ss = 秒単位の時間。TICRATE = 35を掛けて整数ticに丸めた値が、状態長やDelay()の引数になる
  • d,vd, v = 飛翔距離(マップユニット)と飛び道具のSpeed(マップユニット/tic)。エンジンは整数ステップで動くので、切り上げ除算でtic数が出る
DPSの分母にある35は、id Softwareが1993年に `doomdef.h` の冒頭で固定したTICRATE定数で、ZDoom、GZDoom、その他あらゆるDoomソースポートが一字一句そのまま継承しています。同じ定数はDECORATEとZScriptのすべての状態長を支配し、`TNT1 A 24` というステートは24 tic続きます。これがDPSの分母に入る攻撃間隔のticです。一様乱数random(1, 8)の例外はBFGスプレイの式だけです。A_BFGSprayの中で、1光線あたりのダメージは独立した15回のrandom(1, 8)の合計として計算されるため、1光線の範囲は15〜120、期待値67.5になります。BFGプラズマ弾は90度の前方コーンに最大40光線を放出します。バーサーク倍率は、パンチのrandom(1, 10)の後に適用されるので、バーサーク中のパンチは20〜200、期待値110に収まります。

実際の数字で追う計算例

インプの火の玉 vs カコデーモン — デフォルトシナリオ

インプの火の玉アクター `DoomImpBall` のDefaultブロックにはDamage 3が書かれています。1発の範囲 = 3〜24(3 × random(1, 8))、期待値 = 13.5。カコデーモンのHP = 400(`Cacodemon` アクターの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でゾンビマンを倒す — 「ピストルは本当に役立たず?」

ピストルの式:1発あたり $5 \times \text{random}(1, 3)$、ペレット1。1発の範囲 = 5〜15、期待値 = 10。バニラDoomのA_FirePistolは1分間に約150発(14 ticサイクル)で撃ちます。DPS = $10 \times 35 / 14$ ≈ 1秒あたり期待25ダメージ。ゾンビマンのHP = 20。期待撃破回数 = $\lceil 20 / 10 \rceil$ = 2発。ベストケース = 2発(15が2回連続)、ワーストケース = 4発(5が4回連続)。攻撃間隔14 ticでの撃破時間 = $2 \times (14/35) = 0{.}8$秒(期待値)、ワーストで1.6秒。ピストルは決して無用ではなく、ゾンビマンを2発、インプを6発程度で倒せます。ただし、DPSはチェーンガンの約1/3(1発あたりの式は同じで、攻撃間隔が約4 ticしかないため)、ロケットランチャーの約1/10です。チェーンガンが手に入った瞬間にピストルが控えに回るのは、この数字の差そのものです。

スーパーショットガンでヘルナイト — 至近距離の現実

スーパーショットガンの式:ペレットあたり $5 \times \text{random}(1, 3)$、ペレット20。1発の範囲 = 100〜300、期待値 = 200。ヘルナイトのHP = 500。期待撃破回数 = $\lceil 500 / 200 \rceil$ = 3発。ワーストケース = $\lceil 500 / 100 \rceil$ = 5発(全ペレットが1)。ベストケース = $\lceil 500 / 300 \rceil$ = 2発(全ペレットが3)。A_FireShotgun2は1分間に約36.8発(装填・リロード込みで約57 ticサイクル)で撃つので、3発で倒すときの撃破時間 = $3 \times (57/35) \approx 4{.}9$秒。「2発でヘルナイトを倒せる」というフォーラムの定説は乱数の都合がよい場合に限られ、3発を見込むのが現実的な計画です。

BFGプラズマ弾の直撃でサイバーデーモン(スプレイなし)

BFGプラズマ弾アクター `BFGBall` にはDamage 100が書かれています。直撃の範囲 = 100〜800、期待値 = 450。サイバーデーモンのHP = 4000、爆風ダメージ無効(爆発耐性のため、直撃ダメージしか通りません)。期待直撃回数 = $\lceil 4000 / 450 \rceil$ = 9発。ベストケース = $\lceil 4000 / 800 \rceil$ = 5発。ワーストケース = $\lceil 4000 / 100 \rceil$ = 40発(毎回最小ロール)。「BFGをサイバーデーモンに3〜4発撃ち込めば倒せる」というwiki記事の文言は、スプレイ光線も命中し、距離を保ってモンスターをコーン内に収めている前提です。BFGの真の効率はスプレイにあります。40光線フルカバレッジの1ショットで $450 + 40 \times 67{.}5 = 3150$ ダメージ(期待値)が乗り、直撃とコーンを同時に当てればサイバーデーモンを2発で沈められます。

ACS Delayの算術 — 「2.5秒は何tic?」

1秒あたりのtic = 35。2.5秒をticに変換:$\text{round}(2{.}5 \times 35)$ = round(87.5) = 88 tic。ACSでは可読性を残したいなら `Delay(35 * 25 / 10)`、ストレートに `Delay(88)` でもOK。モッダーが頭に入れておくべき定番値は、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マップユニット/tic。1024マップユニットの飛翔時間 = $\lceil 1024 / 10 \rceil$ = 103 tic ≈ 2.94秒、約15 mph(10 × 1.49 ≈ 14.9)。プラズマライフル弾はSpeed 25なので、同じ1024マップユニットを41 tic ≈ 1.17秒、約60 km/hで通過します。

モッダー・マッパー・好奇心旺盛なプレイヤー向け、ZDoomダメージとバランスのコツ

  • アクターのDamageプロパティは「リテラル値」ではなく「期待値」として読むこと。Damage 5の飛び道具はゲーム内で平均22.5(5 × 4.5)になり、5にはなりません。自作モンスターの火の玉をインプ(期待値13.5)と並ぶレベルにしたいならDamage 3に。Damage 10ではありません。DECORATEバランス調整で最も多い間違いは、Damage 10を「10ダメージ固定」と読むこと。実際は10〜80、平均45です。
  • +STRIFEDAMAGEフラグは飛び道具の幅を狭めたいときの最小コスト手段です。Damage値は同じで、最大倍率が8から4に下がり、期待値が4.5×から2.5×に下がります。たとえば60〜480ではなく60〜240の安定したカスタムロケットを作りたいときに便利です。Strife(エンジン初の非Doom IWAD)由来の名前ですが、フラグ自体はベースゲームを問わずどのZDoom MODでも動作し、Doom系MODでも普通に使われます。
  • ヒットスキャン武器は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)。
  • 攻撃間隔のtic数は、1発のダメージよりDPS比較で重要です。チェーンガンとピストルは1発の式(5〜15、期待値10)が同じですが、チェーンガンの攻撃間隔は約4 tic、ピストルは約14 tic。同じペレット計算でも約3.5倍のDPSになります。武器MODのバランスを調整するときは、まず目標DPS(バニラ・ピストル約25、ショットガン約70、スーパーショットガン約150、チェーンガン約88、プラズマライフル約263、ロケットランチャー直撃約159)を決めてから、それを生む1発のダメージと攻撃間隔を逆算します。
  • 19体ぶんのモンスター早見表で戦闘設計を点検しましょう。ゾンビマン(HP 20)、ショットガン兵(30)、Wolfenstein SS(50)、インプ(60)、チェーンガン兵(70)、ロストソウル/コマンダー・キーン(100)、デーモン/スペクター(150)、レブナント(300)、ペインエレメンタル/カコデーモン(400)、ヘルナイト/アラクノトロン(500)、マンキュバス(600)、アーチバイル(700)、バロン・オブ・ヘル(1000)、スパイダーマスターマインド(3000)、サイバーデーモン(4000)。スーパーショットガン1発(期待200、最大300)はベストケースでレブナント(HP 300)までを1発で落とせます。ペインエレメンタル/カコデーモン(HP 400)には最低でも2発が必要です。ピストル1発(期待10)が1発で倒せるのはゾンビマンだけ。マップ序盤の小部屋にデーモンを置くかマンキュバスを置くかは、難易度1.5倍ではなく4倍の差です。HPカーブは線形ではなく等比的に上がっていきます。
  • GZDoom v3.2.2(2017年12月)以降は35 ticがちょうど1秒と保証されます。それ以前のバージョンはtic間隔を28 msと表示していたため、35 ticが0.98秒に見えました。これはタイマーコード内の整数除算切り捨てが原因です。ACS Delay()の算術にサブ秒精度が必要で、なおかつ2017年以前のポートを想定する場合は、2%のドリフトを織り込んでください。`Delay(35 * 60)` はレガシータイマーで実時間58.8秒、フル1分より1.2秒短くなります。
  • BFGスプレイは、$\text{Damage} \times \text{random}(1, 8)$ の法則に従わない唯一の飛び道具です。A_BFGSprayの中では、1光線あたりのダメージが独立した15回のrandom(1, 8)の合計として計算されます。範囲15〜120、期待値67.5、分布は一様ではなくベル型です。BFGプラズマ弾は90度の前方コーンに最大40光線を放出するので、フルカバレッジで $40 \times 67{.}5 = 2700$ ダメージ(期待値)がBFG弾本体の100〜800に上乗せされます。BFGの1トリガーでサイバーデーモンを2発沈められる伝説の正体は、このスプレイです。直撃とコーンを同時に当てたときに限って成立します。
  • マップユニットの実寸換算は1種類ではなく2種類あります。水平方向は16マップユニット=1フィート(0.3048 m)、垂直方向は10マップユニット=1フィート(オリジナルの320×200モードが縦20%引き伸ばされていたため)。飛び道具は地図平面を飛ぶため、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モードでは、スカラー値1つでDamageFactorを入力するUIになっています。独自ダメージタイプを宣言しなくても、たとえばカコデーモンのプラズマ耐性0.7のような仮想バリアントに対してバニラ武器のTTKを比較できます。
  • 極端ケースとレンジは、平均値より生存判断で効いてきます。「期待撃破回数 = 30」という数字は、運の悪いケースだとカコデーモンがインプの火の玉を134発吸えてしまうことを隠します。計算機が期待値と並べてベスト/ワーストを表示しているのはそのためで、スローター系マップでモンスターを厳密な弾数予算内で倒さなければならない場面では、ワーストケースで設計します。通常マップなら期待値で設計します。random(1, 8)の飛び道具では、両者が5〜10倍乖離することも珍しくありません。
  • 日本語でMODを作る場合でも、アクター名やプロパティ名はエンジンに登場する英語表記のまま残します(Damage、Speed、Health、+STRIFEDAMAGE、Cacodemon、Cyberdemonなど)。DECORATEもZScriptもローカライズされた識別子を受け付けません。日本語のDoom解説ページでは「カコデーモン」や「サイバーデーモン」と訳されていても、コード内では `Cacodemon` `Cyberdemon` のままです。PK3に英語表記を維持しておけば、他のモッダーがWADを開いたときのデバッグ時間を何時間も節約できます。

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になります。

クラシックDoomのピストルのダメージ式は?

ピストルは1発あたり $5 \times \text{random}(1, 3)$、つまり1発5・10・15のどれかで期待値10です。チェーンガンとショットガンも(ペレットごとに)同じ式を使います。ヒットスキャン・アクターのDamageプロパティは無視され、式はA_FirePistol、A_FireShotgun、A_FireCGunの内部にベタ書きされています。

ZDoomで1秒は何tic?

35 ticです。TICRATEは1993年のオリジナルリリースから35に固定されています。GZDoom v3.2.2以降は35 tic = 実時間1.000秒を保証しますが、それ以前のバージョンは1 tic = 28 msに切り捨てていたため、35 tic = 0.98秒と表示されました。長いDelay()の連鎖では約2%のドリフトとして効いてきます。

ACS Delay()で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ならベースゲームを問わずに使えます。安定した中威力の飛び道具がほしいときに便利です。

サイバーデーモンのHPは?

4000 HPです。サイバーデーモンは爆発スプラッシュを無効化するため、ロケットやマンキュバスの弾の爆風は通りません。BFG9000が定番(スプレイ込みで約2〜4トリガー)、ほかにも至近距離のスーパーショットガン約20発、ロケット直撃を期待値で約45発でも倒せます(弾薬さえ続けば)。計算機下部の19行モンスター表に、すべてのバニラHP値が並んでいます。

BFGダメージが特殊なのはなぜ? 15回ループって何?

BFGプラズマ弾の本体は標準式(Damage 100 × random(1, 8) = 100〜800)に従いますが、スプレイの追尾光線だけ違います。最大40光線の各光線が、15回独立したrandom(1, 8)を合計し、1光線15〜120、期待値67.5になります。Doom Wikiにあるとおり、擬似乱数テーブルP_Random(256バイト固定)の決定論性により実プレイの範囲は理論最大より狭まりますが、1光線あたりの理論上限120は変わりません。

ZScriptアクターでもこの計算機は使える?

使えます。ZScriptとDECORATEは、Damage/DamageFunction/Speed/Health/+STRIFEDAMAGEのセマンティクスを共有しており、違うのは構文だけです。Defaultブロックに `Damage 5;` と書いたZScriptアクターは、同じプロパティを持つDECORATEアクターとまったく同じ $5 \times \text{random}(1, 8)$ をロールします。計算機の出力は両者に共通して有効です。

Brutal DoomやProject Brutalityでも使える?

標準のDamageプロパティとバニラのヒットスキャン関数を維持しているアクターについては有効です。Brutal Doom(Sergeant Mark IV作)とProject Brutalityは、ほとんどの武器を独自のDamageFunction式とカスタムA_FireCustomMissileルーチンで再定義していて、random(1, 8)倍率に従いません。それらの武器については、計算機はバニラの近似値を表示するので、対象MODのDECORATE/ZScriptを読んで個別のアクターで手動補正してください。

GZDoomの日本語翻訳は計算に影響する?

しません。GZDoomの日本語ファイル(公式翻訳スレッドで保守されているもの)が翻訳するのはメニュー・HUD・ログのみで、エンジン算術には触れません。同じrandom(1, 8)、TICRATE = 35、+STRIFEDAMAGE、モンスターHPは、英語ビルドでも日本語言語ファイルを読み込んだビルドでも完全に同じ挙動になります。

PrBoom+・ZDoom・GZDoom・Zandronumでダメージは違う?

バニラDoom/Doom IIに関しては違いません。PrBoom+、ZDoom、GZDoom、Zandronumはどれも、TICRATE 35、random(1, 8)とrandom(1, 3)の式、オリジナルのHP値を一字一句保存しています。ポート間の差は高機能(物理、MAPINFO、ZScript、MBF21モンスタースクリプト)で現れるもので、基本ダメージ算術には現れません。同じ乱数列ならHP 400のカコデーモンは4つのエンジンすべてで同じように沈みます。

ZScriptとDECORATE、ダメージ計算の違いは?

数学的な違いはなく、構文だけが違います。ZScriptはDECORATEの上位互換で、Defaultブロックの `Damage 10` は同じrandom(1, 8)をロールし、+STRIFEDAMAGEフラグも同じくrandom(1, 4)へ切り替わります。GZDoomではDECORATEは非推奨マーク付きですが互換性は維持されており、新規MODはZScript推奨です。この計算機のダメージ算術にとってはどちらでも同じです。

レブナントの追尾ミサイルが10〜40ではなく10〜80なのはなぜ?

アクター `RevenantTracer` はブロック内にDamage 10を持っていますが、+STRIFEDAMAGEフラグは付いていません。デフォルトのrandom(1, 8)倍率を使うので、範囲は10〜80、期待値は45です。10〜40ではありません。レブナントのロケットはStrife系の数学に見えるという誤解が多いですが、実体は標準のrandom(1, 8)です。

難易度(UV/ナイトメア)で武器ダメージは増える?

増えません。ナイトメアはモンスターの攻撃性と弾薬拾得を倍にしますが、武器ダメージは5段階すべての難易度で同一です。バニラDoomで存在するダメージ倍率はバーサーク効果のみで、パンチダメージを×10倍します。難易度が変えるのは「誰が先に・どれだけ撃ってくるか」であって、「1発がどれだけ重いか」ではありません。

実際のゲーム挙動と比べてこの計算機の精度は?

ZDoom/GZDoom上のバニラDoom/Doom IIの挙動については、エンジン正確です。検証範囲はすべての飛び道具プリセット、すべてのヒットスキャン武器、すべてのモンスターHP値、そしてBFGスプレイの15回ループまでカバーしています。ダメージ範囲・モンスターHP・飛び道具Speedはバニラのアクター定義と単位レベルで一致します。DECORATE/ZScriptで差し替えたアクター、独自のDamageFunction式、最新のドゥームシリーズ(Doom 2016、Eternal、The Dark Ages)は別の計算式を使うため対象外です。

このツールはニコニコ生放送やYouTubeのDoom実況用にも使える?

使えます。ゲーム実況や攻略動画で「BFGでサイバーデーモンが何発で落ちる?」「スーパーショットガンでヘルナイトは確定2発?」といったテロップ用の数字を出すのに便利です。期待値・ベスト・ワーストの3つを同時に表示しているので、視聴者向けに「平均と最悪ケースの差」をそのまま見せられます。配信中にメモ用のURLを残しておきたいときは、選んだモードがクエリ文字列(?mode=damage / dps / tics)として反映されるので、ブックマークから再現できます。


ZDoomダメージと時間の用語集

Damageプロパティ

DECORATEまたはZScriptアクターのDefaultブロックに書く数値プロパティで、エンジンがヒットごとにrandom(1, 8)を掛けます(+STRIFEDAMAGEならrandom(1, 4))。Damage 10と書いてもゲーム内では10固定にはならず、10〜80の幅が出ます。

+STRIFEDAMAGE

飛び道具のダメージ倍率をrandom(1, 8)からrandom(1, 4)に切り替えるアクターフラグ。Damage値は同じで、範囲が狭まり平均値が下がります(Damage × 4.5の代わりにDamage × 2.5)。ベースゲームを問わずどのZDoom MODでも動作します。

tic

Doomエンジンの原子的な時間単位。TICRATE = 1秒あたり35 tic、1 tic ≈ 28.5714 ms。DECORATE/ZScriptの状態長、ACS Delay()の引数はticで表されます。GZDoom v3.2.2以降は35 tic = 1.000秒を保証しますが、それ以前は28 msに切り捨てていました。

ヒットスキャン武器

飛び道具アクターを介さず、直線上で即座にダメージが解決される武器。ピストル、ショットガン、スーパーショットガン、チェーンガンがヒットスキャンです。式はアクション関数A_Fire*にベタ書きされており(ペレットあたり $5 \times \text{random}(1, 3)$)、アクターのDamageプロパティは無視されます。

DamageFactor

特定のダメージタイプへの被ダメージ倍率。`DamageFactor 'Fire', 0.5` はFireダメージを半減、2.0で倍化、0.0で完全無効化。計算機のDPSモードでは、耐性または弱点ケースをカバーするスカラーDamageFactor入力欄が出ます。

バーサーク

random(1, 10)のロール後にパンチダメージを×10倍するパワーアップ。範囲は20〜200、期待値110。ボーナスを受け取るのはパンチだけで、チェーンソー、ヒットスキャン、飛び道具は対象外です。

マップユニット(map unit)

Doomの空間座標単位。コミュニティ合意では水平16マップユニット = 1フィート = 0.3048 m(ドゥームガイは垂直56ユニットで5フィート7インチ)。計算機は水平比16 mu/フィートを使って、飛び道具のSpeed(マップユニット/tic)をm/s・km/h・mphに変換します。

Speedプロパティ

飛び道具アクターの速度(マップユニット/tic)。インプの火の玉Speed 10、ロケットSpeed 20、プラズマライフル弾とBFGプラズマ弾はSpeed 25。35を掛けるとマップユニット/秒、0.667を掛けるとm/s、1.49を掛けるとmphになります。

BFGスプレイ

BFGプラズマ弾が着弾時に放出する最大40光線のコーン(BFGプラズマ弾のDeathステートからA_BFGSprayが発射します)。各光線のダメージは独立した15回のrandom(1, 8)の合計で、1光線あたり15〜120、期待値67.5。BFGがサイバーデーモンを1ショットで倒すという伝説はスプレイの貢献で、本体プラズマ弾だけでは届きません。

TICRATE

Doomのフレームレートを1993年から35 tic/秒に固定しているエンジン定数。id Softwareの `doomdef.h` で宣言されており、ZDoom、GZDoom、Zandronum、PrBoom+、Boom、MBF21その他すべてのバニラ互換ソースポートが一字一句そのまま継承しています。すべての状態長、Delay()引数、飛び道具の飛翔時間計算で、変換定数として35が使われます。

DamageFunction

Damageプロパティの代替で、モッダーがヒット時にZScript式から任意の整数を返せる仕組み。random(1, 8)倍率を回避できるため、固定値を返して決定論的ダメージを出すか、inflictor/target/distanceから計算してコンテキスト感応的な挙動を作るかを選べます。

P_Random

Doomエンジンの擬似乱数関数。0〜255のシャッフル済み256バイト固定テーブルをインデックスが順に進み、呼び出しごとに次のバイトを返します。均一分布ではありませんが(値1は1回も出てこず、145は5回出る)、戦闘算術には十分です。すべてのダメージロールに使われています。M_Randomは非ゲーム効果用に別インデックスを持ち、マルチプレイの同期を壊さないようになっています。


Smart Calculators チームによる検証済みコンテンツ