Ifcaro’s Tetris versión Web

Como hace mucho tiempo que no actualizo la página y parece que no estoy haciendo nada (la verdad es que no estoy haciendo gran cosa en tema de proyectos personales) he pensado voy a coger el código fuente del tetris que hice en 2008 y lo voy a compilar con emscripten para hacer una versión web.

Primer problema, parece que no tengo guardado el código fuente original en ningún sitio así que me pongo a buscar como loco restos del desarrollo. Pensaba que estaba construido como el código del iRPGM que se podía compilar tanto para pc como para ps3 y que estaría guardado en la misma carpeta pero ni rastro.

Cuando ya iba a abandonar el proyecto encuentro en una carpeta con desarrollos de ps3 un código fuente del tetris de ps2 que había sido ligeramente modificado en un intento de hacerlo compilar para la ps3. Solamente tenía el código de la lógica del juego. Si quería hacer un port tendría que reescribir toda la parte de graficos, sonido e input.

Después de pensar un poco si me merecía la pena todo ese trabajo decido ponerme a ello. Me descargo la última versión de SDL y me dispongo a crear un proyecto de Visual Studio con un código base para una aplicación SDL para Windows. Cuando ya funciona el código de ejemplo comienzo a portar el código que recuperé del tetris original y a reescribir las partes que faltan utilizando SDL.

Una vez tengo una versión básica del dibujado y el input necesito recopilar los recursos (imágenes y sonidos) y al igual que perdí el código fuente original tampoco tengo los assets. Decido ‘hackear’ la versión de PC para extraer la imagen de fondo y descubro que esta no fue hecha en C sino en BlitzBasic (en aquella época yo aún no sabía C jaja). Después de intentar varios métodos al final consigo extraer el png original de la imagen de fondo. Los sonidos los extraigo de la versión de PS2 y la fuente la rehago utilizando un generador de fuentes para BMFont. Con esto ya tengo todo lo que necesito para completar la versión de tetris en SDL.

Mientras pruebo el funcionamiento observo que la jugabilidad no es que sea muy buena de modo que decido intentar mejorarla un poco antes de pasar a construir la versión web con emscripten.

Finalmente comienzo con el proyecto inicial que era compilar una versión wasm del tetris mediante el compilador emscripten. Es cierto que la primera vez que compile el proyecto no tenía aun soporte para sonido, eso lo deje para lo último. Indicando al compilador em++ que tiene que utilizar SDL me compila una versión que funciona regular. Esto se debe a que el juego tiene algunos bucles a la hora de esperar respuesta del usuario y eso es incompatible con la forma de funcionar de emscripten así que hago algunos arreglillos para eliminar estos bucles y reemplazarlos por una funcionalidad similar.

A la hora de meter los efectos de sonido me decido por la librería SDL_mixer que se supone que te facilita la vida para estas tareas. En la versión PC todo fue bien, pero a la hora de compilar con emscripten no hay manera de que compile en Windows así que me toca abrirme una máquina virtual con Linux para compilar el SDL_mixer. Además, para no subir un mp3 a la web decido utilizar un formato tipo ‘tracker’ que en PC no me supone ningún problema, pero no para la versión web como descubrí después.

Perdí bastante tiempo intentando compilar una versión de SDL_mixer con soporte para trackers y cuando al final lo consigo resulta que los sonidos se oyen bien pero la música en formato tracker se oye fatal (por eso supongo que venía deshabilitado por defecto) así que decido buscar por internet alguna librería en javascript para reproducir este formato de música. Utilizando una clase wrapper en javascript para comunicar el programa en C con la librería externa consigo al fin reproducir música con éxito.

Con esto doy por finalizada la versión web del tetris aunque aún se podrían mejorar muchas cosas.