Atributos para calcular un golpe en un juego por turnos o Roguelikes

22

Estoy tratando de encontrar una buena fórmula para determinar un golpe cuando el jugador ataca a un enemigo en un Roguelike. Me gustaría presentar algo simplista pero, fiel a la forma en que se hace en D&D o Roguelikes populares como AngBand o NetHack.

Lo que tengo hasta ahora es agregar las diferencias entre los atributos del jugador y del enemigo, junto con un entero aleatorio:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

Esto hace que el juego no sea natural: el jugador nunca pierde enemigos débiles y viceversa para los fuertes. ¿Alguien sabe de una guía para el combate basado en atributos utilizado en juegos basados ​​en turnos, etc.? ¿Debo (y puedo) copiar las reglas de D&D al pie de la letra?

jdeseno
fuente

Respuestas:

18

Me imagino cuáles son las posibilidades de "golpe garantizado" y "señorita garantizada" (es decir, las posibilidades de que un gatito golpee a un dragón y un dragón pierda a un gatito). Almacene su resultado aleatorio, y antes de aplicar diferencias de poder, marque un golpe si está dentro de esos límites. Eso evitará el problema del 100% de probabilidad de acierto / error ... aunque hay otra opción para proporcionar siempre la posibilidad de un golpe, que se detalla a continuación.

D&D es un sistema "plano", donde la probabilidad se distribuye uniformemente entre los posibles resultados de la tirada. Otros sistemas usan una distribución más curva, que generalmente se logra tirando varios dados y agregándolos. Es bastante fácil crear una curva como esta (me viene a la mente rand () + rand ()) / 2).

Otra posibilidad es "explotar dados". En sistemas como Shadowrun y Savage Worlds, tirar el máximo resultado posible del dado te permite volver a tirar ese dado y agregar el nuevo resultado. En su juego, probaría para ver si su resultado aleatorio estaba por encima de un cierto umbral y, de ser así, volvería a tirar. Si dejas que los dados exploten indefinidamente, incluso el duende más humilde tiene la oportunidad de golpear a un dios, y no necesitas una mecánica explícita de "golpe garantizado".

Por lo tanto, un enfoque posible con un lanzamiento curvo, la posibilidad garantizada de fallar y la explosión de dados sería algo como:

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

Por supuesto, eso no ha sido probado ni equilibrado; querrás ajustar todos esos números mágicos hasta que se sientan bien.

En cuanto a copiar las reglas textualmente, hay problemas legales y éticos con eso. Sin embargo, estás bien inspirándote en D&D y otros juegos de mesa; así es como todos fueron diseñados en primer lugar. Tampoco es necesario que le muestres al jugador exactamente cómo funcionan las reglas, y puedes encontrar que usar una curva de dados de punto flotante suave te da una mejor sensación que restringirte a las restricciones enteras de los dados físicos.

Gregory Avery-Weir
fuente
3
¿Qué idioma es ese, con el tipo divertido decls? ¿O es solo pseudocódigo?
Tenpn
2
Creo que puede ser Actionscript o Javascript, pero no me limite a eso.
El pato comunista
Es Actionscript 3. Soy un desarrollador de Flash.
Gregory Avery-Weir
6

Supongo que esta es una pregunta de equilibrio del juego y no una pregunta de codificación, y hay muchas maneras de manejar esto. Desde su algoritmo existente, sospecho que lo está haciendo más complicado de lo que tiene que ser (tres atributos Y un número aleatorio crean un sistema extremadamente turbio desde la perspectiva del jugador). ¡Mi primer instinto es simplificar!

Favorezca los atributos que hacen múltiples cosas, en lugar de los resultados que están determinados por múltiples atributos. DEX funciona bien como el determinante principal de la probabilidad de golpear; La adición de todo lo demás solo sirve para dificultar el equilibrio. Piénselo de esta manera: el daño esperado de un jugador en cada golpe es su% de golpe multiplicado por su daño promedio cuando golpea. ¿Cómo planea calcular un% de golpe "esperado" o "típico" con tantas variables?

Veo otro problema, que es que su fórmula no escala, y esto es probablemente lo que está experimentando. Suponiendo que DEX, LUCK y SPEED tienden a aumentar en el transcurso del juego, las diferencias entre jugador y monstruo en esas estadísticas también tenderán a aumentar. Solo como ejemplo, si el DEX de inicio de juego de un jugador está en el rango de 4 a 6 y también lo son los monstruos, ese es un modificador de 10-20% para golpear. Si el rango es más como 10 a 20 en etapas posteriores del juego, eso es hasta un modificador de 100%.

Una forma de arreglar eso es mantener las estadísticas fijas. Los rangos de jugador y monstruo son los mismos en todo el juego, y obtener algo así como +1 DEX es algo enorme, extremadamente raro y tratado como tal (si es que existe). Entonces su fórmula funcionará bien para todo el juego, y verá un jugador con aproximadamente la misma probabilidad de golpear en todo momento.

Otra forma es cambiar ese "10" codificado para escalar con el nivel, por lo que tal vez sea "10 + nivel de monstruo" o "10 + nivel de mazmorra" o algo así, lo que provoca un ligero aumento en la dificultad a medida que el juego avanza a menos que el jugador suba de nivel sus estadísticas en consecuencia.

Una tercera forma, como han dicho otros, es establecer límites máximos en el% de golpe más alto y más bajo aceptable, y simplemente decir "si el valor calculado es menor que X, use X en su lugar".

En aras de la exhaustividad, señalaré que no hay una ley absoluta que DEBE incluir una tirada para golpear en primer lugar. Tomar una acción en un juego que no es efectivo no es particularmente divertido, y realmente no aumenta la experiencia, excepto en casos excepcionales. Una alternativa es dejar que los jugadores SIEMPRE golpeen, y simplemente meterse con el rango de daño para que a veces causen mucho menos daño que otros. Recuerde que los sistemas complejos son más divertidos para el diseñador que para el jugador.

Ian Schreiber
fuente
Esta es una respuesta genial.
seanicus
3

Es posible que desee agregar golpes críticos (generalmente no puede fallar, daño adicional) y fallas críticas (posibilidad plana de fallar sin importar qué, posiblemente aturde al jugador).

coderanger
fuente
0

Muchos juegos usan un cambio del cinco por ciento de un golpe independientemente de todos los factores además de la fórmula de golpe normal.

EddieC
fuente