11 de octubre de 2016

Cómo se hizo 'Vector Vaults', una nueva maravilla homebrew para Amstrad CPC

Hace ya unos días que apareció, prácticamente por sorpresa, Vector Vaults para Amstrad CPC, un juego programado y diseñado por Alberto Rodríguez que causó no poca sensación en la escena gracias a su originalidad y buen hacer. Vector Vaults sorprendió además por su acabo técnico y trucos de programación, algo no muy habitual en la comunidad homebrew. Alberto nos cuenta cómo lo hizo.




La idea de hacer el juego fue surgiendo poco a poco, impulsada por varios factores. Por un lado, como decíamos en el patio del colegio en 7º de EGB,  "yo soy de Amstrad". Mi primera experiencia con el mundo de la informática fue con un CPC 464 de pantalla de fósforo verde. En aquella época me dedicaba a programar en ensamblador y BASIC, e hice algunas aplicaciones: un editor de modelos 3D, un juego muy parecido al que luego sería Scorched Earth, un clon del juego de motos de TRON, un BASIC en español... pero ninguna llego a tener difusión. Por una parte yo no sabía cómo hacerlas llegar a más gente, y por otra Internet no existía.




Esa espinita, de no haber contribuido a la comunidad con algún programa me la he podido quitar por fin. La idea del 'mode c' la tuve originalmente en esa primera época, aunque no llegué a llevarla a cabo. La oportunidad perfecta se presentó cuando mi mujer me regaló por mi cumpleaños un CPC 6128+ al que puede conectar una unidad SD HxC (un emulador de disquetera que permite leer tarjetas SD). Es en esta configuración en la que he podido realizar las pruebas de Vector Vaults y grabar los discos de 3 pulgadas de la edición física. He desarrollado el juego desde Linux, usando WinAPE sobre Wine como emulador y SDCC como ensamblador y compilador de C a través de la CPCtelera (que por cierto, tiene muy buenas librerías para juegos, aunque Vector Vaults no las usa).


La recepción del juego por parte de la comunidad ha sido muy bueno


«La oportunidad perfecta se presentó cuando mi mujer me regaló por mi cumpleaños un CPC 6128+ al que puede conectar una unidad SD HxC»

Antes de empezar el desarrollo en sí, estuve investigando alrededor de un mes diferentes técnicas para el juego, y llegué a la conclusión de que era imprescindible conseguir 25 frames por segundo para garantizar una buena jugabilidad, que es para mí lo mas importante. Esto condicionó fuertemente las posibilidades gráficas, ya que en un Z80 a 3.5Mhz efectivos (reducido desde 4 Mhz debido a los accesos a la RAM para visualizar la imagen en el monitor) y obviamente sin ningún tipo de habilidades nativas de multiplicación ni división, es muy difícil realizar clipping de líneas con precisión. De ahí que todas las lineas que conforman las fases y objetos de Vector Vaults sean horizontales, verticales y a 45 grados. Esto ha permitido utilizar algoritmos de clipeo con el borde de la pantalla muy especializados y eficientes según cada tipo de línea. Aun así, todavía Vector Vaults iba lentísimo debido al borrado de la pantalla en cada frame. Incluso si hacemos un programa cuya única tarea sea borrar la pantalla y nada más, nunca conseguiremos que lo haga a 25 frames por segundo.

Esquema en la libreta de Alberto para el algoritmo
del clipping de líneas a 45 grados

Esto supuso un golpe moral, ya que amenazaba con impedir el desarrollo del juego. Fue entonces cuando me acordé de una idea a la que le había dado vueltas hacia muchos años: utilizar el modo de 16 colores del Amstrad, pero mostrando sólo 2 tintas visibles, y el resto asignarlas al color del fondo. Si, por ejemplo, dibujamos algo en la tinta número 3, entonces podemos hacerlo desaparecer de pantalla de manera virtualmente instantánea con solo asignar el color de fondo a la tinta 3. Esto está muy bien hasta que lo hayamos hecho varias veces y se nos hayan acabado las 16 tintas de que disponemos.

Algunos dibujos del diseño del primer nivel.

Por eso es necesaria una aproximación mixta: cada frame vamos cambiando las 2 tintas visibles con las que dibujamos todos los objetos del juego, y además borramos realmente con un método tradicional (¡poniendo ceros en la memoria RAM, vamos!) un pequeño fragmento de la memoria de vídeo (en concreto 1/7 de la RAM de vídeo, que son aproximadamente 2340 bytes). De esta manera, cuando se nos acaben las nuevas tintas con las que dibujar, podemos volver a utilizar las más antiguas, ya que en ese momento no hay ningún pixel en el buffer de vídeo en estas tintas (los hemos ido borrando poco a poco). Así podemos borrar la pantalla 7 veces mas rápido (de ahí la c de 'mode c': clear).


Diseños iniciales de los gráficos del juego


«De esta manera, cuando se nos acaben las nuevas tintas con las que dibujar, podemos volver a utilizar las más antiguas, ya que en ese momento no hay ningún pixel en el buffer de vídeo»

Esto se complica un poco más, ya que para los gráficos vectoriales es necesario usar doble buffer de vídeo. El doble buffer de vídeo es una técnica bien conocida que sirve para que, mientras el usuario ve lo que hay dibujado en un buffer, el programa es libre de crear el siguiente frame en el otro buffer. Sólo esta técnica de doble buffer de vídeo gasta 32K de los 64K que tiene un Amstrad CPC 464; esto me forzó a requerir que Vector Vaults funcionase exclusivamente en CPCs de 128K (ya sean nativos o mediante una ampliación al CPC). Estoy contento con esta decisión, ya que de no haberlo hecho así el juego carecería de música (actualmente tiene 5 melodías) y tendría menos fases.

La depuración de las melodías también se hizo sobre la libreta

El otro pilar de la jugabilidad de Vector Vaults es el comportamiento físico con inercia y rozamiento por viscosidad de la nave (Enoch). Utilizar números en coma flotante no era una opción, ya que hubiera de nuevo impedido el objetivo de 25 frames por segundo. La solución es utilizar la técnica de operaciones en punto fijo, que permite usar las operaciones nativas de suma y resta del Z80 en números enteros, pero con algunos bits de la parte baja de cada entero reservados para almacenar decimales. Esto, unos cuantos trucos más y el típico método de Euler, es lo que da soporte al movimiento de Enoch y de la cámara que lo sigue, la cual provoca el efecto de scroll. El scroll es multidireccional, de velocidad variable y con precisión al píxel. Quizás es el primer juego en implementar un scroll con estas tres características en Amstrad  CPC.


¡Más apuntes del primer nivel del juego!


«Quizás es el primer juego en implementar un scroll con estas tres características en Amstrad  CPC»

Vector Vaults es la primera entrega de la 'Hidden History Saga', y la segunda entrega (Light Lands) ya se encuentra bastante avanzada. De momento, sólo puedo decir que Light Lands continúa la historia iniciada en Vector Vaults. Al ganar Vector Vaults se emite un código de uso opcional en Light Lands.

¡Mil gracias a Alberto por contarnos la historia de la creación de su juego!


Visita la web oficial de Vector Vaults y descarga el juego

No hay comentarios:

Publicar un comentario en la entrada