miércoles, 8 de julio de 2020

Desarrollo de Street Fighter 2 Champion Edition para C64. Parte 3: los sprites

Ahora sí, entramos en el desarrollo del juego puramente dicho. Street Fighter 2 es un juego de lucha uno contra uno que en el apartado de los sprites cuenta con varias peculiaridades: luchadores muy grandes, gran variedad de movimientos especiales o movimientos sobre el suelo muy suaves. A priori, plasmar todo esto en una máquina con las limitaciones del C64 se antoja imposible, pero sacrificando algunos aspectos se puede conseguir algo decente. Eso creo, vamos.

Al abordar los sprites de los luchadores estudié cómo los habían gestionado otros juegos similares para C64. Para poder explicarlo mejor he utilizado C64 Debugger, una potente herramienta que permite depurar la ejecución de un programa, así como ver el contenido de la memoria, los sprites, los bitmaps, etc.

Street Fighter 2 (1992, US Gold)
La conversión oficial utiliza hasta 4 sprites multicolor para cada luchador, 128 por luchador en total, que ocupan 8KB de memoria.
Hoja de sprites de Ryu/Ken en Street Fighter 2 de US Gold.

Para que se vean por pantalla utiliza un doble buffer en el que se copian los sprites de la postura actual. El doble buffer permite evitar glitches, ya que puede suceder que se muestren sprites a medida que se actualizan. Con el doble buffer los punteros de los sprites apuntan siempre al buffer de sprites que ya ha sido copiado anteriormente, y se pueden copiar unos sprites mientras se muestran otros. Las diferentes alturas de cada luchador no se han respetado y por ejemplo Zangief es más alto que Chun Li.
Punteros a sprites en Street Fighter 2 de US Gold, se observa que en cada frame los punteros apuntan a direcciones diferentes de memoria (buffers).


Street Fighter versión EEUU (1988, Pacific Dataworks International)
La versión americana del videojuego de Capcom utiliza hasta 4 sprites por luchador pero en modo overlay, es decir, superpone sprites en alta resolución sobre sprites en baja resolución, lo que permite tener unos personajes coloridos y muy definidos, aunque de tamaño pequeño. El jugador 1, que siempre lleva a Ryu, tiene 136 sprites que ocupan 8,5KB de memoria. El jugador 2, por ejemplo Retsu, tiene 90 sprites que ocupan 5760 bytes.
Hoja de sprites de Ryu en Street Fighter versión EEUU.


En este caso también se usa el doble buffer explicado antes. Los luchadores tienen alturas similares, ya que son de un máximo de 2 sprites de alto.
Punteros a sprites en Street Fighter versión EEUU, en rojo los buffers de sprites.

Barbarian (1987, Palace Software)
Este caso es bastante peculiar: los personajes se dibujan directamente sobre el fondo bitmap y solamente se utilizan sprites para el chaleco del jugador 2, las manchas de sangre, la parte superior de los luchadores en algunos movimientos. Este sistema, aunque permite luchadores grandes (60 píxeles de altura en reposo, casi 3 sprites de alto), está implementado de forma que los movimientos son carácter a carácter, de 8 en 8 píxels, lo que provoca que los movimientos sean algo menos fluidos que en juegos que usan sprites y de la sensación de framerate bajo al no tener la misma fluidez. A pesar de esto, el juego es espectacular.
En los cuadros rojos están indicados los sprites de Barbarian. El resto de gráficos son bitmaps o caracteres.

IK + (1987, System 3)
El clásico de System 3 combina métodos vistos en los juegos anteriores: utiliza 12 sprites para 2 de los 3 luchadores, y el tercero lo dibuja en el bitmap como en el Barbarian. Para mostrar los sprites de los luchadores utiliza multiplexación, con la ventaja de que esos sprites siempre están alineados de 3 en 3, como se ve en la captura. Al no moverse los sprites verticalmente se evitan parpadeos. Todo esto proporciona una acción más fluida que en Barbarian y 3 personajes de gran tamaño en pantalla.
IK+, en rojo están marcados los sprites.


No he encontrado las hojas de sprites en memoria, así que imagino que estarán comprimidos. Al tener los 3 luchadores el mismo aspecto excepto por el color, con un bloque de sprites de un luchador se pueden dibujar los 3 personajes en pantalla, lo cual permite ahorrar mucha memoria.

En el caso de mi juego, inicialmente hice pruebas con sprites en alta resolución, pero lo descarté pronto por varios motivos:
  • Los luchadores aunque detallados, se veían muy pequeños, más o menos del tamaño de los del Street Figher USA.
  • Todos los personajes tendrían una altura similar, y así no podría respetar las proporciones entre luchadores, algo imprescindible.
  • Para implementar luchadores más altos tendría que utilizar más memoria por luchador y un multiplexador, y lo primero habría hecho más difícil programar la versión disco.
  • La implementación de los movimientos de miembros estirados de Dhalsim se complicaría considerablemente y se necesitaría usar multiplexación para un resultado óptimo.
Prueba de Ken en modo overlay.


Al final me decanté por una solución similar a la del Street Fighter 2 de US Gold: usar 4 sprites multicolor por luchador sin multiplexación pero respetando las dimensiones y proporciones de cada personaje. La "hoja de sprites" de un luchador contiene 128 sprites que ocupa 8KB de memoria. Así, los sprites de los 2 luchadores ocupan 16KB de memoria. En el VBANK (banco de memoria de vídeo) reservo un espacio de 512 bytes para copiar los 8 sprites de ambos luchadores. Con este uso de la memoria me queda espacio para el código, el bitmap del escenario, música y fx, y puedo hacer versiones en disco y cartucho.
Hoja de sprites de Ken (versión anterior).


Como curiosidad, inicialmente implementé un doble buffer como en otros títulos, pero al final he dejado de usarlo porque no lo necesito.

En el siguiente artículo os explicaré la conversión de los sprites originales y cómo el juego gestiona el pintado de los mismos. Si tenéis otro punto de vista sobre lo que he explicado aquí o si queréis comentar cualquier cosa sobre esto, me encantaría leeros en los comentarios.


Saludos, Paco.

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.