Smart Calculators

Smart

Calculators

Калькулятор урона и DPS ZDoom

Считайте точный диапазон урона, ожидаемый DPS и время до смерти для любого оружия или снаряда ZDoom / GZDoom. Включает множитель random(1,8), флаг STRIFEDAMAGE и конвертер тиков в секунды для ACS-скриптов.

ZS>Урон и DPS ZDoom

Диапазон урона, DPS и конвертер тиков для моддеров Doom.

Считает мин/среднее/макс урона для любого снаряда, хитскан-оружия или произвольного DamageFunction.

Формула урона

Использует Damage × random(1, 8) — стандартную формулу снаряда ZDoom.

Выберите vanilla-снаряд Doom, чтобы автозаполнить Damage. Изменение Damage возвращает пресет в Custom.

dmg

N после Damage в DECORATE/ZScript (например, Damage 3 у огнешара импа).

Множитель в стиле Strife: damage × random(1, 4) вместо × random(1, 8). Работает с любым актором в любом ZDoom-моде независимо от базовой игры.

Ожидаемый урон за попадание
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%

Vanilla-снаряды

Кликните строку, чтобы загрузить в поля ввода выше.

СнарядDamageМножительМинМаксСреднееSpeed (ед./тик)
Огнешар Импа — 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 (на луч)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))
}
Обновлено 11 мая 2026 г.
Калькулятор грузового дохода OpenTTDКалькулятор гаранта Genshin Impact

Калькулятор урона ZDoom. Диапазон, DPS и тики для моддеров Doom.

Калькулятор урона ZDoom превращает значение Damage актора в минимум, среднее и максимум за попадание, ожидаемый DPS и тики для арифметики ACS Delay(). На одной странице собраны случайный множитель, флаг +STRIFEDAMAGE, пресеты vanilla-снарядов и хитсканов, таблица HP на 19 монстров и конвертер тиков в секунды.

Что такое калькулятор урона и DPS ZDoom?

Калькулятор урона и DPS ZDoom — это веб-инструмент, который по свойству Damage, выбранному пресету оружия или снаряда и темпу атаки возвращает точный диапазон урона, ожидаемый DPS, число выстрелов до смерти любого vanilla-монстра Doom или Doom II и количество тиков для вызова ACS Delay(). Он нацелен на ZDoom и GZDoom — порты, в которых живут акторы DECORATE и ZScript, — повторяет ту же арифметику движка, которую id Software опубликовала в исходниках 1997 года, и собирает три самых частых вопроса моддеров в три режима на одной странице.
Главная путаница, которую снимает калькулятор, — случайный множитель. По умолчанию снаряд с Damage 3 не бьёт в игре ровно на 3: он бьёт на 3, умноженное на случайное целое от 1 до 8, поэтому огнешар импа ложится в диапазон от 3 до 24 со средним 13,5 за попадание. Свой проджектайл со свойством Damage 10 в блоке Default наносит 10, 20, 30, 40, 50, 60, 70 или 80 — но никогда ровно 10. Флаг +STRIFEDAMAGE меняет множитель на random(1, 4): тот же Damage 10 ложится теперь в 10, 20, 30 или 40. У хитскан-оружия путь другой: пистолет, дробовик и пулемёт стреляют по формуле 5 умножить на random(1, 3) на каждый pellet (5, 10 или 15), а кулак и бензопила — 2 умножить на random(1, 10). Свойство Damage на хитскан-акторе игнорируется — формула зашита внутри функции выстрела. Усиление Берсерк после случайного броска умножает урон кулака на 10; ничто другое от этого бонуса не получает.
Второй режим превращает диапазон за выстрел в ожидаемый DPS. Введите урон за pellet, число pellet'ов, тики между атаками (длительность стейтов между двумя последовательными вызовами A_FireProjectile или A_FireBullets) и выберите цель — Зомби-человек 20 HP, Какодемон 400, Паук-предводитель 3000, Кибердемон 4000 или любого из 19 монстров vanilla из определений ZScript. Калькулятор возвращает ожидаемый урон за выстрел, ожидаемый DPS, ожидаемое число выстрелов до смерти, время до смерти в секундах, лучший и худший случай по числу выстрелов — чтобы был виден весь разброс, а не только среднее. Поле DamageFactor закрывает кейс сопротивлений и уязвимостей (0,5 — половина урона, 2,0 — двойной, 0 — неуязвимость).
Третий режим — два конвертера, которые моддеру нужны каждый раз, когда он трогает ACS или балансирует время полёта снаряда. Первый переводит тики в секунды по константе TICRATE = 35: Delay(35 * 2) — это ровно две секунды в современном GZDoom (v3.2.2 и новее), а до v3.2.2 те же 35 тиков давали 0,98 секунды из-за квантования по 28 мс. Второй переводит свойство Speed снаряда (единицы карты за тик) в единицы карты в секунду, метры в секунду, км/ч и мили/ч — по принятому в сообществе соотношению 16 горизонтальных единиц карты = 1 фут. Если рядом со Speed задать расстояние, появится и время полёта, округлённое вверх до следующего тика — так и шагает движок.

Как посчитать урон, DPS и тики ZDoom (и как это делает калькулятор)

Здесь собраны три независимых расчёта — потому что три вопроса повторяются в каждой ветке про DECORATE, ZScript и ACS. Калькулятор сверху прогоняет все три на каждом изменении ввода; ручная версия ниже — та, которую вы запускаете на бумаге, прежде чем пересобирать WAD.
Через инструмент
1. Выберите режим сверху: Диапазон урона, DPS и время до смерти или Конвертер тиков и скорости. Каждый режим хранит свои входы при переключении.
2. Режим диапазона урона. Выберите подрежим под вашего актора. Подрежим «Снаряд» принимает значение Damage и опциональный переключатель +STRIFEDAMAGE и выводит Damage × 1 (минимум), Damage × 4,5 (среднее) и Damage × 8 (максимум). Подрежим «Хитскан» принимает пресет оружия и число pellet'ов — формула за pellet зашита. Подрежим «Произвольно» принимает свободные min и max, если вы пишете выражение через DamageFunction. Выбор пресета снаряда (огнешар импа, плазма какодемона, рокета, плазма-ракета BFG, луч спрея BFG и ещё шесть) автоматически подставляет Damage из блока Default vanilla-актора.
3. Режим DPS. Введите урон за pellet, тип формулы (проджектайл, STRIFEDAMAGE или хитскан), число pellet'ов, тики между атаками и выберите монстра из таблицы 19 vanilla-пресетов (или впишите свой HP). В развёрнутом блоке доступны DamageFactor и переопределение HP на конкретную цель. Главная строка — ожидаемый DPS и ожидаемое число выстрелов до смерти; во вспомогательных карточках — время до смерти в секундах, лучший случай (каждый бросок — максимум) и худший (каждый бросок — минимум).
4. Режим тиков и скорости. Введите число тиков и сразу увидите секунды или наоборот. Ниже введите Speed (единицы карты за тик) и при желании расстояние в единицах карты — получите скорость в ед./сек., м/с, км/ч и милях/ч, а также время полёта в тиках и секундах.
Руками
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. Урон хитскана за pellet: пистолет / дробовик / пулемёт = $5 \times \text{random}(1, 3)$, среднее 10 за pellet. Кулак / бензопила = $2 \times \text{random}(1, 10)$, среднее 11. Берсерк умножает урон кулака на 10 после броска. Умножьте на число pellet'ов: дробовик 7, супердробовик 20, всё остальное 1.
3. Ожидаемый DPS: $\text{DPS} = \frac{\text{среднее за выстрел} \times 35}{\text{тики между атаками}}$. 35 — это TICRATE; тики между атаками — сумма длительностей стейтов между двумя последовательными вызовами A_FireProjectile или A_FireBullets в блоке States актора.
4. Выстрелов до смерти: $\lceil \frac{\text{HP}}{\text{среднее за выстрел} \times \text{damageFactor}} \rceil$. Время до смерти: число выстрелов умножить на тики между атаками и разделить на 35.
5. Тики в секунды: тики разделить на 35. Секунды в тики: round(секунды × 35). Для Delay() в ACS пишите `Delay(35 * seconds)` напрямую — умножение движок сделает сам.
6. Полёт снаряда: тики = $\lceil \frac{\text{расстояние}}{\text{Speed}} \rceil$, секунды = тики разделить на 35. Движок шагает целыми тиками, поэтому всегда округление вверх. Реальная скорость: $\text{миль/ч} \approx \text{Speed} \times 1{,}49$, $\text{км/ч} \approx \text{Speed} \times 2{,}4$, $\text{м/с} \approx \text{Speed} \times 0{,}667$.
Контрольный пересчёт сценария по умолчанию: огнешар импа (Damage 3) бьёт по Какодемону (HP 400). Среднее за выстрел = $3 \times 4{,}5 = 13{,}5$. 400 разделить на 13,5 = 29,6 — значит ожидаемое число выстрелов до смерти равно 30. Тот же Какодемон умирает от 2–4 выстрелов из супердробовика (лучший случай 2, худший 4, ожидаемый 2): один выстрел даёт в среднем 200 урона по канонической формуле на 20 pellet'ов — пятнадцатикратная разница за выстрел, которая прямо переводится в то, сколько секунд вы тратите на одного Какодемона в зависимости от оружия в руке.

Урон, DPS и тики — формулы движка

damagemin=Dmmin,damagemax=Dmmax,E[damage]=Dmmin+mmax2DPS=E[damage за выстрел]35tattack,shots=HE[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{damage за выстрел}] \cdot 35}{t_{\text{attack}}}, \quad \text{shots} = \left\lceil \frac{H}{\mathbb{E}[\text{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 = Свойство Damage из блока Default актора DECORATE или ZScript (целое число)
  • mmin,mmaxm_{\min}, m_{\max} = Границы случайного множителя — 1 и 8 по умолчанию; 1 и 4 с +STRIFEDAMAGE; 1 и 3 для пуль пистолета/дробовика/пулемёта; 1 и 10 для кулака/бензопилы
  • tattackt_{\text{attack}} = Тики между атаками — длительность машины состояний между двумя последовательными вызовами стрельбы в блоке States актора
  • HH = HP цели — 20 у Зомби-человека, 60 у Импа, 400 у Какодемона, 1000 у Барона ада, 3000 у Паука-предводителя, 4000 у Кибердемона
  • ff = Множитель DamageFactor — 1,0 норма, 0,5 сопротивление, 2,0 уязвимость, 0,0 неуязвимость
  • ss = Время в секундах — умножается на TICRATE = 35 и округляется до целых тиков для длительностей стейтов и аргумента Delay()
  • d,vd, v = Расстояние в единицах карты и Speed снаряда в единицах карты за тик; деление с округлением вверх даёт тики, потому что движок шагает целыми тиками
Число 35 в знаменателе DPS — это TICRATE, константа, которую id Software зафиксировала в начале doomdef.h ещё в 1993 году и которую ZDoom, GZDoom и любой другой Doom-порт сохраняют дословно. Та же константа управляет любой длительностью стейта в DECORATE и ZScript: запись `TNT1 A 24` длится 24 тика, и именно это число попадает в знаменатель DPS. Спрей BFG — единственное исключение из равномерного random(1, 8): внутри A_BFGSpray урон за луч считается как сумма 15 независимых random(1, 8), поэтому диапазон за луч 15…120 со средним 67,5; всего шар BFG выпускает до 40 лучей. Множитель Берсерка применяется после броска random(1, 10), так что удар с активным Берсерком ложится в диапазон 20…200 со средним 110.

Разобранные примеры со всей арифметикой

Огнешар Импа против Какодемона — сценарий по умолчанию

У огнешара Импа Damage 3 в блоке Default актора DoomImpBall. Диапазон за выстрел = 3…24 (3 × random(1, 8)), среднее = 13,5. HP Какодемона = 400 (из свойства Health актора Cacodemon, что соответствует значению на русской DOOMPEDIA). Ожидаемое число выстрелов до смерти = $\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)$ за выстрел, pellet 1. Диапазон за выстрел = 5…15, среднее = 10. A_FirePistol в vanilla стреляет примерно 150 раз в минуту (~14 тиков на цикл). DPS = $10 \times 35 / 14$ ≈ 25 ожидаемого урона в секунду. HP Зомби-человека = 20. Ожидаемое число выстрелов до смерти = $\lceil 20 / 10 \rceil$ = 2. Лучший случай = 2 (два 15-х подряд), худший = 4 (четыре пятёрки). Время до смерти при 14 тиках на атаку = $2 \times (14/35) = 0{,}8$ секунды ожидаемо, до 1,6 в худшем случае. Пистолет не бесполезен — он валит Зомби-человека за 2 выстрела и подъедает Импа за 6 — но по DPS он примерно в три раза слабее пулемёта (та же формула за выстрел, но ~4 тика на атаку вместо 14) и в десять раз слабее ракетомёта. Именно поэтому пулемёт заменяет его сразу же, как только вы его подобрали — этот вывод воспроизводится в любом обсуждении на i.iddqd.ru и DoomGuy.Ru.

Супердробовик по Рыцарю ада — реальность стрельбы в упор

Формула супердробовика: $5 \times \text{random}(1, 3)$ за pellet, pellet 20. Диапазон за выстрел = 100…300, среднее = 200. HP Рыцаря ада (Hell Knight) = 500. Ожидаемое число выстрелов до смерти = $\lceil 500 / 200 \rceil$ = 3. Худший случай = $\lceil 500 / 100 \rceil$ = 5 (каждый pellet выпадает в 1). Лучший случай = $\lceil 500 / 300 \rceil$ = 2 (каждый pellet — 3). A_FireShotgun2 циклится примерно 36,8 раз в минуту (около 57 тиков на атаку с перезарядкой), поэтому время до смерти при 3 выстрелах = $3 \times (57/35) \approx 4{,}9$ секунды. Это совпадает с консенсусом форумов: два выстрела ложат Рыцаря только при удаче по броскам, реалистичный план — три.

Прямое попадание шаром BFG в Кибердемона (без спрея)

У шара BFG Damage = 100 в акторе BFGBall. Диапазон прямого попадания = 100…800, среднее = 450. HP Кибердемона = 4000, никакого splash. Ожидаемое число прямых = $\lceil 4000 / 450 \rceil$ = 9. Лучший случай = $\lceil 4000 / 800 \rceil$ = 5. Худший = $\lceil 4000 / 100 \rceil$ = 40 (каждый бросок — минимум). Совет с русской DOOMPEDIA «два-восемь выстрелов из BFG валят Кибердемона» исходит из того, что лучи спрея тоже попадают и что дистанция держит цель внутри конуса. Именно спрей и делает BFG эффективным: один полный шар + спрей на 40 лучей даёт в среднем 450 + 40 × 67,5 = 3150 ожидаемого урона за один спуск, и Кибердемон ложится за 2 спуска, если вы точно поймали и прямое попадание, и конус.

Арифметика ACS Delay — «сколько тиков в 2,5 секундах»

Тиков в секунде = 35. Секунды в тики для 2,5 = $\text{round}(2{,}5 \times 35)$ = round(87,5) = 88 тиков. В ACS: пишите `Delay(35 * 25 / 10)`, если хочется сохранить читаемость арифметики, или просто `Delay(88)`. Самые частые величины, которые моддеры держат в голове: 0,1 с = 4 тика, 0,5 с = 18, 1 с = 35, 1,5 с = 53, 2 с = 70, 3 с = 105, 5 с = 175, 10 с = 350. Speed огнешара Импа = 10 единиц карты за тик. Полёт на 1024 единицы карты = $\lceil 1024 / 10 \rceil$ = 103 тика ≈ 2,94 секунды, или около 15 миль/ч (10 × 1,49 ≈ 14,9). Шар плазмагана со Speed 25 проходит те же 1024 ед. за 41 тик ≈ 1,17 секунды, или около 60 км/ч.

Советы по балансу и урону ZDoom для моддеров, мапперов и любопытных игроков

  • Читайте свойство Damage актора в средних значениях, а не в литеральных. Снаряд с Damage 5 в игре в среднем бьёт на 22,5 (5 × 4,5), а не на 5. Если ваш новый монстр должен конкурировать с огнешаром Импа со средним 13,5, ставьте Damage 3 — не Damage 10. Ошибка №1 при балансировке DECORATE — читать Damage 10 как «бьёт на 10», когда оно бьёт от 10 до 80 со средним 45. Эта же ошибка повторяется в каждом туториале «для чайников» на kenonserver.narod.ru и в гайде на DoomGuy.Ru.
  • Флаг +STRIFEDAMAGE — самый дешёвый способ зажать диапазон снаряда. То же Damage, верхняя граница множителя падает с 8 до 4, среднее падает с 4,5× до 2,5×. Подходит, когда нужен предсказуемый средний снаряд (например, кастомная ракета, которая должна ощущаться как 60…240, а не как 60…480). Работает в любом моде ZDoom независимо от базовой игры — название идёт от Strife (первый non-Doom IWAD движка), но сам флаг универсален и портируется в Doom-моды.
  • Хитскан-оружие игнорирует свойство Damage полностью. Пистолет, дробовик, пулемёт, супердробовик — все жёстко зашили $5 \times \text{random}(1, 3)$ за pellet внутри A_FireBullets / A_FirePistol / A_FireShotgun. Чтобы поднять урон хитскан-оружия, меняйте число pellet'ов, аргумент damage в A_CustomBulletAttack или переводите оружие на снаряды. Кулак и бензопила используют $2 \times \text{random}(1, 10)$; Берсерк влияет только на кулак — после броска множит на 10 (то есть 20…200 за удар, среднее 110).
  • Тики между атаками важнее урона за выстрел для сравнения DPS. У пулемёта и пистолета одинаковый урон за выстрел (5…15, среднее 10), но пулемёт стреляет за ~4 тика на атаку против ~14 у пистолета — примерно 3,5× DPS на той же per-pellet математике. Когда балансируете мод, сначала решите, какой DPS вам нужен (vanilla-пистолет ~25 DPS, дробовик ~70, супердробовик ~150, пулемёт ~88, плазмаган ~263, прямое попадание ракеты ~159), потом отсюда выводите урон за выстрел и тики на атаку.
  • Используйте шпаргалку из 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 тиков — это ровно одна секунда реального времени. Более ранние версии показывали интервал в 28 мс на тик (то есть 35 тиков отображались как 0,98 секунды) из-за усечения целочисленного деления в коде таймера. Если ваша ACS-арифметика Delay() требует субсекундной точности, а аудитория сидит на старом порту, закладывайте поправку в 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 выпускает до 40 лучей в передний конус 90°, поэтому при полном покрытии 40 × 67,5 = 2700 ожидаемого урона ложится сверху на 100…800 от самого шара. Именно поэтому один спуск BFG может уложить Кибердемона за два спуска, если и шар, и конус нашли цель — этот же расчёт стоит в основе классической советы DOOMPEDIA «два выстрела на UV в упор».
  • У единицы карты — два соотношения, а не одно. Горизонтально 16 единиц карты = 1 фут (0,3048 м); вертикально только 10 единиц = 1 фут, потому что Doom исходно растягивал картинку на 20% по вертикали в режиме 320×200. Для перевода Speed калькулятор использует горизонтальный коэффициент, потому что снаряды летят по плоскости карты: Speed 10 (огнешар Импа) ≈ 6,67 м/с ≈ 15 миль/ч; Speed 25 (плазма, шар BFG) ≈ 16,67 м/с ≈ 60 км/ч ≈ 37 миль/ч. Скорость бега Doomguy'я — около Speed 16, то есть примерно 24 мили/ч, и именно поэтому Имп в коридоре иногда вас догоняет.
  • DamageFactor закрывает кейс сопротивлений и уязвимостей без переписывания кода урона. DamageFactor 'Fire', 0.5 у монстра делит весь огневой урон на 2; 2.0 удваивает его; 0.0 даёт полную невосприимчивость. В режиме DPS калькулятора одно скалярное поле DamageFactor моделирует резистный случай без пользовательского типа урона — удобно, когда вы сравниваете TTK vanilla-оружия против, например, варианта Какодемона с 0,7 сопротивления плазме.
  • Худший случай и диапазон важнее средних для арифметики выживания. «Ожидаемое число выстрелов = 30» прячет тот факт, что Какодемон может пережить 134 огнешара Импа в патологическом худшем случае. Калькулятор показывает лучший и худший случаи рядом со средним именно для этого — когда вы строите слоттер-карту, в которой монстр обязан умереть за строгий бюджет выстрелов, считайте по худшему. Когда строите обычную карту — по среднему. Эти два числа могут отличаться в 5–10 раз для снарядов с random(1, 8).

Калькулятор урона 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?

Пистолет использует $5 \times \text{random}(1, 3)$ за выстрел, поэтому каждый шот бьёт на 5, 10 или 15 со средним 10. Пулемёт и дробовик (за pellet) используют ту же формулу. Свойство Damage на хитскан-акторе игнорируется — формула жёстко зашита в A_FirePistol, A_FireShotgun и A_FireCGun. Эта же формула приведена в статье Bethesda Slayers Club «Бросьте кубик, чтобы нанести урон» как `random(1, 3) * 5`.

Сколько тиков в одной секунде ZDoom?

35 тиков в секунду. TICRATE зафиксирован на 35 ещё с релиза 1993 года. GZDoom v3.2.2 и новее гарантируют, что 35 тиков — это ровно 1,000 секунды реального времени; в более ранних версиях шёл срез на 28 мс на тик, и 35 тиков отображались как 0,98 секунды — отклонение 2%, заметное только в длинных цепочках Delay().

Как посчитать ACS Delay() для X секунд?

Умножьте секунды на 35 и округлите до целого. 0,5 с = 18 тиков, 1 с = 35, 2 с = 70, 5 с = 175, 10 с = 350, 60 с = 2100. В ACS пишите `Delay(35 * seconds)` напрямую — умножение компилятор сделает на этапе сборки.

Что делает флаг +STRIFEDAMAGE?

+STRIFEDAMAGE меняет множитель урона снаряда с random(1, 8) на random(1, 4). То же значение Damage, но диапазон уже и среднее ниже. Работает на любом акторе в любом моде ZDoom независимо от базовой игры — название идёт от Strife, но сам флаг универсален. Подходит, когда нужен предсказуемый средний снаряд.

Сколько HP у Кибердемона?

4000 HP. Кибердемон принимает только прямой урон — splash от ракет и снарядов Манкубуса по нему не работает. BFG9000 — канонический способ убийства (около 2–4 спусков с учётом спрея); 20 ожидаемых выстрелов из супердробовика в упор или ~45 ожидаемых прямых ракет тоже справятся, если хватит патронов. Таблица из 19 строк под калькулятором показывает все значения HP vanilla-Doom.

Почему урон BFG такой странный — что за цикл из 15 random?

Основной шар BFG использует стандартную формулу (Damage 100 × random(1, 8) = 100…800), но лучи спрея — нет. Каждый из 40 лучей суммирует 15 независимых random(1, 8): диапазон 15…120 за луч со средним 67,5. Из-за детерминизма псевдослучайной таблицы DOOM (256-байтовая статическая таблица P_Random) на практике диапазон сужается до 49…87, но теоретический максимум за луч — 120.

Работает ли калькулятор с акторами ZScript?

Да. ZScript и DECORATE используют одну и ту же семантику свойств Damage / DamageFunction / Speed / Health / +STRIFEDAMAGE — отличается только синтаксис. ZScript-актор с `Damage 5;` в блоке Default крутит ту же формулу $5 \times \text{random}(1, 8)$, что и DECORATE-актор с тем же свойством. Выходы калькулятора применимы к обоим.

Совместим ли калькулятор с русифицированным GZDoom от Julia Nechaevskaya?

Да. Формулы движка не зависят от русификации интерфейса. Аддон K0stov/russian-gzdoom и порт Russian Doom (форк Chocolate и Crispy Doom от Julia Nechaevskaya, ныне переименован в International Doom) переводят строки и UI, но не трогают арифметику урона. Те же значения random(1, 8), TICRATE = 35, +STRIFEDAMAGE и HP монстров работают одинаково на английской сборке GZDoom, на K0stov/russian-gzdoom и на Russian Doom / International Doom.

Подходит ли калькулятор для Russian Overkill и других русских модов?

Для акторов, которые сохраняют стандартное свойство Damage и стандартные хитскан-функции — да. Russian Overkill от PillowBlaster в большинстве своих стволов использует обычные A_FireProjectile и A_FireBullets и таким образом подчиняется тем же формулам random(1, 8) и $5 \times \text{random}(1, 3)$. Если ствол переопределён через DamageFunction с собственным выражением (что Russian Overkill делает для нескольких уникальных орудий) — калькулятор покажет vanilla-эталон, который придётся скорректировать вручную по коду конкретного актора.

В чём разница между ZScript и DECORATE по урону?

Никакой по математике, только по синтаксису. ZScript полностью покрывает функционал DECORATE — это его «надмножество». Тот же `Damage 10` в Default-блоке актора крутит ту же random(1, 8), и тот же флаг +STRIFEDAMAGE так же сменит множитель на random(1, 4). DECORATE официально объявлен устаревшим в GZDoom, но всё ещё поддерживается; для новых модов рекомендуют ZScript, но для математики урона калькулятора это безразлично.

Точны ли числа калькулятора по сравнению с самой игрой?

Бит-в-бит для поведения vanilla-Doom и Doom II под ZDoom / GZDoom. Сверка с движком покрывает все пресеты снарядов, все хитскан-оружия, все значения HP монстров и цикл из 15 random для спрея BFG — каждый диапазон урона, HP и Speed снаряда совпадает с vanilla-определениями актора до единицы. Акторы-замены DECORATE / ZScript, пользовательские выражения DamageFunction и современные части Doom (2016, Eternal, The Dark Ages) используют другую математику и в калькуляторе не моделируются.

Почему трассер Ревенанта бьёт на 10…80, а не на 10…40?

У RevenantTracer Damage 10 в блоке актора, но флага +STRIFEDAMAGE на нём нет — он использует множитель по умолчанию random(1, 8). Поэтому диапазон 10…80 со средним 45, а не 10…40. Это частая путаница: ракеты Ревенанта по ощущению похожи на Strife-математику, но на деле она другая.

Влияет ли сложность (UV / Nightmare) на урон оружия?

Нет. Nightmare удваивает агрессию монстров и подбираемые боеприпасы, но урон оружия одинаков на всех пяти уровнях сложности. Единственный множитель урона в vanilla-Doom — усиление Берсерк, которое умножает урон кулака на 10. Сложность меняет, кто стреляет первым и как часто, а не насколько сильно бьют выстрелы.


Глоссарий урона и времени ZDoom

Свойство Damage

Числовое свойство в блоке Default актора DECORATE или ZScript, которое движок умножает на random(1, 8) при каждом попадании (на random(1, 4) с +STRIFEDAMAGE). Запись Damage 10 даёт в игре диапазон 10…80, а не плоские 10.

+STRIFEDAMAGE

Флаг актора, меняющий множитель урона снаряда с random(1, 8) на random(1, 4). То же значение Damage, диапазон уже, среднее ниже (Damage × 2,5 вместо Damage × 4,5). Работает в любом моде ZDoom независимо от базовой игры.

тик (tic)

Атомарная единица времени движка Doom. TICRATE = 35 тиков в секунду; 1 тик ≈ 28,5714 мс. Длительности стейтов в DECORATE / ZScript и аргумент ACS Delay() выражены в тиках. GZDoom v3.2.2+ гарантирует 35 тиков = ровно 1,000 секунды; ранее значение усекалось до 28 мс.

Хитскан-оружие

Оружие, чей урон разрешается мгновенно вдоль прямой линии, без актора-снаряда. Пистолет, дробовик, супердробовик и пулемёт — хитсканы; их формулы зашиты в action-функциях A_Fire* ($5 \times \text{random}(1, 3)$ за pellet), а свойство Damage самого актора игнорируется.

DamageFactor

Множитель входящего урона определённого типа. DamageFactor 'Fire', 0.5 делит огневой урон вдвое; 2.0 удваивает; 0.0 даёт полную невосприимчивость. В режиме DPS калькулятора одно скалярное поле DamageFactor закрывает резистный / уязвимый случай.

Берсерк

Усиление, умножающее урон кулака на 10 после броска random(1, 10), что даёт диапазон 20…200 со средним 110. Бонус получает только кулак; бензопила, хитсканы и снарядное оружие не затронуты.

Единица карты (map unit)

Координатная единица пространства Doom. По консенсусу сообщества 16 горизонтальных единиц карты = 1 фут = 0,3048 м (Doomguy имеет рост 56 вертикальных единиц = 5 футов 7 дюймов). Калькулятор переводит Speed снаряда (единиц карты за тик) в м/с, км/ч и мили/ч по горизонтальному коэффициенту 16 ед./фут.

Свойство Speed

Скорость актора-снаряда в единицах карты за тик. Огнешар Импа — Speed 10; ракета — Speed 20; шар плазмагана и шар BFG — Speed 25. Умножайте на 35, чтобы получить единицы карты в секунду; на 0,667 — для м/с; на 1,49 — для миль/ч.

Спрей BFG (BFG spray)

Конус из 40 лучей, который шар BFG выпускает при попадании (спрей запускается из стейта смерти шара через A_BFGSpray). Урон каждого луча считается как сумма 15 независимых random(1, 8): диапазон 15…120 за луч со средним 67,5. Репутацию BFG как «убийцы Кибердемона с одного спуска» делает именно спрей, а не сам шар.

TICRATE

Константа движка, фиксирующая частоту Doom на 35 тиков в секунду с 1993 года. Объявлена в doomdef.h id Software; дословно сохранена в ZDoom, GZDoom, Zandronum, Boom, MBF21 и любом другом vanilla-совместимом порте. Каждая длительность стейта, каждый аргумент Delay() и каждый расчёт времени полёта снаряда используют 35 как константу пересчёта.

DamageFunction

Альтернатива свойству Damage, позволяющая моддеру вернуть произвольное целое в момент попадания через выражение ZScript. Обходит множитель random(1, 8) — верните плоское число для детерминированного урона или посчитайте его из inflictor / target / distance для контекстно-зависимого поведения.

P_Random

Псевдослучайная функция движка Doom: индекс пробегает 256-байтовую таблицу с заранее перемешанными значениями 0…255 и каждым вызовом возвращает следующий байт. Не равномерна (значение 1 не встречается ни разу, 145 встречается пять раз), но достаточно близка для боевой арифметики. Используется во всех бросках урона; M_Random ведёт свой индекс для не-геймплейных эффектов, чтобы не ломать синхронизацию мультиплеера.


Содержание проверено командой Smart Calculators