CPS-2 · Ingeniería inversa

Cuatro jugadores, dos juegos: Cross Fever en MVC1 y MSH vs. SF

Cuatro controles independientes en prototipos locales de ambos juegos. Combate 2 contra 2, temporizadores nativos, videos reales y los límites que todavía quedan.

Daniel Plas Rivera ·

Cuatro controles independientes ya manejan cuatro luchadores a la vez en prototipos locales de Marvel vs. Capcom y Marvel Super Heroes vs. Street Fighter para CPS-2. MVC1 aprovecha su Variable Cross original. MSH vs. SF recibe un modo nuevo: los compañeros entran, permanecen en la pelea y reciben sus propias órdenes.

Una persona puede moverse mientras su compañero ataca. Ambos pueden iniciar sus propios Hypers. Si el otro equipo también activa el modo, hay una pelea sostenida de dos contra dos. Los videos reproducen cuatro secuencias de controles; todavía no documentan una sesión en vivo con cuatro personas.

Esta edición en español presenta los resultados, controles y límites del proyecto. La investigación completa en inglés conserva los listados, hashes y comparaciones técnicas de cada versión.

Informe de desarrollo, no lanzamiento

Los dos juegos siguen siendo prototipos. La publicación de este artículo no convierte las pruebas parciales en una versión terminada. Faltan pruebas más amplias de personajes, entradas breves, transiciones, controles físicos y rollback para cuatro jugadores. No hay una descarga pública del parche de cuatro jugadores.

El fondo de meteoros de MVC1 todavía no está integrado en MSH vs. SF. MSH ya tiene combate temporizado y barras TIME propias, pero los videos conservan sus fondos existentes. Las nuevas capturas de msh-exact-time-11 sí muestran el marco azul y las máscaras originales de TIME de MVC1, con sus colores completos. Los videos anteriores conservan su versión y sus límites.

MSH vs. SF: los cuatro siguen peleando

Ryu y Ken se enfrentan a Spider-Man y Captain America. Los cuatro paneles muestran las entradas físicas y la palabra de control que recibe cada luchador. Botones distintos iluminados simultáneamente indican propietarios distintos dando órdenes.

clip · loops
msh-timed-03: 771 cuadros consecutivos, 5120–5890, a 59,63 fps. Reproducción de controles normales, sin audio ni interpolación. Los números inferiores del temporizador son anotaciones; esta versión precede a las barras TIME nativas y a la selección para cuatro personas. No contiene el fondo de meteoros.

En la grabación completa, los cuatro permanecen activos durante 997 callbacks muestreados. Con las mismas entradas, la versión anterior, que solo cambiaba la propiedad de los controles, mantenía a los cuatro juntos apenas 17 callbacks y no activaba un modo sostenido.

La versión posterior msh-combined-08 reúne los controles, la selección, el modo temporizado y el HUD. En una prueba acotada, las 264 muestras de entradas llegaron al propietario correcto, incluidas las 24 combinaciones de jugador y botón de ataque. Se observaron seis Hypers alternados de Ryu y Ken con el medidor almacenado en cero durante el modo.

MVC1: Variable Cross con cuatro propietarios

Zangief y Ryu pelean contra Spider-Man y Captain America. Se usan controles normales en un emulador local de diagnóstico, sin escrituras de estado de juego ni un estado guardado cargado al inicio.

clip · loops
native-freeplay-01, 294 bytes: 620 cuadros consecutivos, 5100–5719, a 59,63 fps. Sin audio ni interpolación. Esta grabación es anterior al temporizador traducido y a las correcciones posteriores de entrada y selección.

Las dos barras TIME aparecen sobre los medidores de niveles; el fondo de meteoros es el propio de MVC1. No es una reconstrucción animada. El prototipo posterior de MVC1 ocupa 418 bytes y tiene pruebas adicionales de selección, controles, temporización y guardado/restauración. No atribuimos esas mejoras al video antiguo.

Un equipo no es un control

La pertenencia a un equipo sigue determinando rivales, proyectiles, medidor, relevos y colisiones. El nuevo propietario del control es independiente de esa pertenencia. Al cambiar de personaje activo, el compañero conserva a su propio jugador.

El MVC1 de arcade permite que los dos compañeros actúen durante Variable Cross, pero originalmente reciben controles compartidos. El relevo histórico utilizado en Kaillera asignaba el control al dueño del personaje activo. Cross Fever de Dreamcast permite propietarios independientes, incluidos ambos compañeros actuando juntos. Estas tres situaciones no son equivalentes.

El ejecutable de Dreamcast usa cuatro registros de controles y selecciona la entrada de cada luchador. Su código SH-4 se estudia para traducir el comportamiento a 68000; no se puede pegar directamente en el programa CPS-2. Los archivos Phoenix ayudan con el programa descifrado, no añaden puertos de control.

Controles nativos y cableado

Los equipos son P1/P3 contra P2/P4. Cada persona tiene direcciones y seis botones. Los botones MK/HK reutilizan líneas de Start/Coin, por lo que este diseño requiere juego libre y un cableado propio.

PersonaDirecciones + LP/MP/HP/LKMKHK
P1IN0, byte bajoStart1Coin1
P2IN0, byte altoStart2Coin2
P3IN1, byte bajoStart3Coin3
P4IN1, byte altoStart4Coin4

Los registros son IN0 $804000, IN1 $804010 e IN2 $804020. Las líneas de servicio y EEPROM se conservan. Fuera del combate, una pulsación nueva de HP+HK permite unirse; hay que soltar los botones antes de jugar. Durante el combate se conservan las prioridades de comandos y relevos. La compatibilidad con un gabinete físico requiere otra validación.

El temporizador y las transiciones difíciles

MSH mantiene su ataque de equipo QCF + HP+HK. El modo sostenido usa QCB + HP+HK y consume el medidor disponible según las reglas investigadas de MVC1. En las pruebas, el contador recorrió 576, 575…0; otra activación con dos niveles y fracción 92 produjo 430 unidades. Son unidades de simulación, no segundos decimales.

Dos barras TIME nativas en MSH vs. SF.

Captura real de combined-06: etiquetas TIME y barras dibujadas por el juego, sin superposición. La comprobación del HUD se repitió en combined-08.

MSH vs. SF después de terminar el modo del equipo izquierdo: permanece la barra derecha.

combined-06, activaciones escalonadas: queda solo el contador derecho. El reloj de ronda y los medidores normales se mantienen.

combined-08 corrige dos problemas concretos: HP+HK mantenidos al terminar el modo podían filtrarse al volver mediante un relevo; soltar los botones estando en el banco podía dejar un bloqueo pendiente y tragarse la siguiente pulsación. También evita la pausa inicial de los Hypers del propio equipo durante el modo, siguiendo la conducta verificada de MVC1 y Dreamcast.

Una prueba de guardado/restauración reprodujo los siguientes 300 callbacks, entradas, temporizadores y checksum de los 64 KiB de RAM. Esto no demuestra rollback de red. Se verificó un caso de KO del personaje activo y se compararon 7.600 registros de una secuencia; la matriz completa de derrotas y personajes sigue abierta. Una comparación histórica de QCF presentó 73 diferencias de campos en 70 callbacks: no se afirma identidad cuadro a cuadro con el juego original.

Una corrección concreta de entradas

El perfil local del emulador filtraba algunos cambios rápidos de dirección: P3/P4 en MVC1 y los cuatro controles en MSH podían pasar de Izquierda → Derecha o Arriba → Abajo y producir una entrada neutra. El perfil corregido conserva esos cambios entre muestras consecutivas y neutraliza únicamente las direcciones opuestas pulsadas a la vez.

Los controles ordenados entre mando y puerto pasan de 59/77 a 77/77 en MVC1 y de 43/77 a 77/77 en MSH. Durante Duo simultáneo en MVC1, llegan al puerto las 156 palabras solicitadas, frente a 118 antes. Se verificaron 2.461 muestreos completos y 1.337 entregas de entradas e historial a los luchadores, sin diferencias. La ROM no cambió para esta corrección; los registros fijan el emulador y las ROM usadas.

Esto aún no prueba que se conserven todas las pulsaciones breves. De las 156 solicitudes, 154 se leen y terminan en el mismo callback, una termina en el siguiente y una pulsación de P2 no tiene lectura física del luchador. No se añadió una cola de entradas. Los problemas concretos de Wolverine/Strider, el rollback de Fightcade y los controles físicos siguen siendo pruebas separadas.

El TIME azul original ya se dibuja en MSH

msh-exact-time-11 incorpora las 11 piezas del marco y las 16 máscaras de vaciado originales de MVC1. Conserva sus colores y usa dos contadores independientes. La comparación de los 32 MiB de gráficos confirma que solo cambiaron esas 27 piezas asignadas; no se amplió la memoria de gráficos.

msh-exact-time-11: dos barras TIME azules originales de MVC1 con diferentes tiempos restantes.

Captura real en el callback 5500 de staggered11-latched. El dibujo pertenece al juego; no es una anotación del video.

msh-exact-time-11: solo permanece la barra TIME del equipo derecho.

Callback 6200: terminó el modo izquierdo. Las dos barras desaparecen al llegar al callback 6400.

Las 22.900 comparaciones de píxeles opacos en 14 capturas coinciden exactamente. El observador sigue los bancos físicos de objetos y su captura en VBlank, en lugar de asumir que el contador actual corresponde a la imagen mostrada. Los registros de esta versión fijan los hashes y los límites. En la expiración observada se restauran ambas filas de paleta; si hay un conflicto de paleta o falta espacio en la lista de objetos, el HUD opcional se omite.

La secuencia fija anterior sigue sin lograr un KO en 11: los luchadores del lado derecho quedan con un mínimo de 12 y 80 de vida. Esa ejecución, ko11, se conserva como cobertura fallida. El dibujo adicional cambia la relación entre callbacks y simulación; no se asumió que la secuencia anterior mantendría su resultado. Las capturas de 06/08 y el video de 03 conservan sus etiquetas.

Una secuencia nueva de controles normales sí alcanza un KO del personaje activo en la misma ROM de build11, sin modificarla. Spider-Man cae con ambos modos activos y 131 unidades en cada temporizador. Captain America pasa a ser el personaje activo del lado derecho en el siguiente callback. P4 lo mueve a la derecha e inicia un puñetazo débil nuevo: llegan las ocho muestras de movimiento y las cuatro de puñetazo solicitadas. Solo termina el modo del equipo de Spider-Man; el temporizador izquierdo continúa.

Los registros del KO y la recuperación en build11 comparan la ejecución original con una reproducción fija: coinciden los 7.600 registros de callbacks, salvo la etiqueta que identifica el método de control. Los objetos TIME pasan de dos barras a una, y después a ninguna al expirar el último temporizador; ambas filas de paleta recuperan sus valores guardados. Cada ejecución pasa 5.808 comprobaciones de dibujo y 6.908 de envío de objetos. Se ejecutaron sin ventana ni capturas nuevas y con el perfil histórico de observación; no amplían el resultado del nuevo filtro de direcciones.

Esto verifica un caso de KO y recuperación del control del superviviente. Siguen pendientes las rondas completas, revanchas, KOs simultáneos, la matriz de personajes, los escritores de paleta, las referencias gráficas calculadas y los límites de objetos y píxeles. No demuestra el comportamiento en gabinetes ni en red.

Por qué faltan los meteoros

El fondo de MVC1 utiliza 866 piezas de 32×32. Dividirlas y reutilizar patrones de 16×16 permite una propuesta sin pérdida, pero exige 2.404 patrones nuevos. Los espacios aparentemente vacíos no están necesariamente libres: algunos forman zonas transparentes de los escenarios existentes.

Después de proteger las referencias observadas en una ejecución normal de MSH, quedan 2.381 espacios, 23 menos de los necesarios. Con el corpus completo de mapas recuperados, quedan 1.695. La primera distribución se rechaza porque alteraría escenarios. No se escribieron gráficos para esa propuesta. Hace falta otra distribución segura, además de resolver mapas, paletas, prioridades y restauración al finalizar el modo.

Lo que queda antes de lanzar

Las pulsaciones de un solo callback pueden ocurrir entre dos actualizaciones de un luchador; se ha observado pérdida de ese tipo de entrada en MVC1. Hay que resolverlo con pruebas del muestreo real, sin confundir callbacks de video con cuadros de simulación. También quedan personajes y formas, agarres, proyectiles, cruces, transformaciones, expiración durante supers, KO doble, revanchas y presupuesto de CPU/objetos.

El harness ahora verifica las líneas físicas, la procedencia de lecturas y el muestreo de cada personaje. Un perfil nuevo expone los controles nativos de ambos juegos y pasa 43 casos de interruptores por juego. Los builds fijan hashes, bytes originales, reservas y fuentes para poder reproducirlos.

El parche DHC es otro proyecto: añade cancels y relevos, no cuatro propietarios independientes. Publicar este informe permite mostrar el avance sin anunciar compatibilidad con gabinetes, Fightcade en línea o una versión final que todavía no existe.