Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

Un jugador, un juego, distintas partidas y distintas experiencias

A principios de año tuve la ocasión de comprarme y jugar el Dead Space 2. El primero me sorprendió bastante en su día, aún formando parte de un género algo trillado (una mezcla entre survival horror y shooter en tercera persona), sobre todo por su elevadísima factura a nivel de producción y ambientación, especialmente en el apartado sonoro, sin olvidar otros como los diseños mecánicos e industriales (armas, armaduras, equipamiento, maquinaria...), o los diseños de criaturas y entornos. Como resumen, la segunda parte acabó siendo básicamente una ampliación de contenido y prolongación de la historia con respecto al primero, lo cual sirve con creces para hacer de él un muy buen juego.

De lo que quería hablar en esta ocasión  es de un pequeño fenómeno del que me dí cuenta a la hora de hacer una segunda pasada por el juego (achievement bitch, ya se sabe). Debido a su elaborada atmósfera, en ambas entregas de Dead Space (y en muchos otros survival horror) la primera partida proporciona una experiencia de juego totalmente distinta de la segunda.

En la primera pasada el jugador no conoce los escenarios, los enemigos, las situaciones ni las armas; cada pasillo es nuevo y presenta nuevos retos y horrores detrás de cada esquina, y cada situación de combate se vive con tensión. Básicamente lo que se espera de un juego de acción, aventura y terror.

En la segunda pasada, el jugador ha visto ya todos los escenarios, conoce a los enemigos, recuerda las situaciones de combate una por una, y sabe qué arma elegir en cada momento concreto para evitarse quebraderos de cabeza. En la segunda pasada, los sustos apenas impactan al jugador, y su experiencia en el juego hace que sea capaz de ir de principio a fin en un 60% o 70% del tiempo que empleó en el primer recorrido. En esta pasada, el juego se convierte en un festival de casquería donde es dificil generar algo de tensión aparte de la del combate.

El hecho de que esto me haya llamado la atención se debe a que, pensándolo bien, he visto pocos juegos que tengan mecanismos para asegurar que el jugador va a tener experiencias de juego nuevas entre distintas partidas, más cuando utilizan elementos que pierden valor una vez se conocen (los tipos de enemigos, giros de guión en la trama, sustos en momentos concretos...). Es cierto que en todos los juegos dos partidas distintas siempre dan lugar a pequeñas variaciones (excepto quizá en un juego de puzzles o parecidos, donde no hay aleatoriedad posible), pero me refiero a algo distinto a usar combates aleatorios, o a que los enemigos se comporten de manera distinta en dos pasadas de una misma situación de combate.

La solución a esto a mi parecer pasa por diseñar un sistema in-game que permita aplicar determinada variación a cada una de las partidas, para que, si bien contando con los mismos elementos, supongan experiencias de juego genuínas entre sí. El único juego que se me viene a la cabeza ahora mismo que hace tal cosa (de manera anunciada como feature al menos) son las dos entregas de Left 4 Dead. Se implementó para el mismo una inteligencia artificial llamada El Director que, utilizando como base cada uno de los escenarios y el estado de los jugadores en cada momento, coloca las armas, objetos y hordas de enemigos en distintas localizaciones para mantener un nivel determinado de estrés y dificultad en la partida.

Para un caso como el Dead Space, el asunto se vuelve un poco más complicado. Mientras que los Left 4 Dead consisten en distintos niveles sin apenas narración o historia global, los Dead Space si tienen una historia con momentos de gran tensión, giros de guión y una narrativa bastante más elaborada y rígida. Debido a todo esto, parece complicado obtener una experiencia de juego rejugable manteniendo aquellos elementos que pierden valor una vez se conocen.

En cualquier caso, se me ocurre que es posible aunar un poco estos dos extremos, para intentar generar una experiencia de juego relativamente nueva en cada partida, manteniendo fijos determinados elementos por restricciones de guión. Por regla general, en un juego como Dead Space, el contenido jugable se genera para que sea presentado al jugador en su totalidad, y de manera lineal. Cada área es un pasillo que conecta con la siguiente, y los encuentros y elementos de cada área estan fijados por el equipo de diseño. Al hacerse así se facilita la integración con aquellas secciones de juego que están orientadas más a la historia o parecidas, evitando inconsistencias. El enfoque para evitar esto sería el siguiente:
  • Dejar fijas aquellas zonas de juego importantes para el guión y el avance de la historia. Lo importante en estos casos es intentar limpiar los comienzos y finales para que hagan la menor referencia posible a las zonas de gameplay puro que pueda haber entre ellas.
  • Generar el contenido de gameplay no de manera lineal, si no creando distintas situaciones de juego en cada una de las zona que vaya recorriendo el jugador. Es decir, si tenemos que atravesar tres corredores, generar contenido para los tres (con sus enemigos, objetos, sustos prefijados...) aunque en una sola partida el jugador vaya a ver sólamente una de estas situaciones.
Con un contenido generado de esta manera, establecer un Director, al igual que en Left 4 Dead, que se encargue de seleccionar que contenido se va a mostrar al jugador en cada una de las partidas dependiendo de distintos factores (la idea es un tanto general, no he pensado realmente en detalles). De esta manera, si tuviesemos un juego con un comienzo, un final, y cinco zonas jugables en medio, se podría configurar al Director para que mostrase el comienzo y el final en todas las partidas, pero luego seleccionase sólo tres zonas en las que llevar a cabo una situación de combate (pudiendo haber incluso varias a elegir en una misma zona). Esto hace que en distintas partidas, el jugador tendría que analizar nuevas situaciones de combate, teniendo que estar siempre preparado para lo que pueda ocurrir, ya que no puede saber con certeza donde va a aparecer el siguiente enemigo, o el siguiente susto.

Por supuesto, el problema con este enfoque es que debido a la combinatoria de situaciones, es más que probable que este enfoque resulte más dificil de producir y de depurar y probar, más si tenemos en cuenta la factura que gastan juegos como este. Y eso sin olvidarnos que en el caso de Dead Space y en otros, los desarrolladores posiblemente fueron conscientes de este problema, y decidieron seguir con un enfoque más tradicional para que el jugador disfrutase de un survival horror en la primera partida, y de un juego más arcade en las subsiguientes pasadas.

Moraleja: Aunque generar experiencias de juego divergentes y distintas entre partida y partida puede ser un señor dolor, en ocasiones puede merecer la pena explorar estas posibilidades, viendo el gran potencial que se puede extraer de una idea tan sencilla a priori.

Inteligencia Artificial (O el arte de engañar)

En el aspecto más teórico, la inteligencia artificial siempre ha sido un tema escabroso. De hecho todavía hay debate sobre que entendémos por inteligencia; a día de hoy existen programas que juegan al ajedrez mejor que cualquier humano, capaces de mantener conversaciones relativamente coherentes con personas o capaces de recomendar libros y discos con mucho acierto en función de historiales de compra, pero aún estamos a mucha distancia de conseguir algo que se asemeje a la inteligencia humana en toda su complejidad.

No obstante es un área con bastante desarrollo, y que tiene en su haber un montón de tipos de técnicas para tratar un montón de tipos de problemas distintos: algorítmos de búsqueda de caminos, redes neuronales, sistemas expertos, árboles de decisión, planificadores de tareas, sistemas de backtracking...

En el caso concreto de los videojuegos sin embargo, es necesario tomar un enfoque radicalmente más práctico. En este caso lo que se busca es proveer de una buena experiencia de juego, y la inteligencia artificial debe estar al servicio de la misma como cualquier otro componente. Esto significa que en muchas ocasiones, lo que realmente importa no es que la inteligencia artificial del juego (ya sea como contrincantes, compañeros, sistemas que ajusten parametros del juego...) sea realmente inteligente, si no que sirva adecuadamente a completar la experiencia de juego tal y como queremos. Esto es algo que en ocasiones se suele perder de vista en la vorágine tecnológica que supone implementar un sistema de inteligencia artificial relativamente complejo, y que puede llegar a ser peligroso al añadir complejidad necesaria a un sistema que ya lo es de por sí.

A modo de ilustración, hay tres anécdotas que tengo siempre muy presentes, dos de ellas sobre el Half-Life, y una sobre el Half-Life 2. No he podido encontrar los artículos que corroboren de buena mano los chascarrillos que voy a comentar (aunque en la última hay un vídeo que ilustra un poco el concepto), pero en cualquiera de los casos sirven perfectamente como parábolas para lo que intento destacar:
  •  En el primer Half-Life, los soldados tenían un supervisor para cada escuadrón, para poder llevar a cabo acciones coordinadas. Para evitar frustración en el jugador sin embargo, se dió a cada escuadrón dos slots de disparo, de forma que en todo momento solo dos soldados podían estar disparando a la vez al protagonista. Esto visto en el juego al principio resultaba algo extraño, ya que los soldados tomaban posiciones, e iban saliendo de dos en dos para disparar, quedando claro que realmente se estaban turnando.
    Para paliar esto, se tomó la decisión de añadir algunas acciones complementarias en los soldados. Cuando un soldado no dispara, intenta avanzar su posición y flanquear al objetivo, y cuando un soldado termina su cargador, reproduce un audio pidiendo cobertura y recarga.
    Estas reglas tan sencillas dan lugar a un comportamiento emergente francamente espectacular. Mientras que dos soldados disparan al jugador, el resto de la escuadra va tomando posiciones intentando flanquear al enemigo, y cuando estos terminan de disparar, piden a sus compañeros (ya posicionados) que disparen, mientras ellos recargan munición y avanzan a su vez. Un caso en el que un sistema relativamente simple da lugar a resultados que dan una impresión de inteligencia y coordinación muy altos.
  • En el caso de los soldados del Half-Life, también, se implementó un sistema para huir de las granadas que lanzaba el protagonista. Cada vez que una granada cae cerca de algún soldado, estos intentan buscar una ruta para alejarse de ella y ponerse a cubierto. Llegado un momento, vieron casos en los que algunos soldados se atascaban al intentar todos utilizar la misma ruta de escape. A uno se le podrían ocurrir cientos de soluciones (a cada cual más compleja) para atajar este problema, pero el equipo de Valve optó por una salida mucho más rápida. Si una granada cae, y algún soldado no puede encontrar una ruta de escape (por ir a colisionar con la ruta de escape de otro), se tira al suelo en una animación de cubrirse y espera a que la granada detone.
    Tan sencillo como eso. Una vez más, el resultado en la experiencia de juego es inmejorable: todo soldado acorralado por una granada hace lo más inteligente que cabría esperar, ponerse a cubierto y rezar para que la explosión de la granada no lo mate.
  • La última curiosidad viene del Half-Life 2. Una regla de oro en muchos casos en los shooters es evitar disparar al jugador si este no sabe que hay un peligro. En muchos casos, la solución mas rápida es hacer que ningún enemigo pueda disparar al jugador si el jugador no ha visto antes al enemigo. Esto es algo que es casi imposible de notar jugando al juego, pero que nos evita recibir disparos de enemigos que no hemos visto en la estancia. En el caso del Half-Life 2 no tengo claro si este sistema está implementado tal cual, pero viendo el siguiente vídeo seguro que tiene alguna variante del mismo.


Lo que pretendo sacar a relucir es que en un juego no importa la inteligencia genuína, lo que nos interesa es una falsa inteligencia lo suficientemente convincente como para reforzar la experiencia de juego y engañar al jugador.

Moraleja: La inteligencia artificial debe estar al servicio de la experiencia de juego, nunca al servicio de la tecnología por la tecnología o de la fidelidad. Es importante diseñarla e implementarla en función del papel que debe de cumplir, sabiendo siempre qué se necesita de la misma, por qué, y cuál es la manera más eficiente de conseguirlo.