lunes, 25 de mayo de 2020

Desarrollo de Street Fighter 2 Champion Edition para C64. Parte 2: el entorno

En este artículo no voy a hablaros propiamente del desarrollo. Voy a hablar del entorno de desarrollo, de las herramientas que he utilizado para desarrollar el juego y porqué las he elegido. Todas las herramientas están enfocadas al desarrollo cruzado, es decir, al desarrollo desde el PC para C64, por lo que obviaré las herramientas propias de C64. Allá vamos...
  • Editor de código: Relaunch64. Para programar en ensamblador existen varias opciones: o bien utilizas un simple editor de textos de propósito general (Bloc de notas, Notepad++, nano, vi, emacs, Pluma,...), o un editor con funciones avanzadas (Relaunch64), o un IDE genérico (Eclipse con el plugin para ensamblador para C64), o alguno de los IDEs especializados como Kickass IDE, CBM .prg Studio o C64 Studio. En mi caso me decanté por Relaunch64, es un editor programado en Java que permite usar diferentes compiladores, tiene resaltado por color de código y permite compilar el código desde el mismo editor y ver los mensajes del compilador. Y es compatible con el Linux que uso a diario, algo muy importante, ya que los "Studio" comentados antes sólo funcionan bajo Windows.
Relaunch64.
  • Compilador: ACME. El compilador permite transformar el código ensamblador en un programa en código máquina que el C64 puede ejecutar. Aquí también tenemos varias alternativas: Kickassembler, CC65 (permite compilar programas en C para la CPU 6502), DASM, TASS, xa, vasm. ACME es un compilador bastante antiguo y espartano que proporciona funciones adicionales como macros o ensamblado condicional, función que utilizo bastante. También es compatible con Linux.
Compilador ACME.
  • Editor de sprites: SpritePad. Las alternativas que conozco son Spritemate (editor online bastante sencillo de usar), Pixcen y 7up Sprite Editor. SpritePad tiene varias ventajas: permite importar "hojas de sprites" en formato BMP (muy útil en mi caso) o incluso desde snapshots de Vice, permite invertir/girar/hacer espejo a sprites, intercambios de color transparente/color propio/multicolor1/multicolor2, desplazamiento de píxels dentro del sprite o animación de sprites. Su pega principal es que no es compatible con Linux y ello me obliga a usar una máquina virtual para utilizarlo.
SpritePad.

  • Editor de bitmaps: Multipaint. Aunque inicialmente comencé a trabajar con Project One por su manejo del formato Koala, y por las opciones de retoque del color que permite a la hora de importar imágenes en otros formatos, hace unas semanas migré a Multipaint, ya que las últimas versiones permiten trabajar con el formato Koala que utilizo en el juego. Además, cuenta con múltiples opciones de dibujo (puntos, líneas, cuadrados, círculos, patrones de pintado,...) un poco al estilo Deluxe Paint, que son muy útiles a la hora de dibujar fondos. Otra alternativas serían Pixcen (excesivamente simple para mi gusto) y Timanthes (más completo pero muy inestable). Multipaint es compatible con Linux.
Multipaint, imagen creada por Errazking.
  • Editor de caracteres: CharPad. Aunque VChar es una buena alternativa, CharPad, del mismo creador que SpritePad, me proporciona lo necesario para editar el charset o juego de caracteres personalizado que utilizo en el juego, si bien mi charset es muy sencillito. CharPad, al igual que SpritePad, funciona bajo Windows.
CharPad.
  • Editor de sonido: GoatTracker. A decir verdad, usé este tracker cuando convertí el tema de Ryu a formato SID, pero en cuanto Narcisound se incorporó al proyecto dejé de usarlo. GoatTracker permite crear efectos especiales sencillos y viene con ejemplos en ensamblador para que podamos combinar un SID con 2 pistas de música con la reproducción de los efectos de nuestro juego en la pista 3. Dispone de varios filtros y opciones de exportación, y es compatible con Linux.
GoatTracker.
  • Emulador: Vice64. Los 3 grandes emuladores para C64 son Vice64, Frodo y CCS64, pero me decanté por Vice64 porque es el que más conozco, por su monitor de ensamblador (herramienta vital para el desarrollo), por su modo warp que acelera las cargas desde disco, por sus múltiples opciones de configuración y por su compatibilidad. Y por su versión para Linux, claro.
Vice64.
  • Depurador: C64Debugger. Aquí las opciones que conozco se reducen a dos: C64Debugger e ICU64. ICU64 está diseñado para ser usado en Windows y con Frodo, aunque la última versión ya permite usar Vice. Por otra parte C64Debugger es compatible con Linux y usa Vice, y a pesar de que es algo inestable y tiende a cerrarse inesperadamente, me proporciona una serie de herramientas muy útiles que me permiten ver en tiempo real cosas como la lectura y escritura de áreas de la RAM, los sprites en uso o los datos bitmap, aparte de un monitor ensamblador o los muy útiles puntos de parada, para detener la ejecución del juego en alguna rutina concreta.
C64Debugger.
  • Otras herramientas: además de todo lo comentado anteriormente utilizo exomizer para compilar los ficheros del juego en versión disco, CC1541 para escribir ficheros en imágenes de diskette .d64 por línea de comandos y cartconv para crear el fichero .crt para la versión cartucho.
Como veis, programar en ensamblador te puede obligar a usar muchas herramientas diferentes, aunque siempre tenemos la opción de usar algún IDE como CBM .prg Studio o C64 Studio que integran depuradores, editores de sprites, de caracteres, de mapas o incluso de sonido, y que reducen considerablemente el número de programas a utilizar.

Si tenéis cualquier duda sobre los programas que utilizo o queréis contarme vuestra opinión sobre tal o cual herramienta ya sabéis, podéis escribir en los comentarios. El próximo día: sprites.


Saludos, Paco.

sábado, 2 de mayo de 2020

Desarrollo de Street Fighter 2 Champion Edition para C64. Parte 1

Esto debería haber salido hace muuuuuchos meses, pero bueno, más vale tarde que nunca... En el último Explora Commodore David Asenjo (Darro99) y un servidor dimos una charla sobre cómo empezar a programar en ensamblador para C64. En dicha charla hablé de mi ejercicio de aprendizaje, un monstruo que llevo unos años programando y que no es más que una conversión del Street Fighter 2 Champion Edition para C64. Presenté este proyecto por sorpresa en el Explora 2018 y en la última edición del evento mostré nuevos avances en el motor de combates y el programa del menú principal, pero hasta hoy no había escrito nada sobre esto en el blog...
Pantalla de selección de luchadores de Street Fighter 2 Champion Edition (arcade).


Un poco de contexto

Street Fighter 2 es la única recreativa que he logrado pasarme con 5 duros. Fue en el verano de 1992, en un bar de la calle Escocia de Barcelona, jugando con Vega en un Street Fighter 2' (un bootleg del Champion Edition) para ser exactos. Solíamos pasar las vacaciones en la ciudad en la que vivían mis abuelos, y aquél estío sucumbimos a la fiebre de la máquina de Capcom, y no paré de jugarla día tras día hasta que logré llegar hasta el final.
Mueble de la recreativa del Street Fighter 2 Champion Edition (foto de Vintage Arcade Superstore).

Cuando US Gold lanzó las versiones domésticas del juego me alegré mucho, ya que por fin podría jugar en casa a mi recreativa favorita. Lamentablemente, las 2 versiones que llegaron a nuestro hogar fueron una completa decepción. La de PC tenía carencias en cuanto a control, animaciones, detección de colisiones, velocidad del juego y sonido, pero al menos era visualmente atractiva y podía jugarse... un ratito.
Street Fighter 2 para MS-DOS.

Pero la de C64, ¡ay amigo!, aquello era un desastre absoluto en todos los aspectos: gráficamente era muy feo, los controles no respondían adecuadamente, la detección de colisiones era terrible, la música in-game era una taladrante melodía en bucle de unos pocos segundos, tenía serios bugs (por ejemplo, Honda tendía a saltar y quedarse colgado en un imaginario "segundo piso") y la dificultad brillaba por su ausencia. Ni siquiera se respetaban las proporciones entre los personajes, y por ejemplo teníamos una Chun Li casi tan alta como Zangief.  Por entonces no me esperaba una conversión tan buena como la de SNES, pero conociendo la más que correcta conversión que hicieron los americanos de Pacific Dataworks del primer Street Fighter (hablé de ella hace unos años aquí), imaginaba que US Gold nos brindaría un juego decente.
Street Fighter 2 para C64 de US Gold, pantalla de presentación.

Unos 20 años después, en la grandérrima web Games That Weren't publicaron un artículo explicando el porqué de esta desastrosa conversión y entonces mi opinión sobre su programador James MacDonald cambió, ya que la culpa fue básicamente de US Gold, que quiso hacer caja con los últimos títulos que lanzaría para los micros de 8 bits, ya fuesen buenos o malos programas (Final Fight, G-Loc R360 o Indiana Jones and the Fate of Atlantis son otras muestras), y tomó decisiones que afectaron al desarrollo, como poner un plazo límite absurdamente corto, reemplazar al grafista en mitad del proyecto o hacer cambiar a MacDonald los gráficos del juego tan sólo unas horas antes de comenzar a grabarlos en cinta y disco.
Street Fighter 2 para C64 de US Gold, combate Chun Li - Zangief. Fijaros en la altura de ambos luchadores.

¿Cómo y por qué me embarqué en esta locura?

El caso es que hace unos años mi padre me regaló un lector de e-books, y uno de los primeros libros que le metí fue Lenguaje máquina del Commodore 64, de I.Sinclair. Empecé a aprender este lenguaje y el funcionamiento interno de la memoria del C64, los sprites, los modos gráficos, los bucles, las interrupciones, etc. Lo que aprendía lo escribía con Relaunch64 y lo probaba en Vice. Y recordé lo que me dijo un compañero de trabajo de mi padre allá por 1993, cuando me pasó un compilador de TurboBasic para MS-DOS: "si vas a aprender un lenguaje de programación, ponte una meta y trabaja en ella o acabarás abandonándolo". Y me propuse hacer un nuevo Street Fighter 2 para C64. Una locura, lo sé, pero tenía claro que no tenía prisa y este proyecto sería mi ejercicio de aprendizaje, ya que podría practicar el manejo de sprites, la visualización de gráficos bitmap, el uso de juegos de caracteres personalizados, las interrupciones, la multiplexación de sprites, la carga de datos desde disco, etc. De hecho algunas de las cosas aprendidas las apliqué en la intro del Star Wars: Wings que presenté en la Spanish SEUCK Compo y Olé 2017.
Nuevo Street Fighter 2 CE para C64, pantalla de presentación (versión preliminar).

Elegí Street Fighter 2, además de por ser uno de mis videojuegos favoritos, porque estoy convencido de que el C64 sería capaz de mover una versión jugable del título. Aparte del mencionado Street Fighter versión EE.UU., había más ejemplos de buenos juegos de lucha con personajes de gran tamaño para nuestro ordenador, como Barbarian 1 y 2, International Karate (e IK+), The Way of The Exploding Fist, Budokan o Long Life. Street Fighter 2 tiene el añadido de los movimientos especiales, pero creo que la mayoría se pueden implementar.
Nuevo Street Fighter 2 CE para C64, pantalla de selección de luchadores (versión preliminar)

Características deseadas de Street Fighter 2 Champion Edition para C64

Me he propuesto que el juego tenga las siguientes características:
  • 12 personajes jugables, de ahí que sea la Champion Edition.
  • Posibilidad de realizar la mayoría de los movimientos especiales.
  • Control únicamente por joystick, sin usar el teclado. Los movimientos especiales se harán con un único botón de disparo.
  • 3 niveles de dificultad.
  • Músicas y efectos de sonido: 1 melodía por cada escenario y melodías en pantallas de paso. En este apartado tengo la enorme suerte de contar con Narciso Quintana, programador y músico commodoriano de los años 80.
  • Formatos: cartucho Ocean de 512 KB y diskette de 1 ó 2 caras. La cinta está totalmente descartada por razones obvias.
  • Modo cheat o con trampas, para poder pasarse el juego sin que nos afecten los golpes del rival.


Obviamente el juego será lanzado de manera gratuita, ya que no poseo los derechos del mismo, y en vista de lo que le pasó hace poco a ZeroPaige con su Super Mario Bros 64... En cuanto a plazos, no me he puesto ninguna fecha tope. Lo programo en mis ratos libres y cuando considere que está terminado, lo publicaré gratuitamente, como decía antes. Actualmente está programada gran parte del menú principal, el motor de combates está terminado al 98% aproximadamente, y tengo 4 personajes completados (todos los sprites, fondos, animaciones y melodías excepto la de uno de ellos). Mi intención es publicar en este blog algunos artículos sobre ciertas partes del desarrollo. Quizás esto anime a alguien a empezar a programar en ensamblador para C64, quién sabe...


Saludos, Paco.