Calculadora de daño y DPS de ZDoom
Calcula el rango exacto de daño, el DPS esperado y el tiempo hasta matar de cualquier arma o proyectil de ZDoom / GZDoom. Incluye el multiplicador random(1,8), el flag STRIFEDAMAGE y un convertidor de tics a segundos para scripts ACS.
Rango de daño, DPS y convertidor de tics para modders de Doom.
Calcula daño mín/medio/máx para cualquier proyectil, arma hitscan o DamageFunction personalizada.
Fórmula de daño
Usa Damage × random(1, 8) — la fórmula estándar de proyectil de ZDoom.
Elige un proyectil vanilla de Doom para autorrellenar Damage. Si editas Damage después, el preset vuelve a Personalizado.
dmg
El N que pones tras Damage en DECORATE/ZScript (p. ej. Damage 3 en la bola de fuego del Imp).
Distribución del daño
random(1, N) es uniforme — cada multiplicador es igual de probable.
| Daño por impacto | Probabilidad |
|---|---|
| 3 | 12,5% |
| 6 | 12,5% |
| 9 | 12,5% |
| 12 | 12,5% |
| 15 | 12,5% |
| 18 | 12,5% |
| 21 | 12,5% |
| 24 | 12,5% |
Referencia de proyectiles vanilla
Pulsa una fila para cargarla en los inputs de arriba.
| Proyectil | Damage | Multiplicador | Mín | Máx | Media | Speed (u/tic) |
|---|---|---|---|---|---|---|
| Bola de fuego del Imp — DoomImpBall | 3 | × random(1, 8) | 3 | 24 | 13,5 | 10 |
| Bola del Cacodemon — CacodemonBall | 5 | × random(1, 8) | 5 | 40 | 22,5 | 10 |
| Plasma del Arachnotron — ArachnotronPlasma | 5 | × random(1, 8) | 5 | 40 | 22,5 | 25 |
| Bola del fusil de plasma — PlasmaBall | 5 | × random(1, 8) | 5 | 40 | 22,5 | 25 |
| Bola del Barón / Hell Knight — BaronBall | 8 | × random(1, 8) | 8 | 64 | 36 | 15 |
| Bola de fuego del Mancubus — FatShot | 8 | × random(1, 8) | 8 | 64 | 36 | 20 |
| Tracer del Revenant (con guiado) — RevenantTracer | 10 | × random(1, 8) | 10 | 80 | 45 | 10 |
| Cohete (impacto directo) — Rocket | 20 | × random(1, 8) | 20 | 160 | 90 | 20 |
| Spray del BFG (por rayo) | 67 | × 1..8 loop | 15 | 120 | 67,5 | — |
| Bola del BFG (impacto directo) — BFGBall | 100 | × random(1, 8) | 100 | 800 | 450 | 25 |
Fragmento de DECORATE/ZScript que reproduce estos números.
ACTOR CustomProjectile : DoomImpBall{ Damage 3 // Min 3 Max 24 Avg 13.5 (× random(1, 8))}Calculadora de daño ZDoom. Rango, DPS y tics para modders de Doom.
¿Qué es la calculadora de daño y DPS de ZDoom?
Cómo calcular daño, DPS y tics en ZDoom (y cómo lo hace la calculadora)
Daño, DPS y tics — las fórmulas del motor
- = Propiedad Damage del bloque Default del actor en DECORATE o ZScript (un entero)
- = Cotas del multiplicador aleatorio — 1 y 8 por defecto; 1 y 4 con +STRIFEDAMAGE; 1 y 3 para los pellets de pistola/escopeta/ametralladora; 1 y 10 para puño/motosierra
- = Tics por ataque — la duración de la máquina de estados entre dos llamadas consecutivas de disparo en el bloque States del actor
- = HP del objetivo — 20 para el Zombieman, 60 para el Imp, 400 para el Cacodemon, 1000 para el Baron of Hell, 3000 para el Spider Mastermind, 4000 para el Cyberdemon
- = Multiplicador DamageFactor — 1,0 normal, 0,5 resistencia, 2,0 vulnerabilidad, 0,0 invulnerable
- = Tiempo en segundos — se multiplica por TICRATE = 35 y se redondea a tics enteros para las duraciones de estado y el argumento de Delay()
- = Distancia de vuelo en unidades de mapa y Speed del proyectil en unidades de mapa por tic; la división con techo da los tics porque el motor avanza en pasos enteros
Ejemplos resueltos con todos los cálculos
Bola del Imp contra un Cacodemon — el escenario por defecto
DPS de la pistola contra un Zombieman — "¿de verdad es inútil la pistola?"
Súper escopeta contra un Hell Knight — la realidad del cañón a quemarropa
Impacto directo de bola de BFG contra un Cyberdemon (sin spray)
Aritmética de ACS Delay — "¿cuántos tics son 2,5 segundos?"
Consejos de daño y balance en ZDoom para modders, mappers y curiosos
- Lee la propiedad Damage de tu actor en valor esperado, no en valor literal. Un proyectil con Damage 5 promedia 22,5 en partida (5 × 4,5), no 5. Si tu nuevo monstruo debe rivalizar con la bola del Imp (esperado 13,5), pon Damage 3 — no Damage 10. El error número uno al equilibrar DECORATE es leer Damage 10 como \"pega 10\", cuando en realidad pega entre 10 y 80 con un promedio de 45.
- El flag +STRIFEDAMAGE es la forma más barata de estrechar el rango de un proyectil. Mismo Damage, multiplicador máximo cae de 8 a 4, valor esperado cae de 4,5× a 2,5×. Útil cuando quieres un proyectil intermedio predecible (por ejemplo, un cohete personalizado que debería sentirse como 60 a 240 en vez de 60 a 480). Funciona en cualquier mod de ZDoom independientemente del juego base — el nombre viene de Strife (el primer IWAD no-Doom del motor) pero el flag es portable y se usa habitualmente en mods de Doom.
- Las armas hitscan ignoran por completo la propiedad Damage. Pistola, escopeta, ametralladora y súper escopeta cablean 5 × random(1, 3) por pellet dentro de A_FireBullets / A_FirePistol / A_FireShotgun. Para subir el daño de un arma hitscan toca el número de pellets, el argumento damage de A_CustomBulletAttack o pásala a proyectil. El puño y la motosierra usan 2 × random(1, 10); Berserker solo afecta al puño y multiplica por 10 después de la tirada (es decir, 20 a 200 por puñetazo, esperado 110).
- Los tics entre ataques pesan más que el daño por disparo cuando comparas DPS. La ametralladora y la pistola tienen idéntico daño por disparo (5 a 15, esperado 10), pero la ametralladora dispara cada ~4 tics frente a los ~14 de la pistola — unas 3,5× de DPS con la misma matemática por pellet. Cuando balancees un mod, decide primero el DPS objetivo (pistola vanilla ~25 DPS, escopeta ~70, súper escopeta ~150, ametralladora ~88, fusil de plasma ~263, impacto directo de cohete ~159) y desde ahí deduce el daño por disparo y los tics por ataque que lo producen.
- Usa la chuleta de 19 monstruos para validar el diseño de combate. Zombieman (HP 20), Shotgun Guy (30), Wolfenstein SS (50), Imp (60), Chaingunner (70), Lost Soul / Commander Keen (100), Demon / Spectre (150), Revenant (300), Pain Elemental / Cacodemon (400), Hell Knight / Arachnotron (500), Mancubus (600), Arch-vile (700), Baron of Hell (1000), Spider Mastermind (3000), Cyberdemon (4000). Un disparo de súper escopeta (esperado 200, máximo 300) tumba en el mejor caso a todo hasta el Revenant (HP 300); Pain Elemental y Cacodemon (HP 400) piden mínimo dos disparos buenos. Un disparo de pistola (esperado 10) solo mata al Zombieman. Cambiar al Demon de la primera sala por un Mancubus no es un salto de dificultad 1,5× — es 4×, porque la curva de HP es geométrica, no lineal.
- GZDoom v3.2.2 (finales de 2017) y posteriores garantizan que 35 tics equivalen exactamente a un segundo de tiempo real. Las versiones anteriores mostraban un intervalo de 28 ms por tic (35 tics se veían como 0,98 segundos) por el truncamiento entero en el código del temporizador. Si tu aritmética de ACS Delay() necesita precisión sub-segundo y apuntas a usuarios con ports antiguos, asume el 2 % de deriva: `Delay(35 * 60)` en el temporizador legacy son 58,8 segundos reales, 1,2 segundos menos que un minuto real.
- El spray de la BFG es el único proyectil que no sigue la regla Damage × random(1, 8). Dentro de A_BFGSpray, el daño por rayo se calcula como la suma de 15 random(1, 8) independientes — rango 15 a 120, esperado 67,5, distribución en campana (no uniforme). La bola de BFG suelta hasta 40 rayos en un cono frontal de 90°, así que con cobertura completa 40 × 67,5 = 2700 puntos de daño esperados se suman al 100 a 800 propio de la bola. Por eso un solo gatillazo de BFG puede tumbar al Cyberdemon en dos disparos cuando aciertan tanto el impacto directo como el cono.
- Las unidades de mapa tienen dos equivalencias, no una. En horizontal, 16 unidades = 1 pie (0,3048 m); en vertical solo 10 unidades = 1 pie, porque el modo 320×200 original de Doom estiraba la imagen un 20 % en altura. Para convertir Speed la calculadora usa la equivalencia horizontal, porque los proyectiles viajan por el plano del mapa: Speed 10 (bola del Imp) ≈ 6,67 m/s ≈ 15 mph; Speed 25 (plasma, bola de BFG) ≈ 16,67 m/s ≈ 60 km/h ≈ 37 mph. La velocidad de carrera de Doomguy ronda Speed 16, unas 24 mph — por eso a veces un Imp te alcanza en un pasillo.
- DamageFactor resuelve resistencias y vulnerabilidades sin reescribir el código de daño. DamageFactor 'Fire', 0.5 en un monstruo divide a la mitad el daño de tipo Fire; 2.0 lo dobla; 0.0 lo hace inmune. El modo DPS de la calculadora expone una única casilla escalar DamageFactor que modela el caso resistente sin tener que crear un tipo de daño personalizado — útil cuando comparas el TTK del arma vanilla contra, por ejemplo, una variante de Cacodemon con 0,7 de resistencia al plasma.
- El peor caso y la horquilla pesan más que el promedio cuando diseñas combate ajustado. "Disparos esperados hasta matar = 30" oculta que un Cacodemon puede sobrevivir a 134 bolas de Imp en el peor caso patológico. La calculadora muestra el mejor y el peor caso al lado del esperado precisamente para esto: cuando diseñas un slaughter map y el bicho debe morir dentro de un presupuesto estricto de disparos, dimensiona por el peor caso. Cuando diseñas un mapa convencional, dimensiona por el esperado. Las dos cifras pueden diferir entre 5× y 10× para proyectiles con random(1, 8).
- Si moddeas en castellano, conserva los nombres de actor y de propiedad en inglés tal como aparecen en el motor (Damage, Speed, Health, +STRIFEDAMAGE, Cacodemon, Cyberdemon). DECORATE y ZScript no aceptan identificadores localizados, así que aunque la wiki de Doom en español traduzca \"Cacodemonio\" en prosa, el actor se sigue llamando Cacodemon en el código. Mantener la nomenclatura inglesa en tus PK3 ahorra horas de depuración cuando un tercero abre tu WAD.
Calculadora de daño ZDoom — preguntas frecuentes
¿Por qué mi proyectil con Damage 10 a veces pega por 80?
¿Cuál es la fórmula de daño de la pistola en el Doom clásico?
¿Cuántos tics hay en un segundo de ZDoom?
¿Cómo se calcula ACS Delay() para X segundos?
¿Qué hace el flag +STRIFEDAMAGE?
¿Cuánto HP tiene el Cyberdemon?
¿Por qué el daño de la BFG es tan raro — qué es ese bucle de 15 random?
¿La calculadora también vale para actores ZScript?
¿Funciona la calculadora con Brutal Doom o Project Brutality?
¿Sirve la traducción al español de GZDoom (o las del Russian Doom / International Doom) para los cálculos?
¿Hay diferencia de daño entre PrBoom+, ZDoom, GZDoom y Zandronum?
¿En qué se diferencian ZScript y DECORATE en cuanto al daño?
¿Por qué el rastreador del Revenant pega 10 a 80 y no 10 a 40?
¿La dificultad (UV / Nightmare) sube el daño de las armas?
¿Qué tan precisa es la calculadora frente al juego real?
Glosario de daño y tiempos en ZDoom
Propiedad Damage
Propiedad numérica del bloque Default de un actor DECORATE o ZScript que el motor multiplica por random(1, 8) en cada impacto (random(1, 4) con +STRIFEDAMAGE). Escribir Damage 10 produce en partida un rango de 10 a 80, no un 10 plano.
+STRIFEDAMAGE
Flag de actor que cambia el multiplicador de daño del proyectil de random(1, 8) a random(1, 4). Mismo valor Damage, rango más estrecho, promedio más bajo (Damage × 2,5 en lugar de Damage × 4,5). Funciona en cualquier actor de cualquier mod de ZDoom sin importar el juego base.
tic
Unidad atómica de tiempo del motor de Doom. TICRATE = 35 tics por segundo; 1 tic ≈ 28,5714 ms. Las duraciones de estado en DECORATE / ZScript y el argumento de ACS Delay() se expresan en tics. GZDoom v3.2.2 en adelante garantiza que 35 tics = 1,000 segundos exactos; las versiones anteriores truncaban a 28 ms.
Arma hitscan
Arma cuyo daño se resuelve al instante a lo largo de una línea recta, sin actor proyectil de por medio. Pistola, escopeta, súper escopeta y ametralladora son hitscan; sus fórmulas están cableadas en las action functions A_Fire* (5 × random(1, 3) por pellet) y la propiedad Damage del actor se ignora.
DamageFactor
Multiplicador del daño entrante de un tipo concreto. DamageFactor 'Fire', 0.5 divide a la mitad el daño Fire; 2.0 lo dobla; 0.0 hace al actor inmune. El modo DPS de la calculadora expone una única casilla escalar DamageFactor que cubre el caso resistente o vulnerable.
Berserker
Potenciador que multiplica por 10 el daño del puño después de la tirada random(1, 10), produciendo un rango de 20 a 200 con un valor esperado de 110. Solo el puño recibe el bono; la motosierra, los hitscan y las armas de proyectil quedan al margen.
Unidad de mapa (map unit)
Unidad de coordenadas del espacio de Doom. Por consenso de la comunidad, 16 unidades horizontales = 1 pie = 0,3048 m (Doomguy mide 56 unidades verticales = 5 pies 7 pulgadas). La calculadora convierte el Speed del proyectil (unidades por tic) a m/s, km/h y mph con la equivalencia horizontal de 16 u.m./pie.
Propiedad Speed
Velocidad del actor proyectil en unidades de mapa por tic. Bola del Imp Speed 10; cohete Speed 20; bola del fusil de plasma y bola de BFG Speed 25. Multiplica por 35 para obtener unidades por segundo; por 0,667 para metros por segundo; por 1,49 para millas por hora.
Spray de BFG
El cono de 40 rayos que la bola de BFG suelta al impactar (el spray se dispara desde el estado de muerte de la bola vía A_BFGSpray). El daño de cada rayo se calcula como la suma de 15 random(1, 8) independientes: rango 15 a 120 por rayo con un valor esperado de 67,5. La fama de la BFG de tumbar a un Cyberdemon de un disparo se la lleva el spray, no la bola en sí.
TICRATE
Constante del motor que fija la frecuencia de Doom en 35 tics por segundo desde 1993. Declarada en el doomdef.h de id Software; respetada al pie de la letra por ZDoom, GZDoom, Zandronum, PrBoom+, Boom, MBF21 y cualquier otro port vanilla-compatible. Cada duración de estado, cada argumento de Delay() y cada cálculo de tiempo de vuelo de proyectil usa 35 como constante de conversión.
DamageFunction
Alternativa a la propiedad Damage que permite a un modder devolver un entero arbitrario en el momento del impacto mediante una expresión ZScript. Salta el multiplicador random(1, 8) — devuelve un número plano para daño determinista o calcúlalo a partir de inflictor / target / distance para un comportamiento dependiente del contexto.
P_Random
Función pseudoaleatoria del motor de Doom: un índice recorre una tabla estática de 256 bytes con valores barajados entre 0 y 255 y cada llamada devuelve el siguiente byte. No es uniforme (el valor 1 no aparece nunca y el 145 aparece cinco veces), pero es suficiente para la aritmética de combate. Se usa en todas las tiradas de daño; M_Random mantiene su propio índice para los efectos no jugables, para no romper la sincronización del multijugador.
Fuentes y referencias
- El código de DOOM que id Software liberó en 1996 — las fórmulas de daño salen del propio código, no de una wiki: doomdef.h fija TICRATE en 35, p_inter.c contiene la regla de proyectil (daño × random 1..8, o 1..4 con STRIFEDAMAGE) y p_pspr.c las de hitscan (5 × random 1..3 por perdigón en pistola, escopeta y ametralladora; 2 × random 1..10 en puño y motosierra, ×10 con Berserk).
- GZDoom en GitHub — el motor mantenido, que conserva las reglas de daño originales al pie de la letra pero cambia el tiempo: desde la v3.2.2 35 tics son exactamente 1,000 s, mientras que las versiones anteriores truncaban cada tic a 28 ms y hacían que 35 tics fueran ≈ 0,98 s. Esta página ofrece los dos porque las demos y los mods antiguos corren con el tiempo viejo.
- The Doom Wiki — Tic: el paso de tiempo atómico del motor, 1/35 de segundo. Es además la razón de que aquí el tiempo de vuelo de un proyectil redondee hacia arriba: el motor avanza en tics enteros, así que un resto parcial pasa a contar como uno completo.
- The Level Design Book — métricas de Doom: la convención comunitaria que usa esta página para la unidad de mapa, 16 unidades horizontales por pie, o sea 0,01905 m por unidad. Es una convención de mapeo y no una constante del motor — el código de Doom no sabe qué es un metro.