Калькулятор урона и DPS ZDoom
Считайте точный диапазон урона, ожидаемый DPS и время до смерти для любого оружия или снаряда ZDoom / GZDoom. Включает множитель random(1,8), флаг STRIFEDAMAGE и конвертер тиков в секунды для ACS-скриптов.
Диапазон урона, DPS и конвертер тиков для моддеров Doom.
Считает мин/среднее/макс урона для любого снаряда, хитскан-оружия или произвольного DamageFunction.
Формула урона
Использует Damage × random(1, 8) — стандартную формулу снаряда ZDoom.
Выберите vanilla-снаряд Doom, чтобы автозаполнить Damage. Изменение Damage возвращает пресет в Custom.
dmg
N после Damage в DECORATE/ZScript (например, 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% |
Vanilla-снаряды
Кликните строку, чтобы загрузить в поля ввода выше.
| Снаряд | Damage | Множитель | Мин | Макс | Среднее | Speed (ед./тик) |
|---|---|---|---|---|---|---|
| Огнешар Импа — DoomImpBall | 3 | × random(1, 8) | 3 | 24 | 13,5 | 10 |
| Шар Какодемона — 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 |
| Огнешар Манкубуса — FatShot | 8 | × random(1, 8) | 8 | 64 | 36 | 20 |
| Самонаводящаяся ракета Ревенанта — 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 и тики для моддеров Doom.
Что такое калькулятор урона и DPS ZDoom?
Как посчитать урон, DPS и тики ZDoom (и как это делает калькулятор)
Урон, DPS и тики — формулы движка
- = Свойство Damage из блока Default актора DECORATE или ZScript (целое число)
- = Границы случайного множителя — 1 и 8 по умолчанию; 1 и 4 с +STRIFEDAMAGE; 1 и 3 для пуль пистолета/дробовика/пулемёта; 1 и 10 для кулака/бензопилы
- = Тики между атаками — длительность машины состояний между двумя последовательными вызовами стрельбы в блоке States актора
- = HP цели — 20 у Зомби-человека, 60 у Импа, 400 у Какодемона, 1000 у Барона ада, 3000 у Паука-предводителя, 4000 у Кибердемона
- = Множитель DamageFactor — 1,0 норма, 0,5 сопротивление, 2,0 уязвимость, 0,0 неуязвимость
- = Время в секундах — умножается на TICRATE = 35 и округляется до целых тиков для длительностей стейтов и аргумента Delay()
- = Расстояние в единицах карты и Speed снаряда в единицах карты за тик; деление с округлением вверх даёт тики, потому что движок шагает целыми тиками
Разобранные примеры со всей арифметикой
Огнешар Импа против Какодемона — сценарий по умолчанию
DPS пистолета против Зомби-человека — «правда ли пистолет бесполезен»
Супердробовик по Рыцарю ада — реальность стрельбы в упор
Прямое попадание шаром BFG в Кибердемона (без спрея)
Арифметика ACS Delay — «сколько тиков в 2,5 секундах»
Советы по балансу и урону 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