Estoy haciendo un juego de rol móvil, uno infinito donde hay un sistema de botín como Diablo 3. Las armas tienen ataque y velocidad, las piezas de armadura tienen un valor de resistencia (no porcentaje).
La fórmula que estoy usando es:
float realDamage = SkillDmg * BaseDamage / ( BaseDamage + Defense )
Los resultados son buenos, el daño aumenta si la defensa baja y no aumenta exponencialmente debido a la división entre ( Daño base + Defensa).
Digamos que tengo una espada con 1.0 velocidad de ataque que causa 50 daños. Eso es 50 dps, y tengo una daga que quiero que ataque más rápido, pero, por supuesto, inflijo menos daño, para mantener los dps, la lógica dice que si la velocidad de ataque de las dagas se duplica, el daño debe reducirse a la mitad (velocidad 2.0 con 25 dmg). Pero usando la fórmula anterior verás que el daño real real DPS es menor que la espada.
Ivé resolvió esto haciendo que la daga no hiciera 25 daños, sino un poco más, haciendo algunos cálculos, puedo hacer que los dps reales sean los mismos para equilibrar las cosas. En este caso, la daga a velocidad 2.0 necesitaría infligir 32 daños para ser el mismo daño real dps que la espada.
Sin embargo, quiero mostrar el número DPS en las armas. Si solo muestro las dagas DPS como velocidad de ataque de 32 dmg * 2, serán 64 dps, en comparación con la espada de 50 dps, uno dirá claramente que la daga es mejor, pero por supuesto que no lo es.
¿Soluciones posibles? ¿Cambiar la fórmula de daño inicial? Si es así, ¿a cuál? Supongamos que no cambio la fórmula, ¿hay alguna solución? Realmente no me gusta tener que engañar a la daga para infligir más daño que la mitad para que sea incluso ...
Realmente desearía saber la fórmula de daño para diablo 3. Sé que diablo 3 armas DPS es simplemente daño base * velocidad de ataque.
Editar:
Lets assume defense = 50 and normal attack (skillDmg = baseDmg)
Sword 1.0 attack speed dealing 50 dmg -> real damage hit= 50 * 50 / ( 50 + 50 ) = **25 dmg** = 25 dps
Dagger 2.0 attack speed dealing 32 dmg -> real damage hit = 32 * 32 / ( 32 + 50 ) = **12.5 dmg** = 25 dps
Sword item, lets display the actual sword dps, 50 * 1.0 = **50 dps**
Dagger item, lets display the dagger dps, 32 * 2.0 = **64 dps** (SHOULD BE THE SAME)
fuente
damage * damage / ( damage + defense)
), solo sin tener en cuenta el daño de habilidad. La razón de la diferencia en DPS es porque está utilizando la misma defensa. La razón por la que obtienes resultados diferentes es porque con esa fórmula, las armas lentas pero fuertes son mejores contra los enemigos de alta definición, mientras que las armas rápidas pero débiles son mejores contra los enemigos de baja definición (lo que parece plausible). Asumiste un enemigo de alta definición y balanceaste ambas armas contra él, lo que significa que hiciste que la daga fuera dominada. El cálculo de DPS muestra esa sobrepotencia.Respuestas:
Los problemas que tiene con el cálculo de DPS a partir de esa fórmula se deben a que lo que llama en
BaseDamage
realidad no parece ser eso.Suponiendo que todos los números son positivos,
BaseDamage / ( BaseDamage + Defense )
siempre se resolverá en un número de coma flotante en algún lugar entre 1 y 0. No importa si tiene 10BaseDamage
, 1,000BaseDamage
o 1,000,000BaseDamage
, siempre estará en ese rango. Donde en ese rango depende de cómoBaseDamage
el arma se compara con elDefense
del objetivo. Eso significa que lo que realmente afecta el orden de magnitud del daño real de un ataque es principalmente elSkillDmg
multiplicador.Al observar estas propiedades matemáticas, realmente no llamaría a esta propiedad de arma,
BaseDamage
sinoDefensePenetration
que describe la capacidad del arma para vencer a la defensa enemiga y aún hacer la mayor parte de su daño. Esto podría ser una mecánica interesante (o no ... es algo que necesitas probar), pero no dice mucho sobre el nivel de potencia de un arma.Entonces, ¿cómo resolvemos este problema?
Bueno, no hay una solución correcta para este problema. Pero un cambio que podría hacer lo que quieres hacer (el doble de arma poderosa = aproximadamente el doble de daño) es agregar el
BaseDamage
otro factor multiplicativo:Si te gusta la mecánica de penetración de defensa que descubriste accidentalmente, así es como se vería con
Penetration
una estadística de arma separada:Lo bueno de esta fórmula es que escala bastante bien:
AttackFrequency * BaseDamage / 2
Editar: Aquí hay algunas tablas con valores de ejemplo:
Como puede ver en estos números, las armas de alto daño y baja velocidad siguen siendo nominalmente más poderosas contra el mismo enemigo que las armas de bajo daño y alta velocidad si tienen el mismo DPS
AttackFrequency * BaseDamage / 2
. Pero el efecto es más visible en enemigos de alta definición que en enemigos de baja definición. Ambos son igualmente buenos en enemigos de 0 def. Eso significa que las armas de ataque rápido son menos malas en enemigos de baja definición que en enemigos de alta definición.Esto podría equilibrarse por el hecho de que las armas de alta velocidad le dan al jugador más flexibilidad con respecto a la distribución de daños y, por lo tanto, les permite evitar el desperdicio de DPS en matanzas excesivas. Cuando el jugador se enfrenta a una gran cantidad de enemigos muy débiles que mueren con un solo golpe, un arma de 5 ataques por segundo puede matar a 5 enemigos por segundo, mientras que un arma de 1 ataque por segundo solo puede matar a 1 enemigo por segundo. Otra posible ventaja aparece cuando agrega aleatoriedad a los ataques. Debido a la ley de grandes números, muchos ataques débiles producirán un daño más suave y confiable que unos pocos fuertes. Los jugadores generalmente se benefician de la fiabilidad. Pero cuando tales consideraciones son irrelevantes debido a la mecánica del juego y / o el diseño del encuentro, tendrás que hacer que tus armas más rápidas sean un poco más poderosas de lo que deberían ser para compensar.
Una forma de dar un impulso a las armas de alta velocidad podría ser la introducción de efectos que se disparan con un x% de probabilidad por golpe y no dependen del daño. Estos serían mucho más poderosos con un arma de ataque rápido porque se dispararían con mucha más frecuencia.
fuente
SkillDmg
? Supuse que era un factor multiplicativo. Entonces un ataque básico tiene1.0
y un ataque especial de doble daño debería tener2.0
. Si prefiere que estos sean enteros, puede agregarlo enBaseDamage
lugar de multiplicarlo.BaseDamage * BaseDamage
), solo se multiplica por BaseDamage una vez (lo que significa que BaseDamage se reduce en la fórmula).Si tiene la intención de que armas de igual "poder" den como resultado un DPS igual, una solución fácil sería asignar DPS directamente y calcular el daño por golpe de eso, por ejemplo
En este ejemplo, tu espada tendría 50 DPS y velocidad de ataque 1.0 y la daga tendría 50 DPS y velocidad de ataque 2.0. Si desea mostrar el daño por golpe, eso es simplemente DPS dividido por la velocidad de ataque (es decir, 50 para la espada y 25 para la daga).
Tenga en cuenta que esto elimina la mecánica de "las armas más lentas son mejores que las de alta defensa", que supongo que es lo que quiere.
fuente