Varilla
12-03-2018, 03:11 PM
Estimados, les traigo este artículo que salió en Xataka. Trata de un ser que quiso cumplir su sueño de niño, programar un juego de Game Boy original y físico, el que terminó publicando y poniendo a la venta. Narra todo lo relacionado en su aventura.
Todos tenemos sueños de pequeños y el mio era hacer un videojuego para mi primera videoconsola: la Game Boy de Nintendo. Hoy se ha cumplido mi sueño porque he publicado mi primer videojuego para Game Boy en un cartucho de verdad: 'Sheep It Up!' (https://catskullgames.com/sheep-it-up)
En este artículo hablaré de las herramientas que he utilizado y de algunos de los escollos que he tenido que superar como novato para conseguir que el proyecto se convirtiera en realidad.
'Sheep It Up!' (https://catskullgames.com/sheep-it-up) (algo así como "¡Oveja arriba!") es un juego arcade en el que una oveja tiene que ir ascendiendo colgándose a tiras de velcro voladoras. El concepto es simple, pero el juego no tarda en convertirse en todo un reto: ¿Hasta dónde puedes subir sin caerte?
Como coleccionista de videojuegos que soy, quería producir este videojuego sin sacrificar ninguno de los títulos antiguos de Game Boy, de ahí que todo el proceso haya sido diseñado específicamente para el videojuego: el pcb, la rom, el cartucho, la carcasa protectora y ¡hasta la pegatina! También intentamos que tuviera un precio razonable para que cualquier persona pueda disfrutar del juego: 15 dólares (+ gastos de envío). Funciona en cualquier modelo de Game Boy, desde el primer modelo hasta la GBA SP, incluyendo la Super Game Boy.
https://i.blogs.es/cfde29/sheepitup_cartoucheweb/450_1000.png
Si todavía tienes una Game Boy, puedes comprar un cartucho en la página web del fabricante (https://catskullgames.com/sheep-it-up).
Las herramientas
En los 90, crear un juego para una videoconsola de 8 bits era todo un desafío y hacía falta un equipo completo de profesionales cualificados. Para mí, los diseñadores, artistas y desarrolladores de la época eran auténticos héroes porque podían crear juegos tan maravillosos con las herramientas tan limitadas que tenían en comparación con todas las opciones que tenemos hoy en día para crear videojuegos.
En 2018 sigue costando mucho trabajo hacer un juego para una consola de 8 bits. Sin embargo, gracias a las geniales comunidades de creadores de videojuegos caseros y de emuladores, tenemos a nuestra disposición todo un arsenal de herramientas que nos hacen la vida mucho más fácil. Sin ellas, una persona con un hobby como el mio nunca podría crear un juego para la Game Boy por su cuenta. ¿Cuáles son esas herramientas?
Para empezar, el lenguaje de programación. En su día, todo el hardware de videojuegos se programaba con Assembly y todavía es posible usarlo (de hecho, es lo recomendado). Sin embargo, ya no es la única opción y hay muchos kits de desarrollo para videoconsolas de 8 y de 16 bits basados en lenguaje de programación C. Para la Game Boy, existe una herramienta genial que se llama Game Boy Developers Kit (http://gbdk.sourceforge.net/) (GBDK).
A la hora de hacer los gráficos y el diseño, ya no es necesario utilizar papel gráfico y un escáner de mano. Por suerte, ahora puedes usar otros dos softwares adicionales:
Game Boy Tile Designer (http://www.devrs.com/gb/hmgd/gbtd.html) (GBTD). Te permitirá dibujar objetos y teselas para después exportarlos a un formato binario para que la Game Boy lo pueda leer.
Game Boy Map Builder (http://www.devrs.com/gb/hmgd/gbmb.html) (GBMB). Este kit te permitirá crear niveles e imágenes de fondo utilizando las teselas dibujadas con GBTD (es como Tiled, pero para Game Boy).
https://i.blogs.es/038296/gbtd/450_1000.png
Finalmente, aunque no menos importante, necesitamos una forma de probar que nuestro videojuego funciona y ahí es donde la modernidad es clave. Mientras que en los 90 los desarrolladores tenían que usar cajas ICE muy caras, hoy podemos utilizar emuladores de software en cualquier ordenador.
Para probar nuestro juego, la mejor opción es BGB (http://bgb.bircd.org/). Se trata de un emulador para Game Boy muy preciso que viene con un detector de bugs muy potente ¡Es la herramienta que vas a necesitar para crear un videojuego que funcione!
https://i.blogs.es/fadc32/bgb/450_1000.jpg
El juego está en la esquina superior derecha y el resto de ventanas terroríficas son las herramientas para arreglar los bugs.
Pero para estar completamente seguro de que el juego funciona, tendrás que probarlo en hardware de verdad. En los 90, la gente grababa su programa en un chip EPROM y utilizaba cartuchos especiales para conectar el chip a una Game Boy real. Aunque era un proceso muy eficaz, llevaba mucho tiempo y era muy caro. Hoy tenemos lo que se conoce como "Flashcarts": cartuchos en los que puedes meter una tarjeta SD con tu juego en la ROM para jugar en una Game Boy de verdad.
La idea es la misma, pero las herramientas son más accesibles y más fáciles de usar. Existen varios tipo de Flashcarts para Game Boy, pero el mejor puede que sea el de Krikzz: el Everdrive Game Boy. (https://krikzz.com/store/) El pasado verano sacaron un nuevo modelo mejorado, pero yo utilicé la versión antigua que había comprado hace tiempo.
https://i.blogs.es/276825/12/450_1000.jpg
Un flashcart de los 90 vs. uno de nuestra década
A pesar de todas estas geniales herramientas que tenemos a nuestra disposición en 2018, crear un videojuego en la actualidad para una videoconsola de 1989 sigue siendo todo un reto, especialmente para aquellas personas que están acostumbradas a usar "herramientas modernas", como Unity, Unreal Engine o Godot.
A continuación voy a describir los principales retos a los que me enfrenté durante el desarrollo de 'Sheep It Up!', incluyendo aquellas cosas que me sorprendieron sobre el fucionamiento de un videojuego de Game Boy.
Límite de tamaño
Empecemos por lo obvio: 'Sheep It Up!' es un juego bastante simple, algo que se explica si tenemos en cuenta que todo el juego pesa solo 32KB. Así es: el código, las imágenes e incluso los sonidos caben todo en solamente 32KB. A modo de comparación, 32KB es el tamaño del logo de la Wikipedia en una resolución muy pequeña:
https://i.blogs.es/17ad48/34/450_1000.jpg
Por supuesto, no todos los videojuegos para la Game Boy caben en 32KB. Para mí, se trataba de una limitación técnica el poder hacer un juego en un cartucho real. De hecho, los mejores videojuegos para la Game Boy y los más famosos pesan mucho más:
Pokemon Rojo / Azul pesan 1024KB (¡Son enormes!)
Wario Land y La leyenda de Zelda: El despertar de Link pesan 512KB
Kirby Dream Land pesa 256KB
Gargoyle's Quest pesa 128KB
En realidad, hay pocos títulos para la Game Boy que tengan solo 32KB y la mayoría son de los primeros años de la consola. Por ejemplo, tanto Alleway (uno de los juegos que sirvió de lanzamiento de la consola en Japón) y Tetris (juego de lanzamiento en EE.UU. y Europa) tienen 32KB. Ambos son títulos excelentes, pero debido a la limitación de espacio de sus cartuchos son un tanto "limitados" en su alcance: una sola pantalla, pocos medios gráficos y de audio, etc.
https://i.blogs.es/68427e/tetris/450_1000.jpg
Alleyway y Tetris son juegos de 32KB, como Sheep It Up!
CPU: jugando con la potencia portátil
La Game Boy tiene una CPU de 4MHz diseñada especialmente para la consola (es una mezcla entre el procesador Z80 de Zilog y el 8080 de Intel). Con todo, el poder de procesamiento de la Game Boy es comparable al de la NES e incluso algo más potente gracias al reducido tamaño de su pantalla y a la falta de colores en la imagen (veremos más sobre esto después).
A pesar de contar con solo 4Mhz, todos los juegos de la Game Boy cuentan con una resolución de 60 fps constantes. ¡Toma esa PS4 Pro y Xbox One X!
Pero para un programador que acaba de terminar la universidad, el mayor reto será trabajar con un procesador de 8 bits. Como probablemente sabrás, todos los ordenadores utilizan 0 y 1 para procesar datos. Un solo dígito, que puede tener 0 o 1 como valor, se llama "bit" (abreviatura de "binary digit (dígito binario)", porque solamente puede tener dos valores diferentes). Un procesador es de 8 bits cuando puede procesar 8 bits de datos con una simple operación.
¿De qué manera influye a la hora de crear videojuegos?
Pues bien, cuanto menos "bits" pueda procesar la CPU, más limitadas serán las variables durante el juego. Por ejemplo, en los videojuegos utilizamos muchos números enteros para representar valores: vida, velocidad, puntuación, etc.
Con 8 bits de datos, un entero puede almacenar números más pequeños que una variable de 16 bits:
Variable entera de 8 bits: -127 a 128 (o 0 a 255 si no usa señal)
Variable entera de 16 bits: -32768 a 32767 (o 0 a 65535 si no usa señal)
Si todavía te suena demasiado a chino, pongamos un ejemplo directo de 'Sheet It Up!'
https://i.blogs.es/0e9873/sheepitup_score/450_1000.png
Como puedes ver en esta imagen, la variable de puntuación consta de 5 dígitos y puede tener un rango de 0 a 99999. Desafortunadamente, es mucho mayor de lo que una variable entera puede almacenar. De hecho, ¡Ni siquiera una variable entera de 16 bits es suficiente para almacenar una puntuación tan "grande"!
Así que para poder registrar la puntuación en 'Sheep It Up!' tuve que usar no una, sino cinco variables enteras de 8 bits diferentes. Te invito a "descubrir" lo divertido que fue manejar todas esas variables, especialmente cuando añadí la opción de guardar la mejor puntuación, lo que supone comparar dos valores almacenados entre 5 variables diferentes.
Programar en un sistema de 8 bits te obligará a pensar en soluciones complejas de este tipo todo el tiempo, mientras que los sistemas modernos simplemente utilizan variables de 32 o 64 bits que nunca suponen un problema para sus programadores.
(Nota: para aquellos desarrolladores de videojuegos más experimentados, sé que podía haber sido más eficiente utilizando un int8 entero para almacenar un solo dígito entre 0 y 9. Sin embargo, sí que necesitaba que cada variable pudiera estar entre 0 y 255 porque en realidad no se guarda el dígito de la puntuación de forma directa, sino la identificación de los píxeles utilizada para mostrar dicho número en la pantalla)
Un mundo, dos planos
Todas las imágenes que se ven en una Game Boy están compuestas por dos elementos: una capa de fondo (BKG) y varios objetos en movimiento, también conocidos como sprites (OBJ). Existe un límite de un máximo de 40 objetos en la pantalla con la limitación adicional de que la Game Boy no puede mostrar más de 10 objetos en la misma línea.
https://i.blogs.es/6c10ae/sheepitup_planes/450_1000.gif
En realidad, es un poco más complejo porque hay una capa adicional de "ventana" que puede deslizarse de forma diferente del fondo. Normalmente se utiliza para crear la interfaz de usuario (puntuación, etc.). Sin embargo, esta capa es "no-transparente": esconderá cualquier tipo de datos gráficos en la capa de fondo que tiene detrás, por lo que, para simplificar, puedes pensar que existe una sola capa de "fondo" en una Game Boy pero que puede hacer que una parte se mueva de forma independiente si lo necesitas.
¡La Game Boy ve 4 colores!
Hablemos del problema más evidente: el modelo original de la Game Boy solo puede reproducir cuatro colores.
https://i.blogs.es/c3f2f7/sheepitup_colors-1-/450_1000.png
Se puede discutir que no se trata realmente de gris claro y gris oscuro, sino más bien verde claro y verde oscuro, pero da lo mismo: solamente puedes usar 4 colores para hacer los dibujos. Por lo menos cuando hablamos del fondo, ¡porque para los objetos es diferente!
https://i.blogs.es/2ad0d5/sheepitup_sprite1/450_1000.png
De hecho, como puedes ver en la imagen, la oveja ha sido dibujada con solo tres colores. ¿Por qué? De hecho, dibujé el objeto en 4 colores, pero el cuarto color (el negro) simplemente no se ve porque la Game Boy lo procesa como "color transparente". De esta forma, los objetos no son "imágenes cuadradas", sino que pueden tomar muchas formas haciendo que podamos ver la imagen de fondo que tienen detrás.
https://i.blogs.es/e6e020/sheepitup_sprite2/450_1000.png
¿Significa que no puedo usar el negro para dibujar objetos?
Por supuesto que no, tal y como puedes ver en el objeto de la línea de "velcro". Para este objeto, utilicé una paleta de colores diferente de 3+1: el "blanco" como color transparente y el "negro" para el objeto.
https://i.blogs.es/0255b1/sheepitup_sprite3/450_1000.png
Las paletas de colores pueden ser divertidas
Aunque solo pueda usar 4 colores, la Game Boy utiliza 3 paletas de colores diferentes para mostrar imágenes ¡Y es genial!
https://i.blogs.es/1ecd1f/sheepitup_palettes/450_1000.png
Como puedes ver, hay una paleta individual de "4 colores" para la capa de fondo y dos "paletas de "3 colores + 1 color transparente" para los objetos (cada objeto puede usar una u otra paleta de colores). Lo bueno de estas paletas de colores es que puedes asignar libremente cualquier color que quieras en cualquiera de las paletas. Esto te permite crear efectos resultones como el efecto de enfocado/desenfocado que hay en muchos videojuegos.
https://i.blogs.es/f77285/sheepitup_fade_anim2/450_1000.gif
Para crear un efecto de enfoque en una Game Boy, simplemente necesitas modificar los colores en las tres paletas de colores. En el primer paso, todos los huecos de las paletas están en blanco. Después, se pone gris claro el espacio para el color más oscuro (negro) para revelar la imagen de forma progresiva. En el tercer paso, el gris claro pasa a ser gris oscuro, etc. Así hasta que se vean los cuatro colores en cada paleta de colores.
Con un método similar, podemos hacer que un caracter "parpadee" cambiando los colores de su paleta en cada fotograma. Por ejemplo, es algo que se utiliza en Super Mario Land cada vez que Mario se hace con una estrella y se vuelve invencible.
¡El mundo en mosaicos!
Hay una última cosa a tener en cuenta en el modo en el que la Game Boy representa las imágenes, o por lo menos para un desarrollador de videojuegos acostumbrado a las últimas tecnologías. Dado que la consola no tiene un "búfer de fotogramas" no puedes especificar el color de cada píxel en la pantalla de forma individual. De hecho, todas las imágenes en la pantalla son un conjunto de "teselas", es decir, cuadrados de píxeles de 8x8. Esto se aplica tanto al fondo como a los objetos:
https://i.blogs.es/fe784f/sheepitup_tiles1/450_1000.png
Esta técnica, diseñada para reducir la cantidad de RAM de vídeo necesaria para mostrar imágenes, implica que no puedes dibujar líneas a mano alzada en la pantalla de la Game Boy. Pero también es uno de los secretos que hace que la Game Boy sea capaz de representar videojuegos tan bonitos con una CPU de solo 4Mhz y solo 8KB de RAM de vídeo (has leído bien, he escrito kilobytes y no megabytes o gigabytes).
Sin embargo, uno de los inconvenientes de esta pantalla a modo de mosaico es que nuestros objetos "oveja" y "velcro" en realidad están compuestos por más de un objeto. La oveja tiene 16x16 píxeles, por lo que en teoría necesitaría cuatro objetos de 8x8 para crearla. Por suerte la Game Boy también cuenta con un modo de representación de 8x16, lo que significa que en realidad cada objeto en 'Sheep It Up!' solamente está compuesto por dos objetos en vez de cuatro.
https://i.blogs.es/5fe231/sheepitup_tiles2/450_1000.png
¿Recuerdas que teníamos un límite de 40 objetos en pantalla con el limite adicional de que la Game Boy no puede mostrar más de 10 objetos en la misma línea?
En este caso, significa que no podemos tener más de 5 ovejas juntas en la misma línea, en vez de las 10 que podrías haber pensado en un principio (porque la oveja se compone de 2 objetos desde el punto de vista de hardware).
Puntos a pantalla completa
No lo había mencionado aún, pero la resolución de la pantalla de la Game Boy es de 160x144 píxeles, lo que significa que necesitas 20x18 = 360 teselas para cubrir toda la pantalla.
https://i.blogs.es/9d397e/sheepitup_titletiles1/450_1000.png
Desafortunadamente, la RAM de vídeo de la Game Boy es limitada (8KB) y solo puede almacenar 256 teselas diferentes. Esto significa que, si no utilizamos ningún truco en el código, no puedes mostrar ninguna imagen a pantalla completa:
https://i.blogs.es/140207/sheepitup_titletiles2/450_1000.png
El secreto está en reutilizar teselas. Tal y como puedes ver, la imagen de teselas tiene mucho "espacio vacío", lo que significa que una sola "tesela blanca" en RAM está varias veces en la imagen. En realidad, la imagen de la pantalla en forma de mosaico solamente utiliza 178 teselas diferentes, lo que significa que todavía queda espacio para algunos detalles extra si fuera necesario.
https://i.blogs.es/15ce5a/sheepitup_rawtitletiles/450_1000.png
No sé qué método utilizaban para reutilizar teselas en los 90, pero hoy existe una herramienta muy buena que se llama Game Boy Tile Data Generator (http://www.chrisantonellis.com/gameboy/gbtdg/). Le pones una imagen PNG (en 4 colores) y generará automáticamente por ti las teselas y el mapa de teselas necesarios para representarlos en una Game Boy. Obviamente, también detectará de forma automática y reutilizará las teselas que sean idénticas para salvar tanta RAM de vídeo como sea posible en la consola.
https://i.blogs.es/5146d4/gbtdg/450_1000.png
A modo de información, la mayoría de las consolas de los 80 y los 90 funcionaban de forma similar con una pantalla basada en teselas de 8x8: Nes, Master System, PC-Engine, Super Nintendo, Genesis, Game Boy, Game Gear...Las primeras videoconsolas a nivel mainstream que tuvieron un búfer de fotogramas fueron la PlayStation y la Saturn, mientras que la primera consola de Nintendo que lo consiguió fue la Game Boy Advance (la Lynx de Atari fue la primera consola de mano con píxeles individuales).
¡Por eso aprender a "programar con teselas" en la Game Boy es una habilidad transferible si después quieres hacer proyectos en otra videoconsola retro!
Consejos de los profesionales: ¡Hacer objetos de 4 colores!
Finalicemos con un pequeño consejo de los grandes desarrolladores de Nintendo. Echa un vistazo a esta captura de pantalla de Wario Land:
https://i.blogs.es/6b4104/warioland_coin/450_1000.png
¿Puedes ver que la moneda, un objeto, ha sido dibujada con 4 colores? ¿Cómo pudieron hacerlo si te he dicho que la Game Boy solamente puede mostrar 3 colores por objeto?
https://i.blogs.es/ef204e/warioland_coin/450_1000.gif
La respuesta es sencilla: cada moneda está hecha de 2 objetos y cada objeto utiliza una paleta de colores diferente. Como puedes ver, si dividimos la moneda en dos mitades, está compuesta de dos objetos de 8x16. Como siempre pasa con Nintendo, se presta mucha atención a los detalles: no es que simplemente juntarán dos "mitades de objetos", sino que las dibujaron con las teselas e hicieron que se sobrepusieran en 1 píxel ¡Para que la moneda tuviera más aspecto de ser un único elemento!
Restricciones de sonido
Como vimos anteriormente, la Game Boy cuenta con limitaciones obvias en cuanto a la potencia de la CPU y en el apartado gráfico. Pero lo mismo se puede decir del audio. De hecho, a diferencia de los dispositivos modernos, la Game Boy no puede reproducir MP3 o leer archivos WAV. Para crear sonidos y música en una Game Boy tienes que crearlos de forma dinámica usando los 4 "canales de audio" que tiene la consola, cada uno con una función diferente:
Canal 1: Nota y barrido puede reproducir un sonido (una nota) subiendo o bajando un tono.
Canal 2: Nota puede reproducir una nota sin ningún efecto especial.
Canal 3: Forma de onda puede reproducir formas de ondas muy sencillas (codificadas en 4bits).
Canal 4: Ruido puede generar sonido de explosión o de motor.
Voy a repetirlo: para crear un sonido con una Game Boy tienes que generarlo de forma manual controlando de forma directa estos 4 canales de sonido. Por suerte, es algo bastante sencillo: simplemente tienes que modificar los valores de algunos de los registros del hardware. Cada canal de sonido está controlado por 4 o 5 registros de hardware (variables de 8bits) que definen el volumen, el tono, los efectos especiales, etc.
Configurando diferentes valores en los registros que controlan un canal, puedes hacer que la Game Boy reproduzca una gran variedad de sonidos. Por ejemplo, aquí os dejo tres sonido de Sheep It Up! que he creado utilizando el canal de sonido 1, así como los valores de registros utilizados para generarlos:
Salto
NR10_REG = 0x15;
NR11_REG = 0x96;
NR12_REG = 0x73;
NR13_REG = 0xBB;
NR14_REG = 0x85;
Caída al suelo
NR10_REG = 0x79;
NR11_REG = 0x8D;
NR12_REG = 0x63;
NR13_REG = 0xC8;
NR14_REG = 0x80;
Cayendo (game over)
NR10_REG = 0x4F;
NR11_REG = 0x96;
NR12_REG = 0xB7;
NR13_REG = 0xBB;
NR14_REG = 0x85;
Como puedes ver, establecer diferentes valores para cinco variables te permite producir efectos de sonido muy diferentes. Uno podría imaginarse que, para crear sonidos, puedes optar por ir probando hasta dar con el sonido que quieres: pones valores aleatorios a los registros hasta que encuentres un sonido que te guste. Pero eso sería demasiado complicado y no tendría mucho sentido. Así que, por suerte, las herramientas actuales nos hacen la vida más fácil. En este caso, tengo que hablar de GB Sound Sample Generator (https://github.com/Zal0/GBSoundDemo).
https://i.blogs.es/5a80be/sfx_1/450_1000.jpg
Primero configuras unos parámetros bastante sencillos hasta encontrar un sonido que te guste (dale a START para reproducir el sonido actual)
Se trata de un programa de Game Boy que se ejecuta en hardware real y que te permite modificar los valores de los registros del hardware de sonido de una forma muy intuitiva. En vez de establecer el valor bruto de "NR10_REG", lo que harás será definir una frecuencia de sonido, un nivel de volumen, un tiempo de barrido, etc. Puedes ver este herramienta como un SFXR (https://www.drpetter.se/project_sfxr.html) para la Game Boy. Pero si quieres exportar tu sonido, en vez de guardarlo en un archivo WAV, GB Sound Sample generator (https://github.com/Zal0/GBSoundDemo) te mostrará los valores de registro de hardware correspondientes. Así que para reproducir un sonido en tu videojuego, simplemente tienes que introducir estos valores en tu código fuente.
https://i.blogs.es/27ed73/sfx_2/450_1000.jpg
A continuación solo tienes que mantener pulsado A+SELECT para visualizar los valores de registro brutos del hardware
Para Sheep It Up!, utilicé GB Sound Sample generator (https://github.com/Zal0/GBSoundDemo) en una Game Boy Advance SP (la pantalla retroiluminada es más fácil de leer), ejecutando la ROM en un Everdrive GB (https://krikzz.com/store/). Me pasé bastante tiempo retocando los parámetros directamente en la consola y cuando encontré una buena combinación pude copiar fácilmente los valores de la pantalla de la Game Boy al código fuente en mi ordenador.
https://i.blogs.es/b14867/sfx_3/450_1000.jpg
Para reproducir este sonido en tu juego, simplemente necesitas copiar los valores de registro de hardware en tu código fuente
A pesar de las limitaciones de audio, la Game Boy se utiliza a día de hoy como instrumento musical. En la escena del chiptune existen muchos artistas con talento que crean cortes estimulantes con una Game Boy utilizando programas como LSDJ (http://littlesounddj.com/lsd/index.php) o Nanoloop (https://www.nanoloop.com/). Por ejemplo, puede que hayas oído hablar de la leyenda irlandesa del chiptune Chipzel (http://chipzel.co.uk/) que compuso música para Super Hexagon (https://www.youtube.com/watch?v=5mDjFdetU28) o del artista francés Sidabitball (https://www.sidabitball.com/) que remezcló muchos éxitos de música pop de los 90 (https://www.youtube.com/watch?v=JAbMn3GMwFA).
https://i.blogs.es/e32d0f/chipzel-sidabitball/450_1000.png
Chipzel (izquierda) y Sidabitball
Por desgracia para los desarrolladores de videojuegos, LSDJ (http://littlesounddj.com/lsd/index.php), la herramienta utilizada para componer estas canciones innovadoras, utiliza casi el 100% de los recursos de hardware de la Game Boy. Esto significa que puedes crear música con la consola, pero no puedes ejecutar un juego mientras reproduces dicha música. Por suerte, existen alternativas que consumen menos recursos para crear y reproducir música en la Game Boy.
1) Reproductor de música personalizado
La solución más fácil es hacer tu propio "reproductor de música". Recuerda que la única manera de crear sonidos en la Game Boy es establecer los valores de los registros del hardware que controlan los 4 canales de generación de sonido. De ahí que puedas crear de forma sencilla tu propio "reproductor de música" almacenando "notas" en una matriz.
Cada "nota" es una combinación única de valores para cada registro del hardware. Si a continuación defines el ritmo de la matriz para reproducir dichas notas, puedes tener una forma muy sencilla de crear música y así fue como lo hice en el caso de Sheep It Up!. Aquí os dejo un pequeño vídeo del juego con sonido y música para que podáis escuchar el resultado:
Para ser más específico, mis "notas" solamente se reproducen en el canal de sonido 2. De hecho, los cuatro canales de sonido se utilizan tanto para efectos de sonido como para música. Así que si estás reproduciendo una nota en un canal, no puedes utilizarlo para reproducir un efecto de sonido al mismo tiempo.
Puesto que cada canal es más bien "específico", a veces puede ser preferible utilizar algunos canales solo para música, mientras que es mejor reservar otros canales para los efectos de sonido. Por ejemplo, el sonido "plip" que escuchas cada vez que la oveja se agarra a una cinta de velcro voladora se reproduce en el canal 4 (ruido). Como se trata de un sonido muy común en mi videojuego, decidí evitar utilizar este canal para música. Lo mismo vale para el canal 1 porque lo utilicé para el resto de efectos de sonido. Puesto que mis capacidades musicales son bastante limitadas, decidí no utilizar las formas de onda del canal 3 y en su lugar me centré en los tonos del canal 2.
2) GBT Player y Carillon Player
Muchos videojuegos caseros utilizan la opción del "reproductor de música personalizado". Por suerte, no es la única opción disponible. Existe una librería de datos que se llama GBT Player (https://github.com/AntonioND/gbt-player) que puede convertir los módulos de música (en formato Impulse Tracker ".it") para después reproducirlos en una Game Boy. Por supuesto existen muchas limitaciones en cuanto al tamaño de los samples, el número de canales y los efectos de tono que puedes usar. Pero sin embargo te permite componer música real en un tracker real, como OpenMPT (https://openmpt.org/), y después reproducirla en la Game Boy.
La guinda del pastel es que esta librería solamente consume un 7-8% de los recursos de la CPU de la Game Boy, lo que deja mucha potencia de procesador para ejecutar el resto del programa. Además, es muy sencillo de integrarlo con tu código, ya sea si decides programar tu juego en C con GBDK o montarlo con RGBDS. Carillon Player (http://www.pouet.net/prod.php?which=17337) es una buena alternativa al GBT Player, aunque tendrás que usar el Carillon Editor para componer música en vez de tu tracker musical favorito.
Geometrix es un videojuego casero hecho por AntonioND, el creador de GBT Player. La música utiliza esta librería de datos.
Vayamos a la parte física: meter el juego en un cartucho
Después de mucho trabajo con el código, los gráficos y el audio, el juego por fin estaba completo. Sin embargo, a estas alturas lo único que tenía era un archivo ROM. Por supuesto podía (y así lo hice) probarlo en muchas de mis Game boys que tengo en mi colección (en todas menos en la AGS-101), pero para mí el proyecto no estaba completo porque el videojuego tenía que tener su propio cartucho personalizado para poder considerarlo como "acabado".
Como mencioné al inicio, la ROM de 'Sheep It Up!' pesa solo 32KB, al igual que algunos de los primeros títulos para la Game Boy como 'Tetris' o 'Alleway'. Sin embargo, la mayoría de los juegos para Game Boy son mucho más grandes y van desde los 128KB hasta los 512KB, siendo los 'Pokémon Azul' y 'Pokémon Rojo' los más grandes con sus gigantescos 1024KB (1MB). En los 90, cuanto más grande era el juego, más costaba fabricar los cartuchos porque tenías que utilizar chips más caro para almacenar juegos tan grandes. Pero a día de hoy, casi todos cuestan lo mismo. Entonces, ¿por qué me puse el límite de 32KB?
La respuesta es que quería ser capaz de sacar el juego en un cartucho nuevo. Como te podrás imaginar, Nintendo hace mucho tiempo que dejó de fabricar cartuchos para la Game Boy (ejem, quiero decir Game Paks). Así que existen dos soluciones alternativas para crear tu propio videojuego en cartucho a día de hoy:
1) Cartmodding
La primera opción se denomina "cartmodding" y consiste en reciclar juegos antiguos de la Game Boy. Los juegos que salieron al mercado durante la era comercial de la Game Boy eran cartuchos que no se podían reescribir, por lo que para cambiar el juego almacenado en el cartucho tienes que abrirlo, desoldar el chip de memoria y cambiarlo por otro chip de memoria en el que has guardado tu propio archivo ROM. Esta solución te permite crear juegos de cualquier tamaño. Sin embargo, como coleccionador de juegos que soy, no quería destrozar ningún juego para la Game Boy para fabricar el mio.
https://i.blogs.es/6d76a7/cartmodding/450_1000.jpg
Un ejemplo de cartmodding. Un nuevo chip de memoria que contiene un videojuego casero ha sido soldado dentro de un cartucho viejo.
2) Cartucho personalizado
Así que la segunda opción es fabricar un nuevo cartucho desde cero. Como no sé nada de electrónica, empecé a buscar gente en Internet que fuera capaz de construir cartuchos para la Game Boy. Tras varios intentos fallidos, tuve la suerte de contactar con Catskull. Se trata de todo un manitas de la electrónica que construye y vende mucho hardware relacionado con la Game Boy en su tienda Catskull Electronics (https://catskullelectronics.com/).
Entre otras muchas cosas, ha diseñado un dispositivo para conectar la Game Boy a una interfaz MIDI, lo que le permite a los músicos usar la Game Boy con instrumentos y sintetizadores de verdad. También ha diseñado su propio cartucho para la Game Boy donde todo ha sido creado a partir de cero: la PCB, los chips, las carcasas e incluso las pegatinas (nada ha sido reciclado a partir de juegos viejos). Esta era la solución perfecta para mí.
https://i.blogs.es/1fcdcb/catskull_pcb_lq/450_1000.jpg
El cartucho original PCB diseñado por Catskull y utilizado para 'Sheep It Up!'
Pero es todavía mejor: tras un par de correos electrónicos, Catskull me dijo que llevaba tiempo queriendo publicar juegos caseros bajo su propia compañía y que mi juego era la oportunidad perfecta para ser el primer título. Así que nos pusimos a trabajar juntos: yo hago el software y el hace el hardware. La única pega para esta opción es que el cartucho para la Game Boy de Catskull solamente puede almacenar un juego de 32KB. ¿Por qué?
Originalmente, la Game Boy estaba diseñada para poder tener acceso a solamente 32KB de datos ROM. Para poder tener juegos con más de 32KB de datos, necesitas "navegar" por todos los datos del cartucho accediendo cada vez solamente a un apartado de todos los datos ROM. A este método se le conoce como "Bank Switching": todos los datos de ROM están segmentados en bancos de 16KB y puedes intercambiarlos cada vez que quieras (con algunas limitaciones). Sin embargo, para poder hacer bank switching el cartucho tiene que tener un chip adicional: el "Memory Bank Controller" (MBC).
Existen varios chips (MBC1, MBC5, etc.) que permiten mayores tamaños de ROM, RAM a base de baterías para guardar el juego, etc. Desafortunadamente, de momento no existe una solución real para producir nuevos cartuchos desde cero con un chip de dichas características.
Así que la gente que está haciendo videojuegos caseros que pesan más de 32KB normalmente tiran de "cartmodding" para poder reutilizar el chip MBC de los cartuchos de videojuegos antiguos que "reciclan". Otra solución es comprar copias ilegales de juegos de la Game Boy y reutilizarlos. De hecho, los fabricantes chinos hace años que han conseguido "clonar" el chip MBC para poder producir copias piratas de juegos grandes como 'Pokémon'.
Además, estos cartuchos piratas utilizan chips EEPROM en vez de los chips ROM de los juegos antiguos y normalmente no se pueden "reutilizar" y modificar el juego que llevan. Para ello tendrías que utilizar un intercambiador de cartuchos como el BennVenn's Joey (https://bennvenn.myshopify.com/products/reader-writer-gen2). Existen varios videojuegos caseros que pesan más de 32KB y que han salido utilizando esta opción.
https://i.blogs.es/09c53a/chinese2/450_1000.png
Un cartucho pirata hecho en China. Este cartucho se puede reutilizar, pero otros no
En el caso de 'Sheep It Up!', quería producir cartuchos 100% originales para evitar destruir juegos originales de la Game Boy. Tuve mucha suerte al encontrar un socio como Catskull que fabrica sus propios cartuchos, aunque tuviera que limitarme a 32KB de tamaño total.
¿Y cómo se hacen los cartuchos "personalizados"? Le pedí a Catskull que hiciera fotos de los diferentes pasos a seguir para montar sus propios cartuchos. Como veréis, cada cartucho se monta a mano.
1) Se pone la PCB en una placa.
https://i.blogs.es/6fa916/catskull_assembly_2/450_1000.jpg
2) Se pone una plantilla de acero inoxidable sobre la PCB para poder poner la pasta de soldadura.
https://i.blogs.es/5b83b3/catskull_assembly_1/450_1000.jpg
3) Normalmente hago lotes de 18-20 tarjetas a la vez y aplico la pasta de soldadura a todo el lote.
https://i.blogs.es/944541/catskull_assembly_3/450_1000.jpg
4) Ahora toca colocar de forma manual los condensadores y las resistencias sobre las tarjetas. Después pongo los chips de memoria flash en cada tarjeta.
https://i.blogs.es/837c00/catskull_assembly_4/450_1000.jpg
5) Se ponen las tarjetas en una placa de horno para hacer el reflujo. Literalmente, tenemos que "hornear" cada tarjeta para soldar cada chip a las tarjetas. Después puedo coger cada PCB y poner la ROM del juego en el chip de memoria.
https://i.blogs.es/a1ecd4/catskull_assembly_5/450_1000.jpg
6) Después se pone la PCB en una carcasa de cartucho con una etiqueta preciosa hecha por una imprenta profesional.
https://i.blogs.es/7d245b/sheepitup_cartoucheweb/450_1000.png
7) Después de probarlo todo de forma minuciosa para comprobar que el cartucho funciona a la perfección en el hardware real, ¡el juego está listo y se puede enviar al jugador que lo haya pedido!
Después de toda esta información técnica, me gustaría dar una opinión más personal sobre lo que este proyecto ha significado para mí. Para poner las cosas en contexto, la charla que más me ha inspirado de todas las que he visto es "Cómo conseguir de verdad que tus sueños de la infancia se cumplan" (https://www.youtube.com/watch?v=ji5_MqicxSo) de Randy Pausch. Realmente la recomiendo. Se trata de una lección brillante sobre cómo ver la vida desde un punto de vista maravilloso, incluso en los días más oscuros. Para tener una vida que tenga sentido, Randy Pausch nos invita a intentar conseguir aquellos sueños que teníamos cuando éramos pequeños y a ayudar a los demás a que cumplan sus sueños.
Entre los primeros sueños de mi lista estaba "crear un videojuego para la Game Boy de Nintendo". La Game Boy fue mi primera videoconsola y siempre tendrá un lugar especial en mi corazón. Durante años estuve diciéndome a mí mismo que algún día haría un videojuego, pero siempre tenía "cosas más importantes que hacer" como trabajar en proyectos con los que ganar dinero para poder pagar el alquiler. Hasta que un día me encontré por casualidad con la página de BitBitJam (http://bitbitjam.com/), una comunidad de talleres para la creación de videojuegos en consolas retro. Ahí fue cuando recordé las palabras del sabio Randy Pausch: ¿Qué pasaría si, por una vez, intentara trabajar en algo con la única misión de cumplir uno de los sueños de mi infancia?
Así que un mes antes de que empezaran los talleres decidí informarme sobre el tipo de herramientas que existen para crear juegos para la Game Boy. Durante los talleres me pasé una semana entera (estaba de vacaciones) para crear un prototipo de 'Sheep It Up!'. Después de los talleres, seguí trabajando en el juego, puliéndolo, refinándolo, optimizándolo, redibujándolo... hasta que estuve satisfecho con el resultado. Mientras tanto también me puse a mirar cómo hacer cartuchos para el juego y fue cuando tuve la suerte de encontrarme con Catskull, alguien que podía hacerlo y que tenía el gusanillo de crear una empresa de publicación de videojuegos caseros.
Recuerda que mi objetivo real no era publicar un videojuego, sino cumplir uno de los sueños de mi infancia y en mi sueño, podía jugar el cartucho de videojuego que había creado en mi Game Boy
Como puedes ver, la videoconsola que tenía de pequeño está para el arrastre: ya no se muestran varias columnas de píxeles, los botones están desgastados y hay un rayonazo vertical en la pantalla. Pero todavía funciona. No puedo poner en palabras lo que se siente al jugar un videojuego que TÚ has creado en la mismísima consola con la que pasaste tanto tiempo jugando de niño. Lo único que puedo decir es que, en este preciso momento, mi yo de 9 años está muy orgulloso de la persona en la que se ha convertido de adulto y solamente eso es lo mejor que me podía haber pasado tras realizar este proyecto.
https://i.blogs.es/9e7d89/mygb_1_lq/450_1000.jpg
Sigue funcionando 25 años después y puede ejecutar un juego fabricado en 2017
Compartiendo el sueño: el feedback de los jugadores
Es genial poder crear un videojuego que te va a gustar, pero es mucho mejor si otras personas también pueden disfrutarlo. Cuando terminé el proyecto, sabía que 'Sheep It Up!' era un juego sencillo, así que no tenía muchas expectativas al respecto. Sin embargo, los comentarios que he recibido me han sorprendido gratamente.
De hecho, a pesar de (o gracias a) la simplicidad del juego, a los que lo han probado realmente les ha gustado. La jugabilidad es lo bastante sencilla como para aprender a jugar en cuestión de segundos, pero no tarda en engancharte para que quieras echar "otra partida" e intentar superar tu mejor puntuación. Por cierto, ¡mi mejor puntuación hasta el momento es de 147 puntos! Pero lo que más me gusta de la comunidad de videojuegos retro es la pasión detrás de la mayoría de los jugadores y es algo que puede traer sorpresas muy gratas.
Para empezar, muchas personas se quejaron de que el juego no venía en "una caja". Yo colecciono los videojuegos en cartuchos sin sus respectivas cajas (por cuestiones de dinero y de espacio) por lo que no se me pasó por la cabeza una versión con una caja. Pero después me di cuenta de que hubiera sido una buena idea ofrecerle a la gente lo que quiere y uno de los fans del juego, Cyph, fue más allá y se hizo su propia caja para el juego reutilizando una caja de un juego de la Nintendo DS.
No sé a ti, pero a mí el resultado me parece genial. Para aquellos a los que le interese, puedes hacer tu propia caja en casa. Simplemente necesitas una caja de un juego de la Nintendo DS, quitar dos pequeñas piezas de plástico que hay dentro y poner esta preciosa carátula diseñada por Cyph (https://www.kromeheaven.com/sheepitupcover/SheepItUpCoverByCyph.png).
https://i.blogs.es/aad959/box_cyph/450_1000.jpg
Una preciosa caja personalizada para 'Sheep It Up!' creada por Cyph, un fan del juego, con una caja de Nintendo DS
Otra curiosidad sobre el juego es que fue presentado durante una de las mayores convenciones de videojuegos del mundo: la Paris Game Week (300.000 visitantes, más que E3 o la Tokyo Game Show). ¿Cómo acabó un videojuego casero para la Game Boy en el mismo evento que los últimos videojuegos AAA de la industria? En este caso se lo tengo que agradecer a OrdiRetro (https://www.ordiretro.fr/), una asociación francesa dedicada a la historia de los videojuegos y más específicamente a los nuevos videojuegos sacados para consolas y ordenadores antiguos.
Esta asociación tenía un puesto en el evento para mostrar una selección de videojuegos y gracias a mi amigo Julián Álvarez (http://www.ludoscience.com/EN/6-Julian-Alvarez.html) se enteraron de que el juego existía y me propusieron presentarlo durante el evento.
https://i.blogs.es/0f4b3c/parisgameweek/450_1000.jpg
'Sheep It Up!' en una Super Game Boy durante la Paris Game Week 2017 ¡Gracias OrdiRetro!
Pero algo así también puede pasarte sin que conozcas a alguien en concreto. Justo después de que saliera el videojuego lo compraron dos entusiastas de la Game Boy alemanes que llevan la página web DMGpage (https://dmgpage.com/2017/11/04/das-war-die-1-retro-boerse-hofheim-04-11-2017/). Pero no solamente lo compraron, sino que también lo presentaron durante una convención de videojuegos retro: la Retro-Börde en Hessen, Alemania. Así que varias personas pudieron jugar al juego en una Super Game Boy en una convención de videojuegos en Alemania gracias a dos fans de la Game Boy. Es algo de lo que también estoy muy agradecido.
https://i.blogs.es/647e47/retroborse/450_1000.jpg
'Sheep It Up!' presentado en una Super Game Boy durante la Retro-Börse en Hessen. ¡Gracias DMGpage!
Cuando haces un videojuego casero para una videoconsola retro no lo haces por el dinero o por la fama. Se fabrican muy pocas copias de estos juegos y normalmente solo lo van a comprar un par de decenas de personas o como mucho cientos de personas si el juego es muy bueno. De lo que sí puedes estar seguro es de que las personas que lo compren realmente se interesarán por el videojuego y de que son tan apasionadas de los videojuegos retro como tú (o incluso más). Así que, si te ha gustado este artículo sobre cómo crear un juego para la Game Boy en la actualidad, ¿por qué no pruebas a hacer uno por tí mismo?
Como puedes ver hay muchas herramientas sencillas para crear un videojuego para la consola de mano más mítica de la historia. No te harás rico haciendo un videojuego para la Game Boy, pero te divertirás mucho creándolo y puede que también puedas hacer que otros pasen un buen rato jugando con tu juego.
Así que espero que te haya gustado este análisis y que te entren ganas de probar el mundo del desarrollo de videojuegos retro. Mientras tanto, si todavía tienes una Game Boy por casa, no te olvides de que puedes adquirir un precioso cartucho de Sheep It Up por solo 15 dólares (http://catskullgames.com/sheep-it-up) en la página web de Catskull games ¡Cada cartucho se ensambla a mano antes de su envío!
Este artículo se trata de una republicación íntegra del artículo "Making a Game Boy game in 2017: A "Sheep It Up!" Post-Mortem" (https://www.gamasutra.com/blogs/DoctorLudos/20171207/311143/Making_a_Game_Boy_game_in_2017_A_quotSheep_It_Upquot_PostMortem_part_12.php) escrito por Doctor Ludos en Gamasutra (https://www.gamasutra.com).
Doctor Ludos es un diseñador de videojuegos indie/amateur y miembro de Ludoscience (http://www.ludoscience.com), un laboratorio de investigación científica dedicado al estudio de los videojuegos.
Todos tenemos sueños de pequeños y el mio era hacer un videojuego para mi primera videoconsola: la Game Boy de Nintendo. Hoy se ha cumplido mi sueño porque he publicado mi primer videojuego para Game Boy en un cartucho de verdad: 'Sheep It Up!' (https://catskullgames.com/sheep-it-up)
En este artículo hablaré de las herramientas que he utilizado y de algunos de los escollos que he tenido que superar como novato para conseguir que el proyecto se convirtiera en realidad.
'Sheep It Up!' (https://catskullgames.com/sheep-it-up) (algo así como "¡Oveja arriba!") es un juego arcade en el que una oveja tiene que ir ascendiendo colgándose a tiras de velcro voladoras. El concepto es simple, pero el juego no tarda en convertirse en todo un reto: ¿Hasta dónde puedes subir sin caerte?
Como coleccionista de videojuegos que soy, quería producir este videojuego sin sacrificar ninguno de los títulos antiguos de Game Boy, de ahí que todo el proceso haya sido diseñado específicamente para el videojuego: el pcb, la rom, el cartucho, la carcasa protectora y ¡hasta la pegatina! También intentamos que tuviera un precio razonable para que cualquier persona pueda disfrutar del juego: 15 dólares (+ gastos de envío). Funciona en cualquier modelo de Game Boy, desde el primer modelo hasta la GBA SP, incluyendo la Super Game Boy.
https://i.blogs.es/cfde29/sheepitup_cartoucheweb/450_1000.png
Si todavía tienes una Game Boy, puedes comprar un cartucho en la página web del fabricante (https://catskullgames.com/sheep-it-up).
Las herramientas
En los 90, crear un juego para una videoconsola de 8 bits era todo un desafío y hacía falta un equipo completo de profesionales cualificados. Para mí, los diseñadores, artistas y desarrolladores de la época eran auténticos héroes porque podían crear juegos tan maravillosos con las herramientas tan limitadas que tenían en comparación con todas las opciones que tenemos hoy en día para crear videojuegos.
En 2018 sigue costando mucho trabajo hacer un juego para una consola de 8 bits. Sin embargo, gracias a las geniales comunidades de creadores de videojuegos caseros y de emuladores, tenemos a nuestra disposición todo un arsenal de herramientas que nos hacen la vida mucho más fácil. Sin ellas, una persona con un hobby como el mio nunca podría crear un juego para la Game Boy por su cuenta. ¿Cuáles son esas herramientas?
Para empezar, el lenguaje de programación. En su día, todo el hardware de videojuegos se programaba con Assembly y todavía es posible usarlo (de hecho, es lo recomendado). Sin embargo, ya no es la única opción y hay muchos kits de desarrollo para videoconsolas de 8 y de 16 bits basados en lenguaje de programación C. Para la Game Boy, existe una herramienta genial que se llama Game Boy Developers Kit (http://gbdk.sourceforge.net/) (GBDK).
A la hora de hacer los gráficos y el diseño, ya no es necesario utilizar papel gráfico y un escáner de mano. Por suerte, ahora puedes usar otros dos softwares adicionales:
Game Boy Tile Designer (http://www.devrs.com/gb/hmgd/gbtd.html) (GBTD). Te permitirá dibujar objetos y teselas para después exportarlos a un formato binario para que la Game Boy lo pueda leer.
Game Boy Map Builder (http://www.devrs.com/gb/hmgd/gbmb.html) (GBMB). Este kit te permitirá crear niveles e imágenes de fondo utilizando las teselas dibujadas con GBTD (es como Tiled, pero para Game Boy).
https://i.blogs.es/038296/gbtd/450_1000.png
Finalmente, aunque no menos importante, necesitamos una forma de probar que nuestro videojuego funciona y ahí es donde la modernidad es clave. Mientras que en los 90 los desarrolladores tenían que usar cajas ICE muy caras, hoy podemos utilizar emuladores de software en cualquier ordenador.
Para probar nuestro juego, la mejor opción es BGB (http://bgb.bircd.org/). Se trata de un emulador para Game Boy muy preciso que viene con un detector de bugs muy potente ¡Es la herramienta que vas a necesitar para crear un videojuego que funcione!
https://i.blogs.es/fadc32/bgb/450_1000.jpg
El juego está en la esquina superior derecha y el resto de ventanas terroríficas son las herramientas para arreglar los bugs.
Pero para estar completamente seguro de que el juego funciona, tendrás que probarlo en hardware de verdad. En los 90, la gente grababa su programa en un chip EPROM y utilizaba cartuchos especiales para conectar el chip a una Game Boy real. Aunque era un proceso muy eficaz, llevaba mucho tiempo y era muy caro. Hoy tenemos lo que se conoce como "Flashcarts": cartuchos en los que puedes meter una tarjeta SD con tu juego en la ROM para jugar en una Game Boy de verdad.
La idea es la misma, pero las herramientas son más accesibles y más fáciles de usar. Existen varios tipo de Flashcarts para Game Boy, pero el mejor puede que sea el de Krikzz: el Everdrive Game Boy. (https://krikzz.com/store/) El pasado verano sacaron un nuevo modelo mejorado, pero yo utilicé la versión antigua que había comprado hace tiempo.
https://i.blogs.es/276825/12/450_1000.jpg
Un flashcart de los 90 vs. uno de nuestra década
A pesar de todas estas geniales herramientas que tenemos a nuestra disposición en 2018, crear un videojuego en la actualidad para una videoconsola de 1989 sigue siendo todo un reto, especialmente para aquellas personas que están acostumbradas a usar "herramientas modernas", como Unity, Unreal Engine o Godot.
A continuación voy a describir los principales retos a los que me enfrenté durante el desarrollo de 'Sheep It Up!', incluyendo aquellas cosas que me sorprendieron sobre el fucionamiento de un videojuego de Game Boy.
Límite de tamaño
Empecemos por lo obvio: 'Sheep It Up!' es un juego bastante simple, algo que se explica si tenemos en cuenta que todo el juego pesa solo 32KB. Así es: el código, las imágenes e incluso los sonidos caben todo en solamente 32KB. A modo de comparación, 32KB es el tamaño del logo de la Wikipedia en una resolución muy pequeña:
https://i.blogs.es/17ad48/34/450_1000.jpg
Por supuesto, no todos los videojuegos para la Game Boy caben en 32KB. Para mí, se trataba de una limitación técnica el poder hacer un juego en un cartucho real. De hecho, los mejores videojuegos para la Game Boy y los más famosos pesan mucho más:
Pokemon Rojo / Azul pesan 1024KB (¡Son enormes!)
Wario Land y La leyenda de Zelda: El despertar de Link pesan 512KB
Kirby Dream Land pesa 256KB
Gargoyle's Quest pesa 128KB
En realidad, hay pocos títulos para la Game Boy que tengan solo 32KB y la mayoría son de los primeros años de la consola. Por ejemplo, tanto Alleway (uno de los juegos que sirvió de lanzamiento de la consola en Japón) y Tetris (juego de lanzamiento en EE.UU. y Europa) tienen 32KB. Ambos son títulos excelentes, pero debido a la limitación de espacio de sus cartuchos son un tanto "limitados" en su alcance: una sola pantalla, pocos medios gráficos y de audio, etc.
https://i.blogs.es/68427e/tetris/450_1000.jpg
Alleyway y Tetris son juegos de 32KB, como Sheep It Up!
CPU: jugando con la potencia portátil
La Game Boy tiene una CPU de 4MHz diseñada especialmente para la consola (es una mezcla entre el procesador Z80 de Zilog y el 8080 de Intel). Con todo, el poder de procesamiento de la Game Boy es comparable al de la NES e incluso algo más potente gracias al reducido tamaño de su pantalla y a la falta de colores en la imagen (veremos más sobre esto después).
A pesar de contar con solo 4Mhz, todos los juegos de la Game Boy cuentan con una resolución de 60 fps constantes. ¡Toma esa PS4 Pro y Xbox One X!
Pero para un programador que acaba de terminar la universidad, el mayor reto será trabajar con un procesador de 8 bits. Como probablemente sabrás, todos los ordenadores utilizan 0 y 1 para procesar datos. Un solo dígito, que puede tener 0 o 1 como valor, se llama "bit" (abreviatura de "binary digit (dígito binario)", porque solamente puede tener dos valores diferentes). Un procesador es de 8 bits cuando puede procesar 8 bits de datos con una simple operación.
¿De qué manera influye a la hora de crear videojuegos?
Pues bien, cuanto menos "bits" pueda procesar la CPU, más limitadas serán las variables durante el juego. Por ejemplo, en los videojuegos utilizamos muchos números enteros para representar valores: vida, velocidad, puntuación, etc.
Con 8 bits de datos, un entero puede almacenar números más pequeños que una variable de 16 bits:
Variable entera de 8 bits: -127 a 128 (o 0 a 255 si no usa señal)
Variable entera de 16 bits: -32768 a 32767 (o 0 a 65535 si no usa señal)
Si todavía te suena demasiado a chino, pongamos un ejemplo directo de 'Sheet It Up!'
https://i.blogs.es/0e9873/sheepitup_score/450_1000.png
Como puedes ver en esta imagen, la variable de puntuación consta de 5 dígitos y puede tener un rango de 0 a 99999. Desafortunadamente, es mucho mayor de lo que una variable entera puede almacenar. De hecho, ¡Ni siquiera una variable entera de 16 bits es suficiente para almacenar una puntuación tan "grande"!
Así que para poder registrar la puntuación en 'Sheep It Up!' tuve que usar no una, sino cinco variables enteras de 8 bits diferentes. Te invito a "descubrir" lo divertido que fue manejar todas esas variables, especialmente cuando añadí la opción de guardar la mejor puntuación, lo que supone comparar dos valores almacenados entre 5 variables diferentes.
Programar en un sistema de 8 bits te obligará a pensar en soluciones complejas de este tipo todo el tiempo, mientras que los sistemas modernos simplemente utilizan variables de 32 o 64 bits que nunca suponen un problema para sus programadores.
(Nota: para aquellos desarrolladores de videojuegos más experimentados, sé que podía haber sido más eficiente utilizando un int8 entero para almacenar un solo dígito entre 0 y 9. Sin embargo, sí que necesitaba que cada variable pudiera estar entre 0 y 255 porque en realidad no se guarda el dígito de la puntuación de forma directa, sino la identificación de los píxeles utilizada para mostrar dicho número en la pantalla)
Un mundo, dos planos
Todas las imágenes que se ven en una Game Boy están compuestas por dos elementos: una capa de fondo (BKG) y varios objetos en movimiento, también conocidos como sprites (OBJ). Existe un límite de un máximo de 40 objetos en la pantalla con la limitación adicional de que la Game Boy no puede mostrar más de 10 objetos en la misma línea.
https://i.blogs.es/6c10ae/sheepitup_planes/450_1000.gif
En realidad, es un poco más complejo porque hay una capa adicional de "ventana" que puede deslizarse de forma diferente del fondo. Normalmente se utiliza para crear la interfaz de usuario (puntuación, etc.). Sin embargo, esta capa es "no-transparente": esconderá cualquier tipo de datos gráficos en la capa de fondo que tiene detrás, por lo que, para simplificar, puedes pensar que existe una sola capa de "fondo" en una Game Boy pero que puede hacer que una parte se mueva de forma independiente si lo necesitas.
¡La Game Boy ve 4 colores!
Hablemos del problema más evidente: el modelo original de la Game Boy solo puede reproducir cuatro colores.
https://i.blogs.es/c3f2f7/sheepitup_colors-1-/450_1000.png
Se puede discutir que no se trata realmente de gris claro y gris oscuro, sino más bien verde claro y verde oscuro, pero da lo mismo: solamente puedes usar 4 colores para hacer los dibujos. Por lo menos cuando hablamos del fondo, ¡porque para los objetos es diferente!
https://i.blogs.es/2ad0d5/sheepitup_sprite1/450_1000.png
De hecho, como puedes ver en la imagen, la oveja ha sido dibujada con solo tres colores. ¿Por qué? De hecho, dibujé el objeto en 4 colores, pero el cuarto color (el negro) simplemente no se ve porque la Game Boy lo procesa como "color transparente". De esta forma, los objetos no son "imágenes cuadradas", sino que pueden tomar muchas formas haciendo que podamos ver la imagen de fondo que tienen detrás.
https://i.blogs.es/e6e020/sheepitup_sprite2/450_1000.png
¿Significa que no puedo usar el negro para dibujar objetos?
Por supuesto que no, tal y como puedes ver en el objeto de la línea de "velcro". Para este objeto, utilicé una paleta de colores diferente de 3+1: el "blanco" como color transparente y el "negro" para el objeto.
https://i.blogs.es/0255b1/sheepitup_sprite3/450_1000.png
Las paletas de colores pueden ser divertidas
Aunque solo pueda usar 4 colores, la Game Boy utiliza 3 paletas de colores diferentes para mostrar imágenes ¡Y es genial!
https://i.blogs.es/1ecd1f/sheepitup_palettes/450_1000.png
Como puedes ver, hay una paleta individual de "4 colores" para la capa de fondo y dos "paletas de "3 colores + 1 color transparente" para los objetos (cada objeto puede usar una u otra paleta de colores). Lo bueno de estas paletas de colores es que puedes asignar libremente cualquier color que quieras en cualquiera de las paletas. Esto te permite crear efectos resultones como el efecto de enfocado/desenfocado que hay en muchos videojuegos.
https://i.blogs.es/f77285/sheepitup_fade_anim2/450_1000.gif
Para crear un efecto de enfoque en una Game Boy, simplemente necesitas modificar los colores en las tres paletas de colores. En el primer paso, todos los huecos de las paletas están en blanco. Después, se pone gris claro el espacio para el color más oscuro (negro) para revelar la imagen de forma progresiva. En el tercer paso, el gris claro pasa a ser gris oscuro, etc. Así hasta que se vean los cuatro colores en cada paleta de colores.
Con un método similar, podemos hacer que un caracter "parpadee" cambiando los colores de su paleta en cada fotograma. Por ejemplo, es algo que se utiliza en Super Mario Land cada vez que Mario se hace con una estrella y se vuelve invencible.
¡El mundo en mosaicos!
Hay una última cosa a tener en cuenta en el modo en el que la Game Boy representa las imágenes, o por lo menos para un desarrollador de videojuegos acostumbrado a las últimas tecnologías. Dado que la consola no tiene un "búfer de fotogramas" no puedes especificar el color de cada píxel en la pantalla de forma individual. De hecho, todas las imágenes en la pantalla son un conjunto de "teselas", es decir, cuadrados de píxeles de 8x8. Esto se aplica tanto al fondo como a los objetos:
https://i.blogs.es/fe784f/sheepitup_tiles1/450_1000.png
Esta técnica, diseñada para reducir la cantidad de RAM de vídeo necesaria para mostrar imágenes, implica que no puedes dibujar líneas a mano alzada en la pantalla de la Game Boy. Pero también es uno de los secretos que hace que la Game Boy sea capaz de representar videojuegos tan bonitos con una CPU de solo 4Mhz y solo 8KB de RAM de vídeo (has leído bien, he escrito kilobytes y no megabytes o gigabytes).
Sin embargo, uno de los inconvenientes de esta pantalla a modo de mosaico es que nuestros objetos "oveja" y "velcro" en realidad están compuestos por más de un objeto. La oveja tiene 16x16 píxeles, por lo que en teoría necesitaría cuatro objetos de 8x8 para crearla. Por suerte la Game Boy también cuenta con un modo de representación de 8x16, lo que significa que en realidad cada objeto en 'Sheep It Up!' solamente está compuesto por dos objetos en vez de cuatro.
https://i.blogs.es/5fe231/sheepitup_tiles2/450_1000.png
¿Recuerdas que teníamos un límite de 40 objetos en pantalla con el limite adicional de que la Game Boy no puede mostrar más de 10 objetos en la misma línea?
En este caso, significa que no podemos tener más de 5 ovejas juntas en la misma línea, en vez de las 10 que podrías haber pensado en un principio (porque la oveja se compone de 2 objetos desde el punto de vista de hardware).
Puntos a pantalla completa
No lo había mencionado aún, pero la resolución de la pantalla de la Game Boy es de 160x144 píxeles, lo que significa que necesitas 20x18 = 360 teselas para cubrir toda la pantalla.
https://i.blogs.es/9d397e/sheepitup_titletiles1/450_1000.png
Desafortunadamente, la RAM de vídeo de la Game Boy es limitada (8KB) y solo puede almacenar 256 teselas diferentes. Esto significa que, si no utilizamos ningún truco en el código, no puedes mostrar ninguna imagen a pantalla completa:
https://i.blogs.es/140207/sheepitup_titletiles2/450_1000.png
El secreto está en reutilizar teselas. Tal y como puedes ver, la imagen de teselas tiene mucho "espacio vacío", lo que significa que una sola "tesela blanca" en RAM está varias veces en la imagen. En realidad, la imagen de la pantalla en forma de mosaico solamente utiliza 178 teselas diferentes, lo que significa que todavía queda espacio para algunos detalles extra si fuera necesario.
https://i.blogs.es/15ce5a/sheepitup_rawtitletiles/450_1000.png
No sé qué método utilizaban para reutilizar teselas en los 90, pero hoy existe una herramienta muy buena que se llama Game Boy Tile Data Generator (http://www.chrisantonellis.com/gameboy/gbtdg/). Le pones una imagen PNG (en 4 colores) y generará automáticamente por ti las teselas y el mapa de teselas necesarios para representarlos en una Game Boy. Obviamente, también detectará de forma automática y reutilizará las teselas que sean idénticas para salvar tanta RAM de vídeo como sea posible en la consola.
https://i.blogs.es/5146d4/gbtdg/450_1000.png
A modo de información, la mayoría de las consolas de los 80 y los 90 funcionaban de forma similar con una pantalla basada en teselas de 8x8: Nes, Master System, PC-Engine, Super Nintendo, Genesis, Game Boy, Game Gear...Las primeras videoconsolas a nivel mainstream que tuvieron un búfer de fotogramas fueron la PlayStation y la Saturn, mientras que la primera consola de Nintendo que lo consiguió fue la Game Boy Advance (la Lynx de Atari fue la primera consola de mano con píxeles individuales).
¡Por eso aprender a "programar con teselas" en la Game Boy es una habilidad transferible si después quieres hacer proyectos en otra videoconsola retro!
Consejos de los profesionales: ¡Hacer objetos de 4 colores!
Finalicemos con un pequeño consejo de los grandes desarrolladores de Nintendo. Echa un vistazo a esta captura de pantalla de Wario Land:
https://i.blogs.es/6b4104/warioland_coin/450_1000.png
¿Puedes ver que la moneda, un objeto, ha sido dibujada con 4 colores? ¿Cómo pudieron hacerlo si te he dicho que la Game Boy solamente puede mostrar 3 colores por objeto?
https://i.blogs.es/ef204e/warioland_coin/450_1000.gif
La respuesta es sencilla: cada moneda está hecha de 2 objetos y cada objeto utiliza una paleta de colores diferente. Como puedes ver, si dividimos la moneda en dos mitades, está compuesta de dos objetos de 8x16. Como siempre pasa con Nintendo, se presta mucha atención a los detalles: no es que simplemente juntarán dos "mitades de objetos", sino que las dibujaron con las teselas e hicieron que se sobrepusieran en 1 píxel ¡Para que la moneda tuviera más aspecto de ser un único elemento!
Restricciones de sonido
Como vimos anteriormente, la Game Boy cuenta con limitaciones obvias en cuanto a la potencia de la CPU y en el apartado gráfico. Pero lo mismo se puede decir del audio. De hecho, a diferencia de los dispositivos modernos, la Game Boy no puede reproducir MP3 o leer archivos WAV. Para crear sonidos y música en una Game Boy tienes que crearlos de forma dinámica usando los 4 "canales de audio" que tiene la consola, cada uno con una función diferente:
Canal 1: Nota y barrido puede reproducir un sonido (una nota) subiendo o bajando un tono.
Canal 2: Nota puede reproducir una nota sin ningún efecto especial.
Canal 3: Forma de onda puede reproducir formas de ondas muy sencillas (codificadas en 4bits).
Canal 4: Ruido puede generar sonido de explosión o de motor.
Voy a repetirlo: para crear un sonido con una Game Boy tienes que generarlo de forma manual controlando de forma directa estos 4 canales de sonido. Por suerte, es algo bastante sencillo: simplemente tienes que modificar los valores de algunos de los registros del hardware. Cada canal de sonido está controlado por 4 o 5 registros de hardware (variables de 8bits) que definen el volumen, el tono, los efectos especiales, etc.
Configurando diferentes valores en los registros que controlan un canal, puedes hacer que la Game Boy reproduzca una gran variedad de sonidos. Por ejemplo, aquí os dejo tres sonido de Sheep It Up! que he creado utilizando el canal de sonido 1, así como los valores de registros utilizados para generarlos:
Salto
NR10_REG = 0x15;
NR11_REG = 0x96;
NR12_REG = 0x73;
NR13_REG = 0xBB;
NR14_REG = 0x85;
Caída al suelo
NR10_REG = 0x79;
NR11_REG = 0x8D;
NR12_REG = 0x63;
NR13_REG = 0xC8;
NR14_REG = 0x80;
Cayendo (game over)
NR10_REG = 0x4F;
NR11_REG = 0x96;
NR12_REG = 0xB7;
NR13_REG = 0xBB;
NR14_REG = 0x85;
Como puedes ver, establecer diferentes valores para cinco variables te permite producir efectos de sonido muy diferentes. Uno podría imaginarse que, para crear sonidos, puedes optar por ir probando hasta dar con el sonido que quieres: pones valores aleatorios a los registros hasta que encuentres un sonido que te guste. Pero eso sería demasiado complicado y no tendría mucho sentido. Así que, por suerte, las herramientas actuales nos hacen la vida más fácil. En este caso, tengo que hablar de GB Sound Sample Generator (https://github.com/Zal0/GBSoundDemo).
https://i.blogs.es/5a80be/sfx_1/450_1000.jpg
Primero configuras unos parámetros bastante sencillos hasta encontrar un sonido que te guste (dale a START para reproducir el sonido actual)
Se trata de un programa de Game Boy que se ejecuta en hardware real y que te permite modificar los valores de los registros del hardware de sonido de una forma muy intuitiva. En vez de establecer el valor bruto de "NR10_REG", lo que harás será definir una frecuencia de sonido, un nivel de volumen, un tiempo de barrido, etc. Puedes ver este herramienta como un SFXR (https://www.drpetter.se/project_sfxr.html) para la Game Boy. Pero si quieres exportar tu sonido, en vez de guardarlo en un archivo WAV, GB Sound Sample generator (https://github.com/Zal0/GBSoundDemo) te mostrará los valores de registro de hardware correspondientes. Así que para reproducir un sonido en tu videojuego, simplemente tienes que introducir estos valores en tu código fuente.
https://i.blogs.es/27ed73/sfx_2/450_1000.jpg
A continuación solo tienes que mantener pulsado A+SELECT para visualizar los valores de registro brutos del hardware
Para Sheep It Up!, utilicé GB Sound Sample generator (https://github.com/Zal0/GBSoundDemo) en una Game Boy Advance SP (la pantalla retroiluminada es más fácil de leer), ejecutando la ROM en un Everdrive GB (https://krikzz.com/store/). Me pasé bastante tiempo retocando los parámetros directamente en la consola y cuando encontré una buena combinación pude copiar fácilmente los valores de la pantalla de la Game Boy al código fuente en mi ordenador.
https://i.blogs.es/b14867/sfx_3/450_1000.jpg
Para reproducir este sonido en tu juego, simplemente necesitas copiar los valores de registro de hardware en tu código fuente
A pesar de las limitaciones de audio, la Game Boy se utiliza a día de hoy como instrumento musical. En la escena del chiptune existen muchos artistas con talento que crean cortes estimulantes con una Game Boy utilizando programas como LSDJ (http://littlesounddj.com/lsd/index.php) o Nanoloop (https://www.nanoloop.com/). Por ejemplo, puede que hayas oído hablar de la leyenda irlandesa del chiptune Chipzel (http://chipzel.co.uk/) que compuso música para Super Hexagon (https://www.youtube.com/watch?v=5mDjFdetU28) o del artista francés Sidabitball (https://www.sidabitball.com/) que remezcló muchos éxitos de música pop de los 90 (https://www.youtube.com/watch?v=JAbMn3GMwFA).
https://i.blogs.es/e32d0f/chipzel-sidabitball/450_1000.png
Chipzel (izquierda) y Sidabitball
Por desgracia para los desarrolladores de videojuegos, LSDJ (http://littlesounddj.com/lsd/index.php), la herramienta utilizada para componer estas canciones innovadoras, utiliza casi el 100% de los recursos de hardware de la Game Boy. Esto significa que puedes crear música con la consola, pero no puedes ejecutar un juego mientras reproduces dicha música. Por suerte, existen alternativas que consumen menos recursos para crear y reproducir música en la Game Boy.
1) Reproductor de música personalizado
La solución más fácil es hacer tu propio "reproductor de música". Recuerda que la única manera de crear sonidos en la Game Boy es establecer los valores de los registros del hardware que controlan los 4 canales de generación de sonido. De ahí que puedas crear de forma sencilla tu propio "reproductor de música" almacenando "notas" en una matriz.
Cada "nota" es una combinación única de valores para cada registro del hardware. Si a continuación defines el ritmo de la matriz para reproducir dichas notas, puedes tener una forma muy sencilla de crear música y así fue como lo hice en el caso de Sheep It Up!. Aquí os dejo un pequeño vídeo del juego con sonido y música para que podáis escuchar el resultado:
Para ser más específico, mis "notas" solamente se reproducen en el canal de sonido 2. De hecho, los cuatro canales de sonido se utilizan tanto para efectos de sonido como para música. Así que si estás reproduciendo una nota en un canal, no puedes utilizarlo para reproducir un efecto de sonido al mismo tiempo.
Puesto que cada canal es más bien "específico", a veces puede ser preferible utilizar algunos canales solo para música, mientras que es mejor reservar otros canales para los efectos de sonido. Por ejemplo, el sonido "plip" que escuchas cada vez que la oveja se agarra a una cinta de velcro voladora se reproduce en el canal 4 (ruido). Como se trata de un sonido muy común en mi videojuego, decidí evitar utilizar este canal para música. Lo mismo vale para el canal 1 porque lo utilicé para el resto de efectos de sonido. Puesto que mis capacidades musicales son bastante limitadas, decidí no utilizar las formas de onda del canal 3 y en su lugar me centré en los tonos del canal 2.
2) GBT Player y Carillon Player
Muchos videojuegos caseros utilizan la opción del "reproductor de música personalizado". Por suerte, no es la única opción disponible. Existe una librería de datos que se llama GBT Player (https://github.com/AntonioND/gbt-player) que puede convertir los módulos de música (en formato Impulse Tracker ".it") para después reproducirlos en una Game Boy. Por supuesto existen muchas limitaciones en cuanto al tamaño de los samples, el número de canales y los efectos de tono que puedes usar. Pero sin embargo te permite componer música real en un tracker real, como OpenMPT (https://openmpt.org/), y después reproducirla en la Game Boy.
La guinda del pastel es que esta librería solamente consume un 7-8% de los recursos de la CPU de la Game Boy, lo que deja mucha potencia de procesador para ejecutar el resto del programa. Además, es muy sencillo de integrarlo con tu código, ya sea si decides programar tu juego en C con GBDK o montarlo con RGBDS. Carillon Player (http://www.pouet.net/prod.php?which=17337) es una buena alternativa al GBT Player, aunque tendrás que usar el Carillon Editor para componer música en vez de tu tracker musical favorito.
Geometrix es un videojuego casero hecho por AntonioND, el creador de GBT Player. La música utiliza esta librería de datos.
Vayamos a la parte física: meter el juego en un cartucho
Después de mucho trabajo con el código, los gráficos y el audio, el juego por fin estaba completo. Sin embargo, a estas alturas lo único que tenía era un archivo ROM. Por supuesto podía (y así lo hice) probarlo en muchas de mis Game boys que tengo en mi colección (en todas menos en la AGS-101), pero para mí el proyecto no estaba completo porque el videojuego tenía que tener su propio cartucho personalizado para poder considerarlo como "acabado".
Como mencioné al inicio, la ROM de 'Sheep It Up!' pesa solo 32KB, al igual que algunos de los primeros títulos para la Game Boy como 'Tetris' o 'Alleway'. Sin embargo, la mayoría de los juegos para Game Boy son mucho más grandes y van desde los 128KB hasta los 512KB, siendo los 'Pokémon Azul' y 'Pokémon Rojo' los más grandes con sus gigantescos 1024KB (1MB). En los 90, cuanto más grande era el juego, más costaba fabricar los cartuchos porque tenías que utilizar chips más caro para almacenar juegos tan grandes. Pero a día de hoy, casi todos cuestan lo mismo. Entonces, ¿por qué me puse el límite de 32KB?
La respuesta es que quería ser capaz de sacar el juego en un cartucho nuevo. Como te podrás imaginar, Nintendo hace mucho tiempo que dejó de fabricar cartuchos para la Game Boy (ejem, quiero decir Game Paks). Así que existen dos soluciones alternativas para crear tu propio videojuego en cartucho a día de hoy:
1) Cartmodding
La primera opción se denomina "cartmodding" y consiste en reciclar juegos antiguos de la Game Boy. Los juegos que salieron al mercado durante la era comercial de la Game Boy eran cartuchos que no se podían reescribir, por lo que para cambiar el juego almacenado en el cartucho tienes que abrirlo, desoldar el chip de memoria y cambiarlo por otro chip de memoria en el que has guardado tu propio archivo ROM. Esta solución te permite crear juegos de cualquier tamaño. Sin embargo, como coleccionador de juegos que soy, no quería destrozar ningún juego para la Game Boy para fabricar el mio.
https://i.blogs.es/6d76a7/cartmodding/450_1000.jpg
Un ejemplo de cartmodding. Un nuevo chip de memoria que contiene un videojuego casero ha sido soldado dentro de un cartucho viejo.
2) Cartucho personalizado
Así que la segunda opción es fabricar un nuevo cartucho desde cero. Como no sé nada de electrónica, empecé a buscar gente en Internet que fuera capaz de construir cartuchos para la Game Boy. Tras varios intentos fallidos, tuve la suerte de contactar con Catskull. Se trata de todo un manitas de la electrónica que construye y vende mucho hardware relacionado con la Game Boy en su tienda Catskull Electronics (https://catskullelectronics.com/).
Entre otras muchas cosas, ha diseñado un dispositivo para conectar la Game Boy a una interfaz MIDI, lo que le permite a los músicos usar la Game Boy con instrumentos y sintetizadores de verdad. También ha diseñado su propio cartucho para la Game Boy donde todo ha sido creado a partir de cero: la PCB, los chips, las carcasas e incluso las pegatinas (nada ha sido reciclado a partir de juegos viejos). Esta era la solución perfecta para mí.
https://i.blogs.es/1fcdcb/catskull_pcb_lq/450_1000.jpg
El cartucho original PCB diseñado por Catskull y utilizado para 'Sheep It Up!'
Pero es todavía mejor: tras un par de correos electrónicos, Catskull me dijo que llevaba tiempo queriendo publicar juegos caseros bajo su propia compañía y que mi juego era la oportunidad perfecta para ser el primer título. Así que nos pusimos a trabajar juntos: yo hago el software y el hace el hardware. La única pega para esta opción es que el cartucho para la Game Boy de Catskull solamente puede almacenar un juego de 32KB. ¿Por qué?
Originalmente, la Game Boy estaba diseñada para poder tener acceso a solamente 32KB de datos ROM. Para poder tener juegos con más de 32KB de datos, necesitas "navegar" por todos los datos del cartucho accediendo cada vez solamente a un apartado de todos los datos ROM. A este método se le conoce como "Bank Switching": todos los datos de ROM están segmentados en bancos de 16KB y puedes intercambiarlos cada vez que quieras (con algunas limitaciones). Sin embargo, para poder hacer bank switching el cartucho tiene que tener un chip adicional: el "Memory Bank Controller" (MBC).
Existen varios chips (MBC1, MBC5, etc.) que permiten mayores tamaños de ROM, RAM a base de baterías para guardar el juego, etc. Desafortunadamente, de momento no existe una solución real para producir nuevos cartuchos desde cero con un chip de dichas características.
Así que la gente que está haciendo videojuegos caseros que pesan más de 32KB normalmente tiran de "cartmodding" para poder reutilizar el chip MBC de los cartuchos de videojuegos antiguos que "reciclan". Otra solución es comprar copias ilegales de juegos de la Game Boy y reutilizarlos. De hecho, los fabricantes chinos hace años que han conseguido "clonar" el chip MBC para poder producir copias piratas de juegos grandes como 'Pokémon'.
Además, estos cartuchos piratas utilizan chips EEPROM en vez de los chips ROM de los juegos antiguos y normalmente no se pueden "reutilizar" y modificar el juego que llevan. Para ello tendrías que utilizar un intercambiador de cartuchos como el BennVenn's Joey (https://bennvenn.myshopify.com/products/reader-writer-gen2). Existen varios videojuegos caseros que pesan más de 32KB y que han salido utilizando esta opción.
https://i.blogs.es/09c53a/chinese2/450_1000.png
Un cartucho pirata hecho en China. Este cartucho se puede reutilizar, pero otros no
En el caso de 'Sheep It Up!', quería producir cartuchos 100% originales para evitar destruir juegos originales de la Game Boy. Tuve mucha suerte al encontrar un socio como Catskull que fabrica sus propios cartuchos, aunque tuviera que limitarme a 32KB de tamaño total.
¿Y cómo se hacen los cartuchos "personalizados"? Le pedí a Catskull que hiciera fotos de los diferentes pasos a seguir para montar sus propios cartuchos. Como veréis, cada cartucho se monta a mano.
1) Se pone la PCB en una placa.
https://i.blogs.es/6fa916/catskull_assembly_2/450_1000.jpg
2) Se pone una plantilla de acero inoxidable sobre la PCB para poder poner la pasta de soldadura.
https://i.blogs.es/5b83b3/catskull_assembly_1/450_1000.jpg
3) Normalmente hago lotes de 18-20 tarjetas a la vez y aplico la pasta de soldadura a todo el lote.
https://i.blogs.es/944541/catskull_assembly_3/450_1000.jpg
4) Ahora toca colocar de forma manual los condensadores y las resistencias sobre las tarjetas. Después pongo los chips de memoria flash en cada tarjeta.
https://i.blogs.es/837c00/catskull_assembly_4/450_1000.jpg
5) Se ponen las tarjetas en una placa de horno para hacer el reflujo. Literalmente, tenemos que "hornear" cada tarjeta para soldar cada chip a las tarjetas. Después puedo coger cada PCB y poner la ROM del juego en el chip de memoria.
https://i.blogs.es/a1ecd4/catskull_assembly_5/450_1000.jpg
6) Después se pone la PCB en una carcasa de cartucho con una etiqueta preciosa hecha por una imprenta profesional.
https://i.blogs.es/7d245b/sheepitup_cartoucheweb/450_1000.png
7) Después de probarlo todo de forma minuciosa para comprobar que el cartucho funciona a la perfección en el hardware real, ¡el juego está listo y se puede enviar al jugador que lo haya pedido!
Después de toda esta información técnica, me gustaría dar una opinión más personal sobre lo que este proyecto ha significado para mí. Para poner las cosas en contexto, la charla que más me ha inspirado de todas las que he visto es "Cómo conseguir de verdad que tus sueños de la infancia se cumplan" (https://www.youtube.com/watch?v=ji5_MqicxSo) de Randy Pausch. Realmente la recomiendo. Se trata de una lección brillante sobre cómo ver la vida desde un punto de vista maravilloso, incluso en los días más oscuros. Para tener una vida que tenga sentido, Randy Pausch nos invita a intentar conseguir aquellos sueños que teníamos cuando éramos pequeños y a ayudar a los demás a que cumplan sus sueños.
Entre los primeros sueños de mi lista estaba "crear un videojuego para la Game Boy de Nintendo". La Game Boy fue mi primera videoconsola y siempre tendrá un lugar especial en mi corazón. Durante años estuve diciéndome a mí mismo que algún día haría un videojuego, pero siempre tenía "cosas más importantes que hacer" como trabajar en proyectos con los que ganar dinero para poder pagar el alquiler. Hasta que un día me encontré por casualidad con la página de BitBitJam (http://bitbitjam.com/), una comunidad de talleres para la creación de videojuegos en consolas retro. Ahí fue cuando recordé las palabras del sabio Randy Pausch: ¿Qué pasaría si, por una vez, intentara trabajar en algo con la única misión de cumplir uno de los sueños de mi infancia?
Así que un mes antes de que empezaran los talleres decidí informarme sobre el tipo de herramientas que existen para crear juegos para la Game Boy. Durante los talleres me pasé una semana entera (estaba de vacaciones) para crear un prototipo de 'Sheep It Up!'. Después de los talleres, seguí trabajando en el juego, puliéndolo, refinándolo, optimizándolo, redibujándolo... hasta que estuve satisfecho con el resultado. Mientras tanto también me puse a mirar cómo hacer cartuchos para el juego y fue cuando tuve la suerte de encontrarme con Catskull, alguien que podía hacerlo y que tenía el gusanillo de crear una empresa de publicación de videojuegos caseros.
Recuerda que mi objetivo real no era publicar un videojuego, sino cumplir uno de los sueños de mi infancia y en mi sueño, podía jugar el cartucho de videojuego que había creado en mi Game Boy
Como puedes ver, la videoconsola que tenía de pequeño está para el arrastre: ya no se muestran varias columnas de píxeles, los botones están desgastados y hay un rayonazo vertical en la pantalla. Pero todavía funciona. No puedo poner en palabras lo que se siente al jugar un videojuego que TÚ has creado en la mismísima consola con la que pasaste tanto tiempo jugando de niño. Lo único que puedo decir es que, en este preciso momento, mi yo de 9 años está muy orgulloso de la persona en la que se ha convertido de adulto y solamente eso es lo mejor que me podía haber pasado tras realizar este proyecto.
https://i.blogs.es/9e7d89/mygb_1_lq/450_1000.jpg
Sigue funcionando 25 años después y puede ejecutar un juego fabricado en 2017
Compartiendo el sueño: el feedback de los jugadores
Es genial poder crear un videojuego que te va a gustar, pero es mucho mejor si otras personas también pueden disfrutarlo. Cuando terminé el proyecto, sabía que 'Sheep It Up!' era un juego sencillo, así que no tenía muchas expectativas al respecto. Sin embargo, los comentarios que he recibido me han sorprendido gratamente.
De hecho, a pesar de (o gracias a) la simplicidad del juego, a los que lo han probado realmente les ha gustado. La jugabilidad es lo bastante sencilla como para aprender a jugar en cuestión de segundos, pero no tarda en engancharte para que quieras echar "otra partida" e intentar superar tu mejor puntuación. Por cierto, ¡mi mejor puntuación hasta el momento es de 147 puntos! Pero lo que más me gusta de la comunidad de videojuegos retro es la pasión detrás de la mayoría de los jugadores y es algo que puede traer sorpresas muy gratas.
Para empezar, muchas personas se quejaron de que el juego no venía en "una caja". Yo colecciono los videojuegos en cartuchos sin sus respectivas cajas (por cuestiones de dinero y de espacio) por lo que no se me pasó por la cabeza una versión con una caja. Pero después me di cuenta de que hubiera sido una buena idea ofrecerle a la gente lo que quiere y uno de los fans del juego, Cyph, fue más allá y se hizo su propia caja para el juego reutilizando una caja de un juego de la Nintendo DS.
No sé a ti, pero a mí el resultado me parece genial. Para aquellos a los que le interese, puedes hacer tu propia caja en casa. Simplemente necesitas una caja de un juego de la Nintendo DS, quitar dos pequeñas piezas de plástico que hay dentro y poner esta preciosa carátula diseñada por Cyph (https://www.kromeheaven.com/sheepitupcover/SheepItUpCoverByCyph.png).
https://i.blogs.es/aad959/box_cyph/450_1000.jpg
Una preciosa caja personalizada para 'Sheep It Up!' creada por Cyph, un fan del juego, con una caja de Nintendo DS
Otra curiosidad sobre el juego es que fue presentado durante una de las mayores convenciones de videojuegos del mundo: la Paris Game Week (300.000 visitantes, más que E3 o la Tokyo Game Show). ¿Cómo acabó un videojuego casero para la Game Boy en el mismo evento que los últimos videojuegos AAA de la industria? En este caso se lo tengo que agradecer a OrdiRetro (https://www.ordiretro.fr/), una asociación francesa dedicada a la historia de los videojuegos y más específicamente a los nuevos videojuegos sacados para consolas y ordenadores antiguos.
Esta asociación tenía un puesto en el evento para mostrar una selección de videojuegos y gracias a mi amigo Julián Álvarez (http://www.ludoscience.com/EN/6-Julian-Alvarez.html) se enteraron de que el juego existía y me propusieron presentarlo durante el evento.
https://i.blogs.es/0f4b3c/parisgameweek/450_1000.jpg
'Sheep It Up!' en una Super Game Boy durante la Paris Game Week 2017 ¡Gracias OrdiRetro!
Pero algo así también puede pasarte sin que conozcas a alguien en concreto. Justo después de que saliera el videojuego lo compraron dos entusiastas de la Game Boy alemanes que llevan la página web DMGpage (https://dmgpage.com/2017/11/04/das-war-die-1-retro-boerse-hofheim-04-11-2017/). Pero no solamente lo compraron, sino que también lo presentaron durante una convención de videojuegos retro: la Retro-Börde en Hessen, Alemania. Así que varias personas pudieron jugar al juego en una Super Game Boy en una convención de videojuegos en Alemania gracias a dos fans de la Game Boy. Es algo de lo que también estoy muy agradecido.
https://i.blogs.es/647e47/retroborse/450_1000.jpg
'Sheep It Up!' presentado en una Super Game Boy durante la Retro-Börse en Hessen. ¡Gracias DMGpage!
Cuando haces un videojuego casero para una videoconsola retro no lo haces por el dinero o por la fama. Se fabrican muy pocas copias de estos juegos y normalmente solo lo van a comprar un par de decenas de personas o como mucho cientos de personas si el juego es muy bueno. De lo que sí puedes estar seguro es de que las personas que lo compren realmente se interesarán por el videojuego y de que son tan apasionadas de los videojuegos retro como tú (o incluso más). Así que, si te ha gustado este artículo sobre cómo crear un juego para la Game Boy en la actualidad, ¿por qué no pruebas a hacer uno por tí mismo?
Como puedes ver hay muchas herramientas sencillas para crear un videojuego para la consola de mano más mítica de la historia. No te harás rico haciendo un videojuego para la Game Boy, pero te divertirás mucho creándolo y puede que también puedas hacer que otros pasen un buen rato jugando con tu juego.
Así que espero que te haya gustado este análisis y que te entren ganas de probar el mundo del desarrollo de videojuegos retro. Mientras tanto, si todavía tienes una Game Boy por casa, no te olvides de que puedes adquirir un precioso cartucho de Sheep It Up por solo 15 dólares (http://catskullgames.com/sheep-it-up) en la página web de Catskull games ¡Cada cartucho se ensambla a mano antes de su envío!
Este artículo se trata de una republicación íntegra del artículo "Making a Game Boy game in 2017: A "Sheep It Up!" Post-Mortem" (https://www.gamasutra.com/blogs/DoctorLudos/20171207/311143/Making_a_Game_Boy_game_in_2017_A_quotSheep_It_Upquot_PostMortem_part_12.php) escrito por Doctor Ludos en Gamasutra (https://www.gamasutra.com).
Doctor Ludos es un diseñador de videojuegos indie/amateur y miembro de Ludoscience (http://www.ludoscience.com), un laboratorio de investigación científica dedicado al estudio de los videojuegos.