¿Cómo desarrollar fórmulas de daño RPG?

117

Estoy desarrollando un RPG 2D clásico (en una línea similar a la fantasía final) y me preguntaba si alguien tenía algún consejo sobre cómo hacer fórmulas de daño / enlaces a recursos / ejemplos. Explicaré mi configuración actual. Espero no exagerar con esta pregunta, y me disculpo si mis preguntas son demasiado grandes / amplias

Las estadísticas de Mis personajes se componen de lo siguiente:

enum Stat
{
    HP = 0,
    MP = 1,
    SP = 2,
    Strength = 3,
    Vitality = 4,
    Magic = 5,
    Spirit = 6,
    Skill = 7,
    Speed = 8, //Speed/Agility are the same thing
    Agility = 8,
    Evasion = 9,
    MgEvasion = 10,
    Accuracy = 11,
    Luck = 12,
};

La vitalidad es básicamente defensa contra ataques físicos y el espíritu es defensa contra ataques mágicos.

Todas las estadísticas tienen máximos fijos (9999 para HP, 999 para MP / SP y 255 para el resto). Con las habilidades, los máximos se pueden aumentar (99999 para HP, 9999 para HP / SP, 999 para el resto) con valores típicos (en el nivel 100) antes / después de habilidades + equipo + etc. será 8000 / 20,000 para HP, 800 / 2000 para SP / MP, 180/350 para otras estadísticas

El Enemigo HP del juego tardío generalmente estará en los millones más bajos (con un súper jefe con un máximo de ~ 12 millones)

Me preguntaba cómo las personas realmente desarrollan fórmulas de daño adecuadas que se escalan correctamente. Por ejemplo, en base a estos datos, usar las fórmulas de daño para Final Fantasy X como base parecía muy prometedor. Una referencia completa aquí http://www.gamefaqs.com/ps2/197344-final-fantasy-x/faqs/31381 pero como un ejemplo rápido: Str = 127, comando 'Ataque' usado, enemigo Def = 34.

1. Physical Damage Calculation:
Step 1 ------------------------------------- [{(Stat^3 ÷ 32) + 32} x DmCon ÷16]
Step 2 ---------------------------------------- [{(127^3 ÷ 32) + 32} x 16 ÷ 16]
Step 3 -------------------------------------- [{(2048383 ÷ 32) + 32} x 16 ÷ 16]
Step 4 --------------------------------------------------- [{(64011) + 32} x 1]
Step 5 -------------------------------------------------------- [{(64043 x 1)}]
Step 6 ---------------------------------------------------- Base Damage = 64043
Step 7 ----------------------------------------- [{(Def - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------ [{(34 - 280.4)^2} ÷ 110] + 16
Step 9 ------------------------------------------------- [(-246)^2) ÷ 110] + 16
Step 10 ---------------------------------------------------- [60516 ÷ 110] + 16
Step 11 ------------------------------------------------------------ [550] + 16
Step 12 ---------------------------------------------------------- DefNum = 566
Step 13 ---------------------------------------------- [BaseDmg * DefNum ÷ 730]
Step 14 --------------------------------------------------- [64043 * 566 ÷ 730]
Step 15 ------------------------------------------------------ [36248338 ÷ 730]
Step 16 ------------------------------------------------- Base Damage 2 = 49655
Step 17 ------------ Base Damage 2 * {730 - (Def * 51 - Def^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ---------------------- 49655 * {730 - (34 * 51 - 34^2 ÷ 11) ÷ 10} ÷ 730
Step 19 ------------------------- 49655 * {730 - (1734 - 1156 ÷ 11) ÷ 10} ÷ 730
Step 20 ------------------------------- 49655 * {730 - (1734 - 105) ÷ 10} ÷ 730
Step 21 ------------------------------------- 49655 * {730 - (1629) ÷ 10} ÷ 730
Step 22 --------------------------------------------- 49655 * {730 - 162} ÷ 730
Step 23 ----------------------------------------------------- 49655 * 568 ÷ 730
Step 24 -------------------------------------------------- Final Damage = 38635

Simplemente modifiqué los divisores para incluir el índice de ataque de las armas y el índice de armadura.

El daño mágico se calcula de la siguiente manera: Mag = 255, se usa Ultima, enemigo MDef = 1

Step 1 ----------------------------------- [DmCon * ([Stat^2 ÷ 6] + DmCon) ÷ 4]
Step 2 ------------------------------------------ [70 * ([255^2 ÷ 6] + 70) ÷ 4]
Step 3 ------------------------------------------ [70 * ([65025 ÷ 6] + 70) ÷ 4]
Step 4 ------------------------------------------------ [70 * (10837 + 70) ÷ 4]
Step 5 ----------------------------------------------------- [70 * (10907) ÷ 4]
Step 6 ------------------------------------ Base Damage = 190872 [cut to 99999]
Step 7 ---------------------------------------- [{(MDef - 280.4)^2} ÷ 110] + 16
Step 8 ------------------------------------------- [{(1 - 280.4)^2} ÷ 110] + 16
Step 9 ---------------------------------------------- [{(-279.4)^2} ÷ 110] + 16
Step 10 -------------------------------------------------- [(78064) ÷ 110] + 16
Step 11 ------------------------------------------------------------ [709] + 16
Step 12 --------------------------------------------------------- MDefNum = 725
Step 13 --------------------------------------------- [BaseDmg * MDefNum ÷ 730]
Step 14 --------------------------------------------------- [99999 * 725 ÷ 730]
Step 15 ------------------------------------------------- Base Damage 2 = 99314
Step 16 ---------- Base Damage 2 * {730 - (MDef * 51 - MDef^2 ÷ 11) ÷ 10} ÷ 730
Step 17 ------------------------ 99314 * {730 - (1 * 51 - 1^2 ÷ 11) ÷ 10} ÷ 730
Step 18 ------------------------------ 99314 * {730 - (51 - 1 ÷ 11) ÷ 10} ÷ 730
Step 19 --------------------------------------- 99314 * {730 - (49) ÷ 10} ÷ 730
Step 20 ----------------------------------------------------- 99314 * 725 ÷ 730
Step 21 -------------------------------------------------- Final Damage = 98633

El problema es que las fórmulas se desmoronan por completo una vez que las estadísticas comienzan a superar 255. En particular, los valores de Defensa superiores a 300 comienzan a generar un comportamiento realmente extraño. Las estadísticas de Alta Fuerza + Defensa conducen a valores negativos masivos, por ejemplo. Si bien podría modificar las fórmulas para que funcionen correctamente para mi caso de uso, probablemente sería más fácil usar una fórmula completamente nueva. ¿Cómo las personas realmente desarrollan fórmulas de daño? Estaba considerando abrir Excel e intentar construir la fórmula de esa manera (mapeando Estadísticas de Ataque vs. Estadísticas de Defensa, por ejemplo) pero me preguntaba si hay una manera más fácil. Si bien no puedo transmitir la mecánica completa del juego aquí, ¿alguien podría sugerir un buen punto de partida para construir una fórmula de daño?

Gracias

usuario127817
fuente
1
Creo que has hecho lo correcto al configurar primero qué tipo de estadísticas, HP, etc. quieres. Esto es parte de la experiencia del jugador y las matemáticas deben ajustarse a estos valores. Sin embargo, con tantas estadísticas, el jugador debe saber intuitivamente qué estadísticas afectarán sus ataques mágicos, físicos, etc. Entonces, la primera gran pregunta es qué estadísticas corresponden a un ataque y qué estadísticas defienden contra estas estadísticas (para ex PhDef defiende solo contra PhAtk).
Jonathan Connell
Lo importante es el equilibrio, probablemente sería una buena idea crear un programa interactivo (digamos en C # o algo rápido) donde pueda cambiar las estadísticas y ver qué tipo de resultados obtiene. Si puede cambiar las fórmulas en tiempo de ejecución, eso también ayudaría :)
Jonathan Connell
44
Considere usar Excel para hacer esto. Parece muy adecuado para la tarea y no tendría que escribir una línea de código.
Alex Schearer
2
La pregunta más importante es: ¿Qué fórmula les da más diversión a los jugadores ? (buscó "diversión" en la página y ninguna de las respuestas lo mencionó: P) Si las estadísticas o el daño aumentan demasiado rápido, los jugadores se insensibilizan, si sube lentamente, se aburren. Los jugadores deben sentirse felices cuando ganan un nivel, por lo que necesitan sentir que ponen trabajo en ello y también que tendrá un efecto notable en el rendimiento de su juego. (ese es mi 2 peniques)
Annan
3
"(Def - 280.4) ^ 2" ¿eh? Bueno, esperaría que las cosas se pongan raras, no para Def> 255 o Def> 300, sino más o menos exactamente para Def> 280.4;) Después de eso, una def más alta significará efectivamente una def más baja en este punto de la fórmula mientras continúa comportándose como esperado en otros puntos. Por cierto, puedes trazar estas cosas con Wolfram Alpha o algo así. Arregle suficientes variables para mantener solo dos y obtendrá una buena gráfica de superficie.
Christian

Respuestas:

140

Crear fórmulas como esta requiere el conocimiento de las funciones matemáticas elementales , las cosas que aprendió en las clases de Álgebra y Precálculo.

Una vez que los haya dominado, pregúntese (reemplace "valor" con "daño" o "salud" o "velocidad" o lo que sea) :

Luego solo modifíquelo (agregue / multiplique cosas, cambie el valor base, etc.) hasta que se sienta bien. Una calculadora gráfica lo ayudará a visualizar cómo los cambios en los parámetros afectarán la función.


Por cierto, los problemas que está experimentando se deben a desbordamientos de enteros .

Use tipos variables que sean lo suficientemente grandes como para contener los números con los que está trabajando. Los tamaños difieren según la plataforma en C ++, pero el uso del compilador de Visual Studio de unsigned int32 bits es de 32 bits, mientras que unsigned __int64 (específico de MS) es de 64 bits. También considere usar a double.

Además, intente reorganizar sus operaciones para que no encuentre números tan grandes en primer lugar (por ejemplo, en lugar de MDef * MDef / 110hacerlo (int)((float)MDef / 110 * MDef)) .

BlueRaja - Danny Pflughoeft
fuente
3
Si se encuentra con desbordamientos de enteros, la conversión a flotante, que solo admite de manera confiable 24 bits de parte entera, tendrá un conjunto diferente de problemas de precisión.
@ Joe: He revertido tu edición; Elegí específicamente __int64sobre uint64_tporque stdint.hno está disponible en Visual Studio 2008 y más adelante, y yo no quería confundir al pobre chico más de lo que ya es.
BlueRaja - Danny Pflughoeft
1
@BlueRaja: No veo ninguna evidencia de que el autor de la pregunta esté usando Visual Studio, y está presente en todas las demás cadenas de herramientas estándar (incluido Visual Studio 2010).
También dejó de lado una variante importante, creo: si desea que el daño tenga un límite superior al que pueda acercarse, pero nunca alcanzarlo, puede usar una función sigmoidea.
Martin Sojka
1
user127817: Todo lo que es realmente importante es cómo crece la función. Por lo demás, solo pruébalo hasta que se sienta equilibrado. Si sientes que el personaje es demasiado poderoso, baja su daño. Si crees que lleva mucho tiempo matar a un jefe o enemigo en particular, baja la salud o la armadura de ese enemigo. Y así.
BlueRaja - Danny Pflughoeft
31

Las estadísticas de Mis personajes se componen de lo siguiente:

Ahí está su verdadero problema: definió sus estadísticas antes de definir qué significan realmente esas estadísticas . Estás poniendo el carro delante del caballo.

Mira cómo funciona D&D (sobremesa). "Fuerza" no significa nada en sí mismo; solo significa algo porque hay una regla que dice: "Agrega tu bonificación de fuerza a tu ataque cuerpo a cuerpo". Esa regla es parte de las reglas de combate de D&D. Sin las reglas de combate, "Fuerza" es generalmente una cantidad sin sentido.

La primera pregunta que debes hacerte es esta: ¿cuánta diferencia quiero entre los personajes? Una vez más, mira D&D. Allí, tienen 6 estadísticas básicas. Estas estadísticas definen diferentes dimensiones de juego para los personajes. Un personaje con una alta Destreza tendrá diferentes opciones que un personaje con baja Destreza.

Pero la razón de incluso esa diferencia vuelve a las reglas. Una alta destreza significa bonificaciones a los ataques a distancia; puedes golpear más a menudo con ataques a distancia. Entonces, solo entre Fuerza y ​​Destreza, tienes dos dimensiones de juego: rango vs. cuerpo a cuerpo.

La inteligencia y la sabiduría también forman una especie de pareja, pero estas interactúan más con clases específicas. Int hace que los magos y otros lanzadores de conjuros arcanos sean mejores (o posibles bajo algunos conjuntos de reglas), la sabiduría es vital para los clérigos y otros lanzadores de conjuros divinos. Debido a que los hechizos divinos y arcanos tienen diferentes listas de hechizos, estas dos estadísticas están involucradas en diferentes dimensiones del juego.

Debe definir las reglas básicas en torno a las estadísticas antes de poder definir funciones de progresión de crecimiento y similares. No necesitas detalles; no es necesario decir que "cada punto de fuerza se agrega a la tirada aleatoria para determinar si un ataque cuerpo a cuerpo impacta". Lo que necesita son meta-reglas como "la destreza hace que los atacantes a distancia sean mejores". Puedes descubrir exactamente cómo los hace mejores más adelante.

Hay diferentes formas de progresar personajes. Un truco común de Final Fantasy de la vieja escuela era simplemente usar el nivel del personaje como parte de sus cálculos de daño. Esto podría ser simplemente multiplicar el nivel por la estadística apropiada, o podría significar aplicar una función al nivel del personaje. Digamos, una progresión cuadrática, de modo que la tasa de daño de un personaje aumentaría por nivel.

Como quiera que tus funciones de combate funcionen, deben tener en cuenta la progresión. Sus funciones necesitan ganchos para la progresión.

D&D tiene una forma divertida de progresión. Es en parte basado en la clase; cada vez que subes de nivel, obtienes nuevas características de clase y un bono fijo para tu golpe, según tu clase de personaje. Sin embargo, algunas características de clase mejoraron por sí mismas. Los hechizos en D&D tendrían progresión incorporada. Un hechizo puede hacer 1d4 de daño por 2 niveles de un lanzador de hechizos por encima del primero. Así que cualquier otro nivel de mago mejora ese hechizo.

D&D también utilizó mucho la progresión basada en elementos. Hasta la 4ª edición, la progresión basada en objetos era principalmente para personajes luchadores, pero incluso en las ediciones más antiguas, los lanzadores de hechizos tenían objetos que les daban beneficios de estadísticas u otros ajustes (o simplemente les daban hechizos).

Así que los elementos son otra cosa que tus funciones de combate deben tener en cuenta. ¿Los objetos solo mejoran una o más estadísticas mientras están equipados, o hacen otras cosas también? D&D era un poco extraño, ya que las estadísticas rara vez cambiaban; las armas simplemente hicieron daño XdY, posiblemente con una bonificación basada en una de tus estadísticas. Y eso fue eso. Entonces, tu única forma de hacer más daño en la batalla era encontrar un arma mejor. En muchos juegos de rol de videojuegos, tienen en cuenta el nivel además del arma.

Nicol Bolas
fuente
66
" Ahí está tu verdadero problema: definiste tus estadísticas antes de definir qué significan realmente esas estadísticas. Estás poniendo el carro delante del caballo ". Estoy totalmente en desacuerdo; Los números en sí mismos son solo una forma de informar al jugador de su poder, etc. Es parte del diseño del juego. Si continúas al revés, podrías terminar con un jefe final con 147 CV ... ¿quién quiere eso realmente?
Jonathan Connell
8
Bueno, Sarevok (en Baldurs Gate) solo tenía 135 HP ...
Martin Sojka
12
@ 3nixios: ¿Qué importa si el jefe final tiene 147Hp? Lo que importa es si el último jefe es desafiante, interesante y, sobre todo, gratificante para la derrota. Un jefe con mucha Hp no es interesante; es una pérdida de tiempo. Un jefe que pueda meterse con tu grupo, que requiera tácticas especiales que cambien de un momento a otro, que requiera que uses todas las habilidades que tengas a su máximo potencial, eso es lo que lo convierte en un gran jefe final. Tomaré el interesante jefe de 147Hp sobre el aburrido bloque de Hp cualquier día.
Nicol Bolas
@Nicol Bolas Estoy totalmente de acuerdo con usted, estaba tratando de apoyar por qué creo que el punto de partida debe ser desde las estadísticas. Las estadísticas con las que comienza un jugador son la indicación principal y la jugabilidad con la que juega durante el juego. Estoy de acuerdo en que las enormes barras de HP para los jefes no son necesarias, le da al jugador una mejor indicación de cuál es la mejor configuración contra el jefe, qué armas estadísticas, etc. son más efectivas. La cantidad, por supuesto, es irrelevante para la forma en que lo calcula, porque puede dividir o multiplicar sus cálculos finales por una constante c y listo.
Jonathan Connell
2
@ 3nixios: Pero eso es parte de mi punto. La destreza en D&D existe para permitir una diferenciación entre los personajes especialistas cuerpo a cuerpo y los especialistas a distancia. Si no existiera el concepto de ataques cuerpo a cuerpo y a distancia (y en muchos juegos FF, por ejemplo, no lo hay), entonces esta distinción no necesitaría existir. Podría salirse con 5 estadísticas en lugar de 6. Definir un rango de HP es una cosa, pero definir qué estadísticas básicas tiene es otra. Las estadísticas requieren reglas antes de que puedas entenderlas, y debes saber qué piensas hacer una estadística antes de poder decir que tener esa estadística es una buena idea.
Nicol Bolas
22

Tus fórmulas parecen bastante complicadas. No estoy seguro de cómo los desarrolladores profesionales de RPG manejan esto, pero recomendaría centrarse en la simplicidad. Intente encontrar la fórmula más simple posible que aún incorpore el rango de estadísticas que desea usar. Por ejemplo, ¿podría hacer que las estadísticas se modifiquen entre sí antes del cálculo del daño, en lugar de modificar el daño durante el cálculo? Una vez que tenga una fórmula en mente, intentaré graficarla para una amplia gama de valores posibles para ver cómo se comportará a medida que los jugadores suban de nivel. Obviamente, cuantas menos variables tenga, más factible será.

Además, BlueRaja proporcionó una explicación importante de por qué podría estar viendo valores inesperados en niveles estadísticos más altos. Usar tipos sin firmar y verificar desbordamientos será importante.

Mitch Lindgren
fuente
10
+1 para simple. Cualquiera puede hacer cosas rigurosamente complicadas, aunque eso no es un buen juego.
aaaaaaaaaaaa
8
@Randolf, a menos que esté ejecutando una Apple 2 o algo así, es muy dudoso que eliminar una multiplicación o una división aquí y allá afecte el rendimiento de una manera mensurable.
Tetrad
8
@Randolf Una gran batalla en un juego de rol podría significar algo así como 10 cálculos de daño por segundo, una CPU moderna puede hacer varios miles de millones de operaciones por segundo. Puede suponer con seguridad que el impacto en el rendimiento de cualquier matemática "visible" es insignificante. Simple en este caso es por el bien de quienes diseñan y aquellos que juegan el juego, no para nuestras computadoras.
aaaaaaaaaaaa
66
@Randolf Richardson: Creo que es posible que te estés perdiendo el objetivo un poco en este caso. Para un MMO, un buen protocolo rápido sin grasa es primordial, y las tareas pesadas como la física deben diseñarse teniendo en cuenta el rendimiento. Pero el cálculo del daño es la jugabilidad principal, debe diseñarse teniendo en cuenta la jugabilidad, si plantea problemas de rendimiento en una pregunta de este tipo, corre el riesgo de comprometer la parte del juego. Hable sobre el rendimiento cuando sea importante, corre el riesgo de dar la impresión de que esta es un área importante para optimizar, robando así la atención de los verdaderos pecadores de rendimiento.
aaaaaaaaaaaa
55
@Randolf: No estoy insinuando nada; Estoy diciendo que optimizar algo que no es un cuello de botella es una pérdida de tiempo.
Nicol Bolas
11

El Enemigo HP del juego tardío generalmente estará en los millones más bajos (con un súper jefe con un máximo de ~ 12 millones)

Tengo un problema con esto. Debes construir tus jefes alrededor de lo que crees que tus jugadores deberían poder manejar. Estás creando tus jugadores y tu fórmula de combate en torno a cómo quieres que sean tus jefes.

Una vez que construyes tu mecánica de combate y tus roles, puedes decidir cómo quieres diseñar tus jefes, ya que debería ser un buen equilibrio entre el daño que los jugadores pueden causar / absorber frente a lo que el jefe puede tratar / absorber.

Conocer
fuente
44
+1 la salud del enemigo debe basarse en lo que el jugador puede manejar razonablemente en ese punto, no al revés.
BlueRaja - Danny Pflughoeft
7

Esos números que citó probablemente se derivan de un simple ajuste de una simulación, a lo largo de miles de ejecuciones.

Entonces, debes escribir una simulación para crear un personaje de nivel 20 y ver cómo le va a través de 200 batallas más o menos contra los tipos de enemigos con los que se supone que está luchando en ese momento. Hazlo nuevamente para un personaje de nivel 30 (presumiblemente en la siguiente sección del mundo).

Tomará un tiempo hacerlo bien, pero escribir simulaciones automáticas definitivamente hará que esto sea mucho más fácil que solo adivinar y jugar manualmente.

bobobobo
fuente
5

Creo que comete el error de querer crear una fórmula sin tener en mente un diseño adecuado.

Primero comience con un diseño, luego comience a pensar en representar el diseño en fórmulas. Cuanto más claro sea su diseño, más fácil debería ser encontrar fórmulas simples y / o precisas.

Intenta implementar "tipos" de enemigos, por ejemplo, "blindado" => un ataque de jugador si es de tipo físico se reduce en un 50%. No haga que una batalla fluya hacia lo abstracto, piense en lo que es relevante y lo que no lo es.

Si su diseño dice que los "enemigos blindados" son débiles contra la magia pero fuertes contra el daño físico, represente eso en código. Pero recuerde que ha realizado muchas pruebas, porque los valores no funcionarán mágicamente la primera vez que escriba el código. Intente crear un diseño, ponga la lógica en el código, siempre verifique si esta es la representación técnica de lo que tenía en mente y si no cambia los valores hasta que lo sea.

daemonfire300
fuente
Ya estaba abarcando ese tipo de cosas: la clasificación de armadura reduce el daño de ataque físico a menos que el ataque se marque como perforación de armadura o use una fórmula de daño basada en%
user127817
5

Aunque mi diseño no ha dejado la fase de hoja de cálculo, he llegado a una conclusión sobre el diseño de las matemáticas para RPG:

Mantenlos lo más simple posible. En el diseño en el que estoy trabajando, utilicé fórmulas muy simplistas, que son adecuadas para un sistema sin clase. Es decir. El hechizo Bola de fuego tiene un daño de 30. Lo formal es:

BaseSpellDamage * Attribute (5 * 6)

También podemos agregar modificadores como este:

Result = (BaseSpellDamage * Attribute) (5*6)
Result = Result + (Result * 50%) (30 = 30 + (30 * 50%))

Entonces el resultado final sería 45 daños. Descubrí que usar multiplicadores de porcentajes es una solución muy fácil y muy escalable para trabajar. En lugar de venir con algunos números impares con matemáticas complejas para descubrir el resultado que queremos.

Ahora podemos calcular la resistencia al daño, eso solo calculará la defensa contra el tipo de daño establecido. Hay dos enfoques y, sinceramente, no he decidido cuál se adaptaría mejor, pero ambos son simples y viables:

DamageResult = Resistance * Damage ( 50% * 45)

Entonces, el resultado final será el daño recibido (solo corté el resultado parcial).

Otra fórmula:

DamageResult = Damage - Resistnace (45 - 22).

Entonces el resultado final será 23. Si sucede que la resistencia es mayor que el daño recibido, el personaje simplemente no recibe ningún daño. Por supuesto, depende de usted asegurarse de que tal situación no tenga lugar, excepto cuando lo desee.

Aunque debo admitir que la escala de porcentajes es algo más fácil de equilibrar y escalar. Pero esto también depende de sus números base. La escala de porcentajes funcionará mejor si comienza desde 100 en adelante. Si está operando con números pequeños (cualquier cosa por debajo de 100 para ser honesto), puede ser incómodo ya que comenzará a obtener resultados de coma flotante, será difícil de equilibrar y realmente hará algo interesante con ellos.

Probablemente la solución óptima en ese caso es usar ambos enfoques cuando lo vean conveniente. O si eres fanático de los grandes números, comienza desde 1000.

Y al final termina. No he llegado a estas conclusiones completamente solo. De hecho, he pasado bastante tiempo leyendo varios manuales de juegos de rol (Hero, DnD). Especialmente DnD fue útil, ya que opera en principios similares, pero en lugar de atributos que usa niveles para sus fórmulas, pueden ser a veces más complejos. De lo que presenté aquí.

En cualquier caso, el mejor consejo es: trate de mantenerlos lo más simple posible. No use ninguna matemática avanzada o ecuaciones largas, ya que son propensas a errores, que son difíciles de detectar, cuando tiene que lidiar con 87234 otras cosas al mismo tiempo.

Łukasz Baran
fuente
3

Como otros han mencionado, la fórmula Final Fantasy X es bastante compleja. Generalmente para esa serie, cuanto más tarde el juego, más complicada es la fórmula. Probablemente sea más fácil basar tu fórmula de daño en otro juego completamente. Pero en general, creo que vale la pena discutir desde un nivel muy general qué tipo de fórmulas de daño puedes encontrar en el mundo y cómo puedes hacer un juego basado en ellas. Lo primero que debes decidir es cuánto daño quieres hacer al final del juego y qué tipo de estadísticas quieres que tenga el jugador. Una vez que tenga eso, puede elegir un sistema de fórmula y luego optimizar los valores de fórmula y arma para reflejar esos rangos a lo largo del tiempo.

Puramente basado en estadísticas

Esta es una buena idea si quieres que tus personajes sean flexibles en términos de qué niveles de enemigos pueden desafiar. Una fórmula como esta solo dependerá de las estadísticas del jugador, su equipo y las estadísticas de los enemigos. Estas fórmulas suelen ser bastante simples. Final Fantasy Legend II (Ver http://www.shenafu.com/ffl2/weapon.php, por ejemplo, tiene armas que hacen daño según la fórmula simple:

(Stat+StatBonus)*WeaponStrength - Defense*4

Una fórmula como esta es buena si desea un método muy simple para estimar el daño, o un punto de partida rápido para modificar el daño basado en otros factores como habilidades y debilidades elementales.

Para mostrar cuán amplio puede llegar a ser este tipo de fórmula, considere la fórmula de daño para Inflation RPG, un juego de Android e iOS (consulte http://inflation-rpg.wikia.com/wiki/Calculations ). La fórmula depende en gran medida de las estadísticas y del equipo. Cada pieza de equipo tiene dos estadísticas: una bonificación a la estadística ATK y un valor multiplicador. Algunos equipos tienen multiplicadores bajos, pero bonificaciones altas, otros tienen bonificaciones bajas pero multiplicadores altos. Para un personaje con solo 10 ATK, el Battle Axe con su 5000 ATK Bonus pero un multiplicador bajo del 145% es una gran opción. El daño total es (10+5000)*1.45 = 7264, pero el Estoc, con 0 bonus y un multiplicador del 300% es una mala elección, el daño sí lo es (10+0)*3 = 30. Más adelante en el juego, un personaje con 5000 ataques preferiría cambiar de arma.

Basado en estadísticas y niveles:

Un buen ejemplo de esto es Final Fantasy V, VI y Final Fantasy XII (ver http://www.gamefaqs.com/ps2/459841-final-fantasy-xii/faqs/45900 , por ejemplo). La fórmula para espadas en FFXII es:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+STR)/256]

y la fórmula de daño para pentagramas es:

DMG = [ATK x RANDOM(1~1.125) - DEF] x [1 + STR x (Lv+MAG)/256]

Son muy similares, pero tenga en cuenta que la fórmula de la espada solo depende de la fuerza y ​​el nivel, mientras que la fórmula del bastón depende de la fuerza, la magia y el nivel. La ventaja de este tipo de fórmula es que le permite al jugador dos vías de crecimiento: construir sus estadísticas o sus niveles. La desventaja es que también penaliza a los personajes en ambos sentidos. Lo que esto realmente termina haciendo es permitir que el jugador suba de nivel para aumentar su producción de daño (para FFXII, esto equivale a aumentar su producción de daño en ~ 4% por nivel alrededor del nivel 50 cuando se tienen en cuenta las ganancias de estadísticas) para ayudar a personalizar la dificultad a su nivel. nivel de comodidad.

Daño fijo:

Las fórmulas de daño fijo no dependen de las estadísticas o el nivel del personaje, sino de la fórmula de daño interno del arma. Todavía pueden variar en un rango, pero causan el mismo daño independientemente del usuario (salvo cualquier otro efecto especial o rasgo de personaje). Se usan mejor si el arma va a hacer daño fijo y la capacidad de equipar el arma depende de las estadísticas y / o el nivel. Diablo 2, por ejemplo, hace esto, al igual que muchos roguelikes que tienen armas que dependen de tiradas de dado. Dicho esto, 'daño fijo' no implica "no aleatorio", y de hecho, generalmente hay algún elemento de aleatoriedad en el daño causado.

Esta es una buena metodología si quieres tener armas que sean fáciles de transferir entre personajes o para controlar cuidadosamente el daño que pueden hacer los personajes en ciertos puntos del juego si sabes a qué equipo tienen acceso (a través de tablas de caída, cofres y robar mesas).

Otro lugar en el que te encontrarás es con ciertos tipos de equipos u objetos en Final Fantasy. 1000 agujas, por ejemplo, siempre inflige 1000 de daño. En Final Fantasy Legend II, las artes marciales infligen daño según la fórmula:

Damage = WeaponStrength*(90-UsesLeft) - 4*Defense

Final Fantasy XII también tiene un daño fijo para las armas, que inflige daño de acuerdo con la fórmula:

DMG = [ATK x RANDOM(1~1.125)]^2

Aunque el daño es algo aleatorio, solo varía en un 26.5 por ciento sobre el rango total, por lo que se garantiza que hará un cierto nivel de daño en promedio con el tiempo. Estos tipos de ataques son útiles para los personajes que tienen estadísticas bajas y niveles bajos en los juegos que normalmente explican esos factores para infligir daño. Además, ignoran la defensa del objetivo (aunque la fórmula podría modificarse fácilmente para ajustarse en defensa si así lo desea).

Foo Barrigno
fuente
2

Todos los juegos de la serie de fantasía final han tenido un límite de estadísticas de 255 debido al problema que estás encontrando. en el nivel 100 las estadísticas serían 255.

dices sobre aumentar las estadísticas con habilidades y equipos y recuerdo haber visto esto en los juegos, pero la forma en que se hace esto está en la fórmula. hay un paso adicional que verifica los modificadores de habilidad y equipo y los aplica después de que se hayan utilizado las estadísticas.

en su caso, sería el paso 21: aplicar modificadores de habilidad paso 22: aplicar modificadores de equipo paso23: daño final.

si estás interesado en google para las fórmulas de fantasía final, están disponibles. Tengo copias de la mecánica de batalla real, incluida la inteligencia artificial para Final Fantasy 4, 6, 7 y 9. La gente los descifró de los juegos originales cuando creaban roms para emuladores. No es tan difícil de encontrar si te fijas lo suficiente.

Lo más importante para crear fórmulas es probar. configura un script para ejecutar tu batalla con ai en ambos lados y ejecuta varios cientos de batallas. variar los monstruos y las estadísticas y ver si funciona o si lv 40 mata todo, es completamente posible que un jefe sea realmente imposible de matar jajaja. Un consejo sería desactivar todas las animaciones, ya que es impresionante lo rápido que la IA puede luchar cuando nadie está mirando.

Skeith
fuente
2

Me preguntaba cómo las personas realmente desarrollan fórmulas de daño adecuadas que se escalan correctamente.

Las 2 primeras cosas son:

  • decide qué quieres decir con "correctamente": ¿cuál es tu idea de "daño correcto"?
  • decide qué quieres decir con 'escala': ¿qué valores van a cambiar y qué efecto quieres que tengan esos cambios?

Una vez que sepa eso, tiene suficiente información para usar las fórmulas matemáticas que BlueRaja mencionó en su respuesta . Solo recuerda que no existe una fórmula de daño 'adecuada', solo una que coincida con tu diseño para el tipo de experiencia que deseas que tengan tus jugadores.

Kylotan
fuente
Este es un comentario extremadamente inútil. Resume "No lo sé" y por eso es una pérdida de tiempo para todos. Marcado para eliminación.
Krythic
1

alternativamente, si está buscando una fórmula muy simple, haga lo siguiente:

(Tenga en cuenta que esta es mi idea para una fórmula)

Primero, para una fórmula de ataque simple, solo necesitarás algunas estadísticas. La estadística de Ataque del jugador (esto podría ser Fuerza o Magia, dependiendo del tipo de movimiento).

Luego, cree una variable, llamada MovePower. Esto dependerá del movimiento, y mejores movimientos tendrían un mejor MovePower. Para mi fórmula, los comandos generales de "Ataque" tienen un MovePower de 5.

Luego, convierta la defensa en una estadística basada en porcentajes (y, por supuesto, haga que sea imposible alcanzar el 100% de defensa contra el daño)

Luego, durante la fase de ataque, ¡simplemente multiplique la estadística de ataque por el poder de movimiento y elimine el daño según la defensa de los enemigos! ¡sencillo!

También puede optar por tener otros modificadores, como si el movimiento golpeará (Precisión), si el movimiento tiene otro efecto adicional (Bio, infligir veneno,) y optar por que golpee, (Precisión nuevamente) tenga daño para mejorar / degradar movimientos que cambian las estadísticas, etc. ¡Diviértete con eso!

AzelfDestin
fuente
Otra opción que evita la armadura como un problema de percentil (permitiendo así que sus valores se vean iguales) es calcular el daño contra la armadura como una comparación que se convierte en un multiplicador. Algo como Ln (atk / def) como base. Esto permite que las estadísticas de armadura defensiva se escalen a medida que pasa el tiempo de la misma manera. Descubre cómo obtener tu rango de daño básico deseado para cuando las estadísticas de daño y armadura son las mismas y extrapola desde allí. Esto hace que los ataques de "evitación de armadura" requieran un truco para crear, pero eso es parte de para qué sirve la creatividad.
Aviose
1

En esencia, necesitas descubrir dos cosas.

  1. Cómo preformar correctamente la computación con grandes números.
  2. Cómo quieres y esperas que el daño de ataque se comporte contra oponentes cada vez más débiles.

1

Puede usar doubleun usuario o una gran biblioteca de números. Hacer cálculos con números grandes (como en los juegos de clic / inactivo a menudo se basa en bibliotecas de números tan grandes). En su caso, los números son relativamente pequeños, por lo que el uso de punto flotante de 64 bits permitirá la flexibilidad necesaria.

2

¿Cómo quieres que se comporte el juego? algunos ejemplos:

  • Un enfoque es usar ATKpara decidir si golpeas o no y lanzas un dado con un índice de daño conocido dependiendo del arma: por ejemplo, espada larga 1d8, espada de dos manos 1d10, daga 1d4. Esto no escalará increíblemente bien si el HP puede crecer una y otra vez. Si usas ATKpara determinar si los personajes golpean o fallan, puedes hacer otro lanzamiento después de un golpe exitoso con ATK* 80% para determinar los crits.
  • Si quieres usar una fórmula de daño, la fórmula de daño puede ser tan simple (ATK - DEF) +/- 20%como se hace en World's End (un juego de estrategia RPG). Esto significará que los ataques contra un oponente con fuerza DEFno podrían causar ningún daño. Para instace ATK = 10, ENEMY DEF = 12, (ATK - DEF) = -2y también significa que el ataque de alta definición vs ligeramente inferior, no podía hacer mucho daño, ya que podría hacer batallas con el aumento de HP. Por ejemplo ATK = 1010, con , ENEMY DEF = 1005el daño sería 5. El daño también aumentará dramáticamente ahora si ATKse incrementa en un pequeño porcentaje. Por ejemplo ATK = 1055, hará un 900% más de daño con solo un aumento del 5% en el ATKvalor.
  • Para evitar esto, puedes hacer algo como ATK / DEF * WEAPON_DAMAGEEsto se escalará más gradualmente cuando aumente ATKo DEFmás y permita que un atacante débil dañe a una criatura con fuerza DEF.

tl; dr Debes tratar tus números de manera responsable y descubrir cómo quieres que se comporte el juego en diferentes situaciones. Algunas preguntas para hacerte a ti mismo:

  1. ¿Cuántos ataques (turnos), debería tomar para derrotar a ese jefe / minion?
  2. ¿Cómo deberían las diferentes habilidades, beneficios y desventajas afectar la xbatalla? ¿Debería ser inútil, ganar debería ser y%menos / más probable?
Wolfdawn
fuente