viernes, mayo 08, 2020

Lisp y Naughty Dog

Lisp es uno de los lenguajes de programación mas antiguos (el segundo de alto nivel, solo posterior a Fortran) y hoy en día, en diferentes dialectos o inspirando otros lenguajes, aun sigue bastante vivo. Sin embargo, a pesar de que una buena implementación es lo bastante compacta para ser un lenguaje de script para juegos, a poca  gente se le ocurriría usarlo como lenguaje principal en el mundo de los videojuegos. Si exceptuamos a Naughty Dog, claro.

Por que como Andy Gavin cuenta, empezaron usando su propia versión de Lisp en el cutre clon de Mortal Kombat llamado Way of the Warrior para implementar las maquinas de estado. La cosa continuo en su siguiente saga, Crash Bandicoot, creando una versión de Lisp llamada GOOL (Game Oriented Object Lisp), que usaron para scriptar el gameplay de los objetos del juego.

El código de GOOL esta basado en los estados de los objectos, que implementaban su jugabilidad con diferentes bloques de código. Permitía ejecutar trozos de código estilo corutina: el código marcado como ":code" se ejecuta hasta que encuentra una variante del comando "frame", que pasa el control al siguiente bloque. Por ejemplo, aquí repite una animación hasta que colisiona con algo
:code (defgcode (:label play animation)
  ; play the animation until this object is colliding with
  ; another, then change states
   (until (status colliding)
    (play frame group animation))
    (goto collided)))

Dentro de los estados también permitía código ejecutado cada frame, marcándolo con ":trans". Por ejemplo, aquí rota un objecto 10 grados cada frame hasta 180.
:trans (defgcode (:label turn 180)
  ; set the y rotation 10 degrees closer to 180 degrees
   (setf roty (degseek roty (deg 180) (deg 10))))
GOOL también contaba con un sistema de eventos tan sencillo de usar como este ejemplo para colisiones en la cabeza
(send event hit on the head (find the nearest object))
Vamos que si podías sobrevivir a usar LISP tenias a tu disposición un lenguaje de script muy potente para la época y la plataforma.

Y todo llego a un nivel mas con GOAL (Game Oriented Assembly Lisp) que se usó en la saga de Jak & Daxter. En este caso nada mas y nada menos que el 98% del código del juego estaba escrito en esta variante de Lisp. Esto les llevo a unos cuantos quebraderos de cabeza a la hora de encontrar programadores, ya que en el mundo de los videojuegos es relativamente fácil encontrar expertos en C++, pero es muy difícil reclutar a expertos en Lisp. No hay mucha información mas sobre GOAL, a parte de que esta implementado con Allegro CL y que, como su nombre indica, se compila directamente en assembler para la PS2.

Y vaya, parece que ND estaba muy augusto con su engine hasta que la unión con Sony les obligo a programar en C++, para que pudieran compartir código con otros equipos dentro de la compañía japonesa. Eso si, aunque ya no sea su lenguaje principal, se sigue usando como lenguaje de script, como demuestra esta presentación sobre Uncharted 2 en la que se ve que aun siguen usando una nueva versión de Lisp para scriptar partes del juego.

domingo, febrero 02, 2020

"The Curse of the Red Forest" ya disponible!

Con "unos arreglos" he conseguido terminar y publicar "The Curse of the Red Forest", un juego en el que estuve trabajando hace años y que tuve que dejar congelado por falta tiempo. Vamos a dar un repaso a su desarrollo.
Comencé a usar Unity haya por 2011, cuando decidí dedicar la semana de vacaciones de primavera, la Golden Week, a realizar un pequeño juego (un clon de Diablo) durante 7 días para aprender como usar el engine.
Después de algún proyecto relativamente pequeño en Unity, me decidí a empezar uno mas grande, un RPG en primera persona con combates por turnos y con bastante historia a lo visual novel (¡ya tenia el engine hecho!). Después de hacer unas pruebas (que convertí en tutoriales para YouTube) me decidí embarcarme en este The Curse of the Red Forest como proyecto personal. Sería un juego para móviles y no demasiado largo a pesar de ser n RPG. Mas o menos hasta 2014 el desarrollo avanzaba bastante bien: el juego tenia toda la base terminada y siete de los ocho niveles estaban acabados o casi. El combate también era totalmente funcional, pero faltaba crear mas skills para protagonistas y enemigos, ademas de la ardua tarea de balancear adecuadamente las subidas de nivel con los enemigos que deberían enfrentar los jugadores. Este trailer muestra bastante bien lo que ya tenia terminado para entonces.


Sin embargo alrededor de 2014 muchas cosas cambian en mi vida y ya no puedo dedicar tanto tiempo a proyectos personales. Así que decido congelar a Red Forest y seguir avanzando con Heroes Trials, un proyecto en equipo dentro de Shinyuden. Después de muchos sufrimientos, retrasos y recortes Heroes Trials al final ve la luz en 2018 y puedo recuperar mis proyectos antiguos.
Pero mucho tiempo ha pasado desde que congele Red Forest... Muchos componentes del juego están anticuados. Incluso una parte importante ya no funciona en la versión de 2019 de Unity. A parte, durante estos casi 5 años de pausa he tenido la oportunidad de participar en varios RPG por turnos en mi trabajo de día, incluso he tenido que realizar el diseño para implementar el sistema de combate por turnos en cierto proyecto. Después de tanto combate por turnos el cuerpo me pedía centrarme en algún tipo de juego con mas acción, al menos en mis proyectos personales.
Cierta día examino el estado del Red Forest y hago una lista de cosas por hacer para poder sacarlo, junto con una estimación del tiempo para completarlas. Después de barajar varias alternativas y dado que el juego era completable de principio a fin con excepción de los combates, saco las tijeras y empiezo a recortar: todo el combate fuera, la progresión, las skills... Red Forest se había convertido en un juego de exploración de laberintos con historia (con solo unos pequeños reajustes para quitar las menciones a los combates que ya no están).
Y ese es el juego que ya esta disponible en la Play Store. Si Red Forest era ya un juego corto en su origen, ahora lo es más. Pero es un juego terminado y lanzado, cosas que dudo que hubiera podido hacer si hubiera seguido con el plan original.