Quiero construir un analizador genérico de reglas para los sistemas RPG de estilo lápiz y papel. Una regla puede involucrar usualmente de 1 a N entidades de 1 a N roles de un dado y calcular valores basados en múltiples atributos de una entidad.
Por ejemplo:
El jugador tiene STR 18, su arma actualmente equipada le da una bonificación de +1 STR pero un malus de DEX -1. Ataca a una entidad monstruosa y la lógica del juego ahora es necesaria para ejecutar un conjunto de reglas o acciones:
El jugador tira el dado, si obtiene por ejemplo 8 o más (¡el valor de ataque base que necesita pasar es uno de sus atributos base!) Su ataque es exitoso. El monstruo tira los dados para calcular si el ataque atraviesa su armadura. En caso afirmativo, el daño se toma si no, el ataque fue bloqueado.
Además, las reglas matemáticas simples también pueden tener restricciones como aplicar solo a una determinada clase de usuario (guerrero vs mago, por ejemplo) o cualquier otro atributo. Por lo tanto, esto no se limita solo a las operaciones matemáticas.
Si estás familiarizado con los sistemas RPG como Dungeon and Dragons, sabrás lo que estoy haciendo.
Mi problema ahora es que no tengo idea de cómo construir exactamente esto de la mejor manera posible. Quiero que las personas puedan establecer cualquier tipo de regla y luego simplemente realizar una acción como seleccionar un jugador y un monstruo y ejecutar una acción (conjunto de reglas como un ataque).
Estoy pidiendo menos ayuda con el lado de la base de datos, pero más acerca de cómo crear una estructura y un analizador para que mantenga mis reglas flexibles. El lenguaje de elección para esto es php por cierto.
Editar I:
Permítanme refinar mi objetivo: quiero crear una interfaz fácil de usar (que no requiera que alguien aprenda un lenguaje de programación) para construir reglas de juego más o menos complejas. La razón simple: uso personal para no tener que recordar todas las reglas todo el tiempo, simplemente no jugamos tan a menudo y es un obstáculo para buscarlas cada vez. Además: parece una tarea divertida para hacer y aprender algo. :)
Lo que he intentado hasta ahora: solo pensar en un concepto en lugar de perder el tiempo construyendo una arquitectura incorrecta. Hasta ahora tengo la idea de permitir que un usuario cree tantos atributos como quiera y luego asigne tantos atributos como quiera a cualquier tipo de entidad. Una entidad puede ser un jugador, un monstruo, un objeto, cualquier cosa. Ahora, al calcular algo, los datos se ponen a disposición del analizador de reglas para que el analizador de reglas pueda hacer cosas como si Player.base_attack + dice (1x6)> Monster.armor_check luego Monster.health - 1; La pregunta aquí es sobre cómo crear ese analizador.
Editar II:
Aquí hay un ejemplo de valor bastante básico, pero para calcularlo correctamente hay muchas cosas y variables diferentes a tener en cuenta:
Bono de ataque base (término) Su bono de ataque base (comúnmente conocido como BAB por la comunidad d20) es un bono de tirada de ataque derivado de la clase y el nivel del personaje. Las bonificaciones de ataque base aumentan a diferentes velocidades para diferentes clases de personajes. Un personaje gana un segundo ataque por ronda cuando su bonificación de ataque base alcanza +6, una tercera con una bonificación de ataque base de +11 o superior, y una cuarta con una bonificación de ataque base de +16 o superior. Las bonificaciones de ataque base obtenidas de diferentes clases, como por ejemplo para un personaje multiclase, se acumulan. La bonificación de ataque base de un personaje no otorga más ataques después de alcanzar +16, no puede ser inferior a +0 y no aumenta debido a los niveles de clase después de que el nivel de personaje alcanza el 20. Se requiere una bonificación de ataque base mínima para ciertas hazañas.
Puedes leerlo aquí http://www.dandwiki.com/wiki/Base_Attack_Bonus_(Term) incluyendo los enlaces a clases y hazañas que tienen nuevamente sus propias reglas para calcular los valores necesarios para el ataque base.
Comencé a pensar que mantenerlo tan genérico como sea posible también hará que sea bastante difícil hacer un buen analizador de reglas.
Func
s que inicializa el estado del programa basado en los argumentos como claves del diccionario. Sorprendido, nunca encontré esa publicación de Yegge antes, muy genial, gracias por señalarlo.