¿Cómo diseñar una fórmula de daño en un juego de rol que mantenga equilibradas las armas con diferentes velocidades de ataque?

8

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)
marcg11
fuente
1
En su edición, tiene la fórmula que publiqué en mi respuesta ( 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.
Philipp

Respuestas:

20

Los problemas que tiene con el cálculo de DPS a partir de esa fórmula se deben a que lo que llama en BaseDamagerealidad 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 10 BaseDamage, 1,000 BaseDamageo 1,000,000 BaseDamage, siempre estará en ese rango. Donde en ese rango depende de cómo BaseDamageel arma se compara con el Defensedel objetivo. Eso significa que lo que realmente afecta el orden de magnitud del daño real de un ataque es principalmente el SkillDmgmultiplicador.

Al observar estas propiedades matemáticas, realmente no llamaría a esta propiedad de arma, BaseDamagesino DefensePenetrationque 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 BaseDamageotro factor multiplicativo:

float realDamage = SkillDmg * BaseDamage * BaseDamage / (BaseDamage + Defense) 

Si te gusta la mecánica de penetración de defensa que descubriste accidentalmente, así es como se vería con Penetrationuna estadística de arma separada:

float realDamage = SkillDmg * BaseDamage * Penetration / (Penetration + Defense) 

Lo bueno de esta fórmula es que escala bastante bien:

  • Incluso cuando la defensa es patética en comparación con el valor del ataque, nunca hay más daño que el ataque. Esto te da un límite superior de cuánto daño puede infligir un personaje, lo que facilita mucho más el equilibrio.
  • En el otro extremo, no importa cuán alto llegue la defensa, nunca puede mitigar por completo el daño (excepto a través de errores de redondeo), por lo que siempre hay margen de mejora para el defensor y nunca hay un ataque completamente inútil.
  • Cuando Defensa y Daño base (y Penetración cuando lo desee) son más o menos lo mismo, hay aproximadamente la mitad de Daño real que Daño base. Esto es cierto sin importar cuán grandes sean los valores. Esto es también en lo que puede basar su estimación de DPS. Simplemente asuma que el enemigo tiene tanta defensa como el arma tiene ataque / penetración, lo que significa que su fórmula DPS se convierte enAttackFrequency * BaseDamage / 2

Editar: Aquí hay algunas tablas con valores de ejemplo:

 Damage by Defense for single attack     

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+------+-------+-------
       35 |    35 | 17.5  | 14.4 |  9.1
Attack 50 |    50 | 29.4  | 25.0 | 16.6
      100 |   100 | 74.0  | 66.7 | 50.0

 Dps assuming HitFrequency = 100 / Attack

              Defense
          |     0 |   35  | 50   | 100
       ---+-------+-------+------+-------
       35 |   100 | 50.0  | 41.1 | 25.9
Attack 50 |   100 | 58.8  | 50.0 | 33.3          
      100 |   100 | 74.0  | 66.7 | 50.0

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.

Philipp
fuente
Gracias @Philipp, creo que eso lo resolverá. El daño será demasiado alto en este momento, pero lo modificaré.
marcg11
@ marcg11 ¿Cuál es exactamente su rango SkillDmg? Supuse que era un factor multiplicativo. Entonces un ataque básico tiene 1.0y un ataque especial de doble daño debería tener 2.0. Si prefiere que estos sean enteros, puede agregarlo en BaseDamagelugar de multiplicarlo.
Philipp
Me di cuenta de que la fórmula que diste es exactamente la misma que la mía si establezco skillDamage como un multiplicador. Así que todavía no puedo reducir a la mitad el daño de la daga si doblo la velocidad de ataque para mantener el daño.
marcg11
@ marcg11 No, no es lo mismo. La principal diferencia es que multiplico con BaseDamage cuadrado ( BaseDamage * BaseDamage), solo se multiplica por BaseDamage una vez (lo que significa que BaseDamage se reduce en la fórmula).
Philipp
Pero mi skillDmg nunca fue un porcentaje, un ataque normal skillDmg es lo mismo que baseDmg, por lo que es el mismo.
marcg11
0

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

float realDamage = (SkillDmg * DPS / ( DPS + Defense )) / AttackSpeed

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.

Ruther Rendommeleigh
fuente
Sí, esa es más o menos la idea, pero en lugar de DPS estoy usando un valor que es el mismo para todas las armas de nivel x
marcg11