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)은 균등 분포 — 각 배수가 같은 확률.
| 1발 데미지 | 확률 |
|---|---|
| 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 | 배수 | 최소 | 최대 | 평균 | Speed (mu/tic) |
|---|---|---|---|---|---|---|
| 임프 화염구 — 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 스프레이 (1광선당) | 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 액터의 Default 블록에 적는 Damage 프로퍼티(정수)
- = 난수 배수 범위. 기본은 1과 8, +STRIFEDAMAGE는 1과 4, 권총/샷건/체인건 펠릿은 1과 3, 주먹/전기톱은 1과 10
- = 공격 간격 tic 수. 액터 States 블록에서 연속된 발사 호출 사이의 state 머신 길이
- = 대상의 HP. 좀비맨 20, 임프 60, 카코데몬 400, 바론 오브 헬 1000, 스파이더 마스터마인드 3000, 사이버데몬 4000
- = DamageFactor 배수. 1.0이면 정상, 0.5는 저항, 2.0은 약점, 0.0이면 무적
- = 초 단위 시간. TICRATE = 35를 곱해 정수 tic으로 반올림한 값이 state 길이와 Delay() 인자로 들어감
- = 비행 거리(맵 유닛)와 투사체 Speed(맵 유닛/tic). 엔진이 정수 step으로 움직이므로 올림 나눗셈으로 tic 수가 나옴
실제 숫자로 따라가는 계산 예시
임프 화염구 vs 카코데몬 — 기본 시나리오
권총 DPS로 좀비맨 — "권총은 정말 쓸모없는가?"
슈퍼 샷건으로 헬 나이트 — 근접 사거리의 현실
BFG 볼 직격으로 사이버데몬(스프레이 없음)
ACS Delay 계산 — "2.5초는 몇 tic?"
모더·매퍼·궁금한 플레이어를 위한 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 위에서 도는 모든 모드에서 작동합니다.
- 히트스캔 무기는 Damage 프로퍼티를 완전히 무시합니다. 권총·샷건·체인건·슈퍼 샷건은 A_FireBullets/A_FirePistol/A_FireShotgun 내부에 펠릿당 5 × random(1, 3)을 박아두었습니다. 히트스캔 무기 위력을 높이려면 펠릿 수를 늘리거나, A_CustomBulletAttack의 damage 인자를 바꾸거나, 투사체 방식으로 바꿔야 합니다. 주먹과 전기톱은 2 × random(1, 10). 버서크가 적용되는 것은 주먹뿐이며 난수 뒤에 ×10이 곱해집니다(20~200, 기대값 110).
- 공격 간격 tic 수가 1발 데미지보다 DPS 비교에서 더 중요합니다. 체인건과 권총은 1발 공식(5~15, 기대값 10)이 동일하지만, 체인건의 공격 간격은 약 4 tic, 권총은 약 14 tic입니다. 같은 펠릿 계산인데도 DPS는 약 3.5배 차이가 납니다. 무기 모드의 밸런스를 잡을 때는 먼저 목표 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 스프레이는 Damage × random(1, 8) 법칙을 따르지 않는 유일한 투사체입니다. A_BFGSpray 내부에서 1광선 데미지는 독립적인 random(1, 8) 15회의 합으로 계산됩니다. 범위 15~120, 기대값 67.5, 분포는 균등이 아니라 종 모양입니다. BFG 볼은 전방 90도 콘에 최대 40개 광선을 방출하므로 풀 커버리지면 40 × 67.5 = 2700 데미지(기대값)가 BFG 볼 본체의 100~800 위에 얹힙니다. BFG 한 번 당기는 것으로 사이버데몬을 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 모드는 스칼라 한 개로 DamageFactor를 입력하는 UI입니다. 자체 데미지 타입을 선언하지 않고도, 예를 들어 카코데몬의 플라즈마 저항 0.7 가상 변종에 대해 바닐라 무기의 TTK를 비교할 수 있습니다.
- 극단 케이스와 범위는 생존 판단에서 평균보다 더 중요합니다. "기대 처치 발수 = 30"이라는 숫자는 운이 나쁜 경우 카코데몬이 임프 화염구를 134발 흡수할 수 있다는 사실을 가립니다. 계산기가 기대값과 함께 베스트/워스트를 표시하는 이유가 이것입니다. 슬로터 맵에서 정해진 탄약 예산 안에 몬스터를 잡아야 할 때는 워스트 케이스로 설계합니다. 일반 맵이라면 기대값으로 설계합니다. random(1, 8) 투사체에서는 두 값이 5~10배까지 벌어지는 일이 드물지 않습니다.
- 한국어로 모드를 만들 때도 액터 이름과 프로퍼티 이름은 엔진이 알아보는 영문 표기 그대로 두세요(Damage, Speed, Health, +STRIFEDAMAGE, Cacodemon, Cyberdemon 등). DECORATE와 ZScript는 로컬라이즈된 식별자를 받지 않습니다. 디시인사이드 둠 마이너 갤러리(gall.dcinside.com/mgallery/board/lists/?id=doom), 루리웹의 둠 게시판, 나무위키의 둠 관련 문서에서는 "카코데몬"이나 "사이버데몬"이라고 번역되어 있지만 코드 안에서는 `Cacodemon` `Cyberdemon`입니다. PK3 안에 영문 표기를 유지해 두면 다른 모더가 WAD를 열었을 때 디버깅 시간을 몇 시간이나 절약합니다.
ZDoom 데미지 계산기 — 자주 묻는 질문
Damage 10 투사체가 가끔 80 데미지를 입히는 이유는?
클래식 둠의 권총 데미지 공식은?
ZDoom에서 1초는 몇 tic?
ACS Delay()로 X초를 기다리게 하려면?
+STRIFEDAMAGE 플래그는 무엇을 하나?
사이버데몬 HP는?
BFG 데미지가 특이한 이유는? 15회 루프란 무엇인가?
ZScript 액터에서도 이 계산기를 쓸 수 있나?
Brutal Doom이나 Project Brutality에서도 쓸 수 있나?
GZDoom의 한국어 번역은 계산에 영향을 주나?
PrBoom+·ZDoom·GZDoom·Zandronum에서 데미지는 다른가?
ZScript와 DECORATE의 데미지 계산 차이는?
리브넌트 추적 미사일이 10~40이 아니라 10~80인 이유는?
난이도(UV/나이트메어)로 무기 데미지가 늘어나나?
실제 게임 동작과 비교해서 이 계산기의 정확도는?
이 도구를 트위치 둠 방송이나 유튜브 영상 자막에도 쓸 수 있나?
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 모드에서 작동합니다.
tic
둠 엔진의 원자적 시간 단위. TICRATE = 1초당 35 tic, 1 tic ≈ 28.5714 ms. DECORATE/ZScript의 state 길이, ACS Delay()의 인자는 모두 tic으로 표현됩니다. GZDoom v3.2.2(2017년 12월) 이상은 35 tic = 1.000초를 보장하며, 이전에는 28 ms로 절단했습니다.
히트스캔 무기
투사체 액터를 거치지 않고 직선상에서 즉시 데미지가 결정되는 무기. 권총, 샷건, 슈퍼 샷건, 체인건이 히트스캔에 해당합니다. 공식은 액션 함수 A_Fire* 내부에 박혀 있고(펠릿당 5 × 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)
둠의 공간 좌표 단위. 커뮤니티 합의는 수평 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 state에서 A_BFGSpray가 발사). 각 광선의 데미지는 독립적인 random(1, 8) 15회의 합으로, 1광선당 15~120, 기대값 67.5. BFG가 사이버데몬을 1샷에 잡는다는 전설은 스프레이의 기여이고, 본체 플라즈마 볼만으로는 닿지 않습니다.
TICRATE
둠의 프레임레이트를 1993년부터 35 tic/초로 고정한 엔진 상수. id Software의 `doomdef.h`에 선언되어 있고 ZDoom, GZDoom, Zandronum, PrBoom+, Boom, MBF21 등 모든 바닐라 호환 소스 포트가 그대로 보존합니다. 모든 state 길이, Delay() 인자, 투사체 비행 시간 계산에서 변환 상수로 35가 사용됩니다.
DamageFunction
Damage 프로퍼티의 대체 수단으로, 모더가 명중 시점에 ZScript 식에서 임의의 정수를 반환할 수 있게 합니다. random(1, 8) 배수를 우회할 수 있어서 고정값을 반환해 결정론적 데미지를 내거나, inflictor/target/distance에서 계산해 컨텍스트에 민감한 동작을 만들 수 있습니다.
P_Random
둠 엔진의 의사 난수 함수. 0~255가 섞인 256바이트 고정 테이블의 인덱스가 순서대로 진행하며 호출할 때마다 다음 바이트를 반환합니다. 균등 분포는 아니지만(값 1은 한 번도 안 나오고 145는 5번 나옴) 전투 산술에는 충분합니다. 모든 데미지 굴림에 쓰입니다. M_Random은 게임 비효과용으로 별도 인덱스를 가져 멀티플레이 동기화를 깨지 않게 되어 있습니다.
출처 및 참고문헌
- id Software가 1996년 공개한 DOOM 소스 — 데미지 공식은 위키가 아니라 코드 자체에서 읽어낸 것이다. doomdef.h가 TICRATE를 35로 고정하고, p_inter.c에 발사체 규칙(데미지 × random 1..8, STRIFEDAMAGE면 1..4), p_pspr.c에 히트스캔 규칙(권총·샷건·체인건은 펠릿당 5 × random 1..3, 주먹과 체인소는 2 × random 1..10, 버서크 시 ×10)이 있다.
- GitHub의 GZDoom — 유지보수되는 엔진으로, 데미지 규칙은 원본 그대로 보존하되 타이밍만 바뀌었다. v3.2.2부터 35틱은 정확히 1.000초이고, 그 이전 빌드는 틱마다 28 ms로 잘라 35틱이 약 0.98초였다. 데모와 옛 모드는 옛 타이밍으로 돌아가므로 이 페이지는 둘 다 제공한다.
- The Doom Wiki — 틱: 엔진의 최소 시간 단위인 1/35초. 이 페이지에서 발사체 비행 시간이 올림 처리되는 이유이기도 하다. 엔진은 정수 틱 단위로 진행하므로 남는 소수는 온전한 한 틱이 된다.
- The Level Design Book — Doom 메트릭: 이 페이지가 쓰는 맵 유닛 커뮤니티 관례로, 수평 16유닛이 1피트, 즉 유닛당 0.01905 m다. 엔진 상수가 아니라 매핑 관례이며, Doom 코드 자체에는 미터라는 개념이 없다.