Modulo de Inteligencia Artificial
Lo que nos interesa aqui es un conjunto de rutinas que controlen a los NPCs (o personajes pseudo inteligentes, o personajes que no son controlados por el jugador). Estas rutinas deben manejar la búsqueda de caminos (pathfinding) de manera que el NPC se mueva de una forma normal de un punto A a un punto B, y, además de eso, y quizás hasta más importante, controlar la conducta general del NPC.
La conduca del NPC incluye cosas tan obvias como qué debe hacer el personaje cuando no está haciendo nada (moverse de un lado a otro, por ejemplo) o qué debe hacer cuándo es atacado. Los NPC en muchos juegos reaccionan siempre igual: devolviendo el ataque en forma inmediata. ¿Pero eso es lo normal? No necesariamente. De hecho, cuando una persona es atacada por sorpresa no sale corriendo a devolver el ataque, lo más razonable es tratar de buscar refugio para determinar la naturaleza del ataque. Pero, hay situaciones en que hay una tercera posibilidad, tratar de atacar para luego determinar que es mejor buscar refugio. ¿Qué debe hacer el NPC? ¿Cuál de las tres posibilidades? Debe escoger. Bien el módulo de inteligencia artificial debe manejar estas situaciones.
En internet hay multitud de discusiones sobre el tema, y no es el objetivo discutir aqui sus intrilinguis, pero sí quiero mencionar la dirección que mi MMORPG tomó y la implementación que hice. Se trata de un concepto más bien viejo, y que ha sido utilizado en diversos tipos de juegos. Los árboles de decisión. Este artículo de gamasutra explica con suficiente claridad el tema, y también esta discusión de los árboles de decisión en el juego Spore. Los árboles de decisión permiten organizar y darle jerarquía a los aspectos que el NPC debe considerar antes de adoptar una conducta. En el ejemplo citado, el NPC debe evaluar el tipo de ataque que esta recibiendo, la fuerza del ataque, y si es posible y hay disponible información al respecto la experiencia que tiene el NPC sobre el atacante. Por ejemplo, la primera vez que fue atacado por este jugador la respuesta fue atacar frontalmente, pero el combate se volvió peligroso por lo que decidió huir, logrando escapar. Si el jugador comienza a perseguirlo y lo encuentra iniciando un nuevo ataque ¿es lógico que el NPC vuelva a iniciar un ataque frontal? Lo razonable es huir nuevamente y buscar apoyo de inmediato.
Otro ejemplo del tipo de respuestas interesantes que un NPC puede tener es buscar refugio temporal en el momento que inicia un ataque. Cuando estamos atacando y nuestro enemigo nos está disparando, lo normal es acercarse rápidamente si pensamos que podemos vencer, pero esquivando el ataque, y si es posible, cubriéndonos con un árbol, una roca, o lo que haya disponible. Este tipo de conductas hacen más inteligentes al NPC y por ende, más interesantes.
Hay otras posibles soluciones para programar la conducta de los npcs. En internet se pueden encontrar fácilmente, pero las redes neurales es la más prometedora de todas. En algún momento estuve estudiando un híbrido entre árboles de decisión y redes neurales pero resulta muy extenso de implementar. Quizás lo incluya para una versión posterior. Lo que he pensado al respecto es que al final de cada rama del árbol de decisión exista una red neural que produzca la reacción o respuesta final. Es como una red neural preconducida. De hecho uno de los problemas de las redes neurales es que suelen producir algunos resultados incoherentes. Un árbol de decisión al comienzo (¿o al final?) resuelve el problema en un porcentaje aceptable.
Este post forma parte de una serie sobre los componentes de un MMO. Estoy poniendo como ejemplo Nunsoot, mi MMO. Más detalles aqui y aqui.