noviembre 01, 2006

La IA en la Nueva Generacion de juegos

He leido últimamente en bastantes ocasiones () el concepto de “Next Gen A.I.”… y he pensado en comentarlo en un articulo, pero sin demasiada profundidad, sin demasiados tecnicismos y dando una visión general de qué es la I.A en los juegos y por qué se supone que la próxima I.A. será mucho mejor que la presente.
La IA en un juego es fundamental para que la inmersión sea lo más real posible…. Todos hemos visto como de simple era matar a los monstruos en Doom y como se ha llegado hasta comportamientos más complejos como F.E.A.R por poner un ejemplo… o como hemos llegado a situaciones totalmente inesperadas con la IA de Oblivion… cómo hemos llegado hasta aquí, y qué nos espera en el futuro es de lo que va este artículo.

La IA en los juegos:
Lo primero que habría que comentar sobre la IA y que siempre te dicen en la Universidad o en cualquier curso de IA medianamente profundo, es que eso de Inteligencia Artificial es un nombre demasiado pretencioso ;), en general la Inteligencia que vemos en los juegos está muy lejos de ser ni siquiera parecida a la Inteligencia humana, creativa o inesperada y por lo tanto ya de entrada el nombre es muy engañoso.

La inteligencia en los juegos va a ser tan fundamental, que a mi parecer va a estar, en poco tiempo, a la altura de los gráficos y el sonido.

Una de las razones que los jugadores dan para los juegos online es que jugando con personas tenemos enemigos que son “muy listos” o “muy buenos” y eso le da un grado de realismo al juego que no tiene cuando es Offline. Seguramente muchos de vosotros hayais probado el Battlefield 2, o el Battlefield 2142 tanto en modo Offline como en modo Online, y aunque la inteligencia es buena en Offline, no tiene nada que ver cuando se juega Online (dependiendo de lo manta que sea el otro, claro ;)). Y aunque normalmente los juegos suelen tener un grado de dificultad, este grado no suele variar la IA o su comportamiento (a veces sí, por ejemplo en los RTS), sino la cantidad de enemigos o el grado de “accuracy” (puntería) que tienen.

Entonces qué es lo que tiene la nueva generación para que la IA sea distinta?.

Como todas las tecnologías, la IA avanza, pero la verdad es que no avanza todo lo rápido que se quisiera y, desde luego, que el avance en la IA no es la razón fundamental para que sea un elemento importante (o de igual importancia a los gráficos, por ejemplo) en la nueva generación. Dejando de lado el marketing que conlleva introducir un nuevo elemento a tener en cuenta, y que ese elemento tenga un efecto tan grande en la inmersión, la verdad es que ahora mismo el hardware nos permite muchas cosas que antes ni siquiera se planteaban.

Tener varios hilos de ejecución va a tener un efecto tan grande en todos los aspectos del juego que, en cuanto pase un tiempo y los desarrolladores tengan la destreza suficiente para aprovechar toda esa potencia, vamos a ver cosas muy nuevas y realmente interesantes.

Me gustaría comentar alguna de las técnicas de IA que se usan en los vídeo juegos y analizar, por que ahora esas técnicas van a tener un mayor impacto en el resultado final.

Antes de nada comentar, que como en todo, hay muchas técnicas y que cada una de ellas puede ser muy buena para determinados casos, pero no demasiado buenas para otros. Además, no se trata de hacer un estudio de las técnicas, ni mucho menos!, sino nombrar que algoritmos se usan en cada caso y relacionarlos con experiencias que hayamos visto en los juegos que hayamos probado.

Para distintos tipos de juegos hay distintos algoritmos a tener en cuenta, por ejemplo no tiene nada que ver (o poco que ver) la IA de un juego RPG como Oblivion, con uno RTS, o un FPS. Yo me voy a centrar en esos tres tipos de juegos en este artículo, para no extenderme demasiado.

En un juego FPS tipo F.E.A.R, o Ghost Recon o BattleField hay que tener en cuenta antes de nada que lo que se desea es un BOT que sea bueno, que no haga movimientos “tontos” y que su puntería sea natural (el ordenador puede ser tan bueno como quiera!), además sabemos que los niveles son “cerrados” y en ocasiones no demasiado grandes, sabemos también por donde tiene que pasar el jugador en cada momento para ir hacia el objetivo, por que puntos tendrá que pasar obligatoriamente y qué opciones tiene. Todo eso lo sabemos por que tenemos un mapa (un nivel), finito, manejable y cerrado.

En el caso de F.E.A.R o Ghost Recon es muy claro que los enemigos aparecen una vez que rebasamos ciertos puntos específicos en los niveles (esquinas, pasillos, calles… etc). A estos puntos se le llama Trigger y están programados de antemano por el diseñador de niveles para que cuando el jugador pase por ahí ocurran ciertas cosas o aparezcan los enemigos. Una vez pasado el punto los enemigos “ven” y “oyen” al jugador usando determinadas técnicas, el sonido es un objeto (tal como se lee, un objeto ;) del juego) que sale de un punto concreto y llega a otro. Si un sonido generado por el jugador llega hasta el enemigo, ese sonido (que se sabe de donde partió) tendrá determinadas características de dirección, volumen y degradación (dependiendo de la distancia de partida), esto se usa, por ejemplo, en el Splinter Cell o en el Oblivion, en donde si vamos en modo silencioso no nos escucharan con la misma facilidad que si vamos de pie o corriendo. Además esta característica es muy importante en el desarrollo del juego.

Pues bien, tanto la vista como el oído, como el tacto (si le dan un tiro, lo siente y sabe de donde viene) son dos elementos fundamentales para los juegos del tipo FPS.

Como hemos dicho, una vez pasado el Trigger los enemigos salen y si nos ven o nos oyen o nos sienten, tendrán que calcular varias cosas (como mínimo), a saber, donde están ellos, donde está el jugador objetivo, y como llegar hasta el de la forma “más segura” o “más rápida”. Para el cálculo de rutas, se usa el Algoritmo A*.

En este conocidísimo algoritmo se tienen en cuenta factores como los objetos que hay que sortear, el inicio, la meta y el coste que tiene llegar por cada uno de los caminos calculados. Podríamos decir que calculamos un camino (sea del coste que sea) y lo vamos refinando según iteraciones (no es exactamente así, pero podemos darlo por bueno para esta explicaciónJ) hasta encontrar el mejor. Esto quiere decir que con A* podemos encontrar un camino “no óptimo” hasta la meta y después pulirlo hasta que nos guste el coste o simplemente no tengamos mas tiempo de calculo. Aunque una ejecución completa de A* nos garantiza el óptimo, podríamos encontrar un camino "no optimo" hasta la meta de forma muy rápida usando A* y quedándonos con una solución parcial del mismo.

En A* usamos un heuristico (o regla por la cual mejoramos la solución actual) que nos llevará de un punto a otro por el camino más corto, o que más ganancia nos represente (dependiende del heuristico lo que queramos maximizar o minimizar).

Además del uso de A*, el diseñador del nivel predefine determinadas opciones o caminos pre-determinados (waypoints o Pathnodes, estos conceptos se usan también para la definición de caminos de patrulla, por ejemplo) para llegar de un punto a otro de forma más inteligente (no siempre el camino más corto es el más inteligente) y darle cierta prioridad, peso o de forma probabilística (al azar) a cada uno de esos caminos posibles. Todo eso combinado con A* nos debería dar un camino hasta la meta bastante bueno en terminos de realismo y en los que se maximiza la ganancia, ya sea esa ganancia preservar al NPC o hacer que llegue lo antes posible hasta su meta, además el objetivo también puede variar según el estado actual del juego, como por ejemplo el número de tropas que nos quedan, como está de cerca del final del nivel (en ese caso será más cauteloso!), etc…

En la imagen, un ejemplo de WayPoints en el diseño de un nivel.

También tenemos los juegos de estrategia en tiempo real (RTS). En ellos no se tienen que tener en cuenta todos esos factores, además el juego tiene más tiempo para hacer bien las cosas (en comparación con los FPS) y no suele usarse los waypoint o pathnodes como en los FPS, pues cada partida es completamente distinta y carecería de sentido. Se suele usar A* (que es el rey de los algoritmos para PathFinding) con heurísticos mucho más complejos que en el caso de los FPS, pues se tienen en cuenta muchas más variables.

En los juegos de estrategia en tiempo real, se nota enseguida si los programadores han hecho un buen trabajo o no. Se deben tener en cuenta muchos factores, tantos como variables tenga el juego, eso es diplomacia, dinero, tropas, tipo de tropas, contexto (otros jugadores), posibles ataques, mejora de tropas, mejora de edificios… y muchísimas cosas más. Está claro que predefinir una táctica sería absurdo en este tipo de juegos, por que cada partida es totalmente distinta de otras.

Para los juegos de estrategia en tiempo real, se suelen definir tendencias en los jugadores controlados por el ordenador, son Agentes con una personalidad, es decir, algunos son más pacíficos, otros optan por la defensa, otros por el ataque… etc. En general, esa es la aproximación más “sencilla” desde el punto de vista del programador, que puede predefinir estrategias genéricas de comportamiento encaminadas a un mismo objetivo (planning), por ejemplo, generar muchas tropas, o muchas defensas, o muchos recursos… etc.

Lo que suele ocurrir es que los jugadores controlados por el ordenador pasan de un estado a otro de forma “cíclica” (esto es raro, pero podría ser) o disparada por eventos externos (dependiendo de cómo vaya la partida). Es posible entonces, ver como un jugador pasa los primeros minutos de la partida centrado en los recursos, para pasado un tiempo o dadas ciertas condiciones, pasar a “estilo constructor” y empezar a crear tropas, en vez de generar recursos… etc, lo realmente difícil aquí es hacer una estrategia multiobjetivo.

Los algoritmos de los juegos de estrategia en tiempo real, son tan variados como distintos son los juegos en sí. Pues se han de tener en cuenta distintos factores según el juego, lo normal es que los scripts y estrategias sean muy distintos, no pasa como en los FPS, en donde las técnicas están más “estandarizadas” (podéis buscar Planning, Agents o AI RTS para más datos, os adelanto que este campo es complejo)

Y pasamos al que a mi parecer, son los más difíciles de todos, por tener un número totalmente incontrolable de casos posibles… me refiero a los juegos RPG tipo Oblivion. Es tan difícil hacer un mundo totalmente abierto, en donde cada uno de los NPC (Non-Player Character) tiene una “vida” y además tantas posibilidades de interactuar con los demás NPCs que es abrumadora la sola idea de querer hacerlo medianamente bien. En el caso de Bethesda lo han hecho tan bien, que parece mentira.

Para darle una vida a cada uno de los NPC se tiene que dedicar un tiempo de desarrollo a cada uno de los NPC. Cada NPC tendrá un tipo de personalidad, en el sentido de que estará mas dispuesto a atacar a otro NPC o defender su “propiedad”, además tiene que tener definidas las habilidades especificas de ese NPC, puede ver mejor?, oir mejor?, de que raza es?, tiene mas o menos fuerza?. Todos esos factores se tienen en cuenta para definir un NPC y su inteligencia.

Si os habéis fijado bien en el Oblivion, os daréis cuenta de que cada NPC cena, come, habla, se levanta a unas horas específicas, que tienen conversaciones entre ellos (aunque algunas absurdas y realmente graciosas) y que esas horas no son iguales para todos necesariamente (cada uno tiene su vida).

Para definir toda esa ingente cantidad de parámetros Bethesda ha creado herramientas específicas de definición de personajes y se les ha dado un Path (camino de recorrido) concreto por el que puede (o debe) andar… por ejemplo el dueño de una tienda ira de la tienda a su casa y de ahí a la tienda a determinadas horas, la gente con misiones concretas te las puedes encontrar en distintos sitios del mundo y hay ciertos NPCs que están en los bosques. Lo que es muy difícil es que nos encontremos un NPC con total libertad (creo que ninguno).

De nuevo cada NPC tendrá que calcular Paths hasta objetivos y sus estrategias en el combate variarán según el estado en el que se encuentre, según el estado del enemigo y según la posición relativa de cada uno. Además las armas para algunos NPCs van mas allá de armas como espadas, o hachas, sino también habilidades que bien combinadas pueden hacer mucho daño (combos), todas esas combinaciones pueden estar pre-determinadas, aunque en el caso concreto del Oblivion lo desconozco (es de suponer que sí).

Bien, habiendo hecho este breve repaso por algunas de las técnicas de IA para los juegos, la pregunta que nos podemos hacer es, que nos ofrecerán las nuevas consolas y los nuevos procesadores para hacer más “inteligentes” los juegos… está claro que las técnicas no van a cambiar demasiado, pero lo que si que va a cambiar es el tiempo que se le dedica al cálculo de cada una de las soluciones buscadas, ahora el NPC tendrá mucho mas tiempo para calcular el mejor camino con lo que los heuristicos serán mucho mas complejos y tendrán más variables en cuenta, por lo que nos los encontraremos (a los NPCs) buscándonos la espalda, o generando plannings mucho más complejos en los RTS. Todas esas mejoras y mucho más, será lo que nos encontraremos en la nueva generación de vídeo juegos, mejorando de forma brutal la inmersión en los mismos.

Update:
Windup hace un comentario a este artículo y por el cual hago una correción al uso y la forma de funcionar de A*. Ciertamente en la versión primera de este artículo cometo un error al comentar que la solución dada por A* puede ser parcial, cuando no es cierto, pues con A* siempre tendremos una solución unica (no parcial) y además óptima. Desde aquí pido disculpas si al leer el artículo se ha llevado a error y doy las gracias a los lectores como Windup por tenerme en guardia ante las meteduras de pata.

Algunas direcciones de interés:
http://www.computing.dcu.ie/~bgorman/
http://www.aiwisdom.com/bygenre_rts.html
http://www.technomagi.com/josh/gdc2003/ai_strategy_fri.html
http://www.peachpit.com/articles/article.asp?p=102090&seqNum=2&rl=1