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.

10 comentarios:

  1. Me parece un proyecto estupendo.
    ¿Qué ensamblador vas a utilizar?
    ¿Tienes intención de liberar el código cuando termines el juego?

    ResponderEliminar
    Respuestas
    1. Gracias. Estoy utilizando ACME y Relaunch para escribir el código. Aún no he pensado que haré con el código, la verdad.

      Eliminar
    2. Me alegro que hayas decidido optar por ACME. Es el mismo por el que opté yo el año pasado cuando me dio por hacer algo similar (aunque al final el proyecto, de tanto cambiar, terminó en nada).
      En mi caso yo decidí hacer las cosas con VIM, ya que un amable señor decidió crear un plugin de resaltado de sintaxis para ese ensamblador.

      Eliminar
    3. Dicen que ACME es espartano pero a mi me sirve, la única funcionalidad extra que uso es la compilación condicional en segmentos que cambian en las versiones disco y cartucho. VIM sí que es heavy metal, dicen que hay miles de usuarios atrapados dentro porque no saben la combinación de teclas para salir XDDD Estaría bien ver ese proyecto que terminó en nada, ¿has pensado en publicar lo que tienes hecho?

      Eliminar
    4. Lo que hice cambió mucho. Primero pensé en utilizar algún engine, pero al poco tiempo decidí cambiar el ámbito y hacerlo todo desde cero.
      Tras darle unas cuentas vueltas, como proyecto de aprendizaje me propuse hacer un port del Traz de Cascade Software para Linux.
      Aquello lo empecé con C++, que es lo único para lo que llegué a generar algo de código (pantalla de carga, menú de selección y el listado de "Top Ten jugadores"). Fue una vez hecho esto que decidí bajar a ensamblador (para seguir bajando más adelante hasta el nivel de la lógica digital). Mi propósito era el entender todo lo que pasaba de principio a fin, y me di cuenta de que con C++ (más aún usando librerías como SDL) no iba a conseguir eso.
      Aprendí mucho, pero generé pocas cosas tangibles.
      Eso sí, durante los dos años que duró ese reto, fui documentando en mi blog mes a mes las cosas que iba haciendo, las fuentes que iba consultando, y las decisiones que iba tomando. Puedes encontrar todo eso aquí:
      https://www.mytgard.com/php/bajo_un_oceano_de_bits

      Eliminar
    5. Una cosa que acabo de descubrir hoy y que igual te puede interesar
      https://programacion-retro-c64.blog/2020/05/08/programacion-del-c64-online/

      Eliminar
    6. Yep, he entrado en tu web, ¡hay muchísima info! A ver si encuentro un hueco y me lo miro con calma. Gracias por el último link, yo también sigo ese blog, de hecho tengo sus dos libros. Es interesante que salgan alternativas al desarrollo tradicional, pero por ahora prefiero trabajar con mi simple Relaunch + ACME. Como uso Linux no puedo usar IDEs como CBM Studio o C64 Studio, una pena...

      Eliminar
    7. Yo aún no he tirado la toalla en lo de hacer un juego, pero me voy planteando retos de dos años en dos años y este terminaba a principios de este año.
      Sigo este blog y también continúo al día con los de Fran Gallego, pero el único código que pico son scripts en bash y powershell para el trabajo. De todas formas, esta entrada provocó que quisiese lanzarme a ello otra vez.
      Ahora mismo estoy centrado en la escritura de un relato, pero es probable que si vas compartiendo cosas por aquí con tus avances, igual termino por reservar un rato diario a la programación de un juego :)

      Eliminar
  2. Cuanto trabajo ;D
    ...y lo mucho que debes de haber aprendido y aprenderás.
    Felicidades por este proyecto !!!

    ResponderEliminar
    Respuestas
    1. Gracias Bieno, es la idea del proyecto, aprender, aunque se me ha ido un poco de las manos XDDDDD

      Eliminar