Super Mario Kart - Fullscreen EditionLo que empezó como una idea bastante sencilla —quitar el mapa inferior de la pantalla para tener una vista de carrera mucho más grande— acabó convirtiéndose en uno de esos
hacks en los que cada solución abre tres problemas nuevos.
Y todo esto se ha hecho en apenas unos días con ayuda de la IA. Eso sí:
echándole más horas que un reloj. 😅
La diferencia fundamental con otro
hack que circula por ahí es que aquí no se ha limitado a ocultar lo que había abajo.
La cámara de carrera se ha desplazado y recalculado para aprovechar las 224 líneas completas de la pantalla, acercando la acción y haciendo que el kart, el suelo, los rivales, las sombras, los objetos y las colisiones sigan siendo coherentes con esa nueva perspectiva.
No es simplemente «quitar el mapa de abajo». La cámara cambia de verdad, y todo lo que depende de ella tiene que acompañarla.
Y aquí llegó uno de los puntos de inflexión del proyecto. Al principio estábamos intentando solucionar uno por uno los miles de problemas que aparecían al quitar simplemente el mapa y bajar el personaje a la parte inferior de la pantalla.
Hasta que se me encendió la bombilla: ¿y si aprovechábamos la lógica que el juego ya utilizaba para el Player 2, que colocaba su kart aproximadamente en la posición que necesitábamos, y la reutilizábamos para el Player 1 cuando jugaba en solitario?Aquella idea permitió dejar de pelear contra una buena parte de los problemas desde cero y avanzar muchísimo más deprisa. No resolvía todo, ni mucho menos, pero
nos ahorró una cantidad enorme de trabajo y nos dio una base coherente sobre la que seguir construyendo el hack.
La parte que no se vePara conseguirlo hubo que meterse bastante más abajo de lo que parecía al principio.
Aquí hay un matiz importante sobre lo de «acercar la cámara». Al principio, después de ampliar la superficie de Mode 7 para llenar las 224 líneas, la parrilla de salida quedaba demasiado adelantada respecto a Mario: el kart estaba en la posición que queríamos, pero sus rivales y la marca pintada en el suelo se habían quedado lejos, como si Mario estuviera empezando la carrera varios metros por detrás.
La solución no era seguir desplazando al personaje, sino hacer lo contrario:
acercar el escenario hacia él. Es el mismo efecto que se produce cuando aceleras en el juego: el kart permanece en su posición y es la pista la que avanza hacia él. Así conseguimos que la parrilla, los rivales y todo lo que rodea al kart vuelvan a ocupar la posición que les corresponde respecto a él, pero aprovechando la nueva pantalla completa.
A partir de ahí es cuando hubo que conseguir que esa nueva referencia de cámara fuese coherente con todo lo demás. El juego utiliza el DSP-1 para buena parte de la proyección de la pista, así que no bastaba con mover el sprite de Mario: había que
hacer que la posición real del kart, el suelo, la sombra, los rivales, los objetos y las colisiones siguieran hablando el mismo idioma.
La cámara se acerca progresivamente al comenzar la carrera, en lugar de pegar un salto brusco, y la nueva posición se mantiene también en cosas como la sombra, los efectos, los objetos, los saltos y las colisiones.
Y ahí empezaron a aparecer los cadáveres.
Rivales que atravesaban a Mario, tuberías que parecían no existir, objetos que desaparecían al acercarse demasiado, sprites que al salir por arriba reaparecían por abajo, cabezas de Lakitu asomando donde no tocaba, monedas y efectos que seguían apareciendo 88 píxeles por encima del kart, humo que se había quedado en la posición antigua...
Cada uno de esos fallos obligó a localizar dónde los estaba generando el juego y corregirlo sin romper lo que ya funcionaba.
Incluso hubo que rehacer parte del orden de dibujado y estudiar cómo se construye la OAM para entender por qué determinados rivales podían solaparse mal. Se probaron soluciones que funcionaban aparentemente bien y luego resultaban demasiado costosas para el procesador.
En NTSC el margen de CPU es bastante menor que en PAL y el hack llegó a provocar ralentizaciones reales, así que también hubo que perfilar el código y eliminar trabajo innecesario hasta recuperar la velocidad normal.
Y por supuesto, tocar la pantalla completa significa que el HUD original ya no tiene mucho sentido.
Un HUD nuevo aprovechando el espacioEl contador de vidas, las monedas y los dígitos de posición se han recolocado para aprovechar la nueva distribución. También se han adaptado las tablas de tiempos, los puestos finales, los menús de
Retry / End,
Ranked Out,
Game Over y otros elementos que originalmente estaban diseñados pensando en una pantalla partida.
Y aquí ocurrió otra cosa curiosa: algunos elementos que parecían sprites normales resultaron depender de HDMA, ventanas, tablas de color y otros sistemas de la SNES que no tienen absolutamente nada que ver con «mover una imagen unos píxeles».
En otras palabras:
cuanto más se tocaba, más cosas descubríamos que dependían indirectamente de aquel mapa inferior que ya no existía.
¿Y el 2P?Una de las condiciones del
hack era no destrozar el modo para dos jugadores. Después de todo el trabajo realizado sobre la lógica de 1P,
la rama 2P se deja ejecutar con el código original. El
hack utiliza puertas que detectan cuándo se está en 1P y dejan pasar la ROM vanilla en 2P.
Así que, en lugar de intentar rehacer también la pantalla partida, se conserva el funcionamiento original. Las pruebas en bsnes muestran el comportamiento 2P idéntico al de la ROM sin modificar en los escenarios comprobados.
¿Y el mapa y el retrovisor?Se llegó a investigar y prototipar también el conmutador de Select para recuperar esas vistas, y técnicamente se puede hacer. El problema es que el mapa y el retrovisor del juego original no son simplemente dos imágenes que puedas colocar en una esquina: utilizan Mode 7, HDMA y una serie de cálculos que estaban pensados para dividir la pantalla en dos.
Después de ver hasta dónde había que llevar el apaño para conservarlos, decidí que
esta versión debía apostar por una pantalla limpia y por una vista de carrera completa, en lugar de volver a llenar el espacio recuperado con elementos heredados de la distribución antigua.
Y, sinceramente, creo que queda bastante mejor así.
En resumenHa acabado siendo bastante más que un simple
hack para quitar un mapa. Ha habido ingeniería inversa, instrumentación de la CPU y del PPU, análisis de OAM y HDMA, pruebas en estados reproducibles, regresiones constantes, perfilado de rendimiento y un montón de problemas que no aparecían hasta después de arreglar el anterior.
Y sí, algunas de las cosas que parecía que iban a ser fáciles resultaron ser una puñetera trampa. 😅
El resultado es una versión de Super Mario Kart en 1P que utiliza las 224 líneas completas de la pantalla, con una nueva referencia de cámara que acerca el escenario al kart, el HUD recolocado y toda la lógica necesaria para que kart, pista, rivales, objetos, efectos y colisiones sigan funcionando de forma coherente con esta nueva perspectiva.DESCARGASuper Mario Kart - Fullscreen Edition (v1.5) (by Psicopompo).zip
Enlaces de interés:
-
Ficha oficial en RomHacking.net-
Repositorio en GitHubNovedades de la v1.5La v1.5 pasa a ser la versión estable. No se limita a ocultar el mapa: acerca la cámara de las carreras de 1 jugador y adapta la interfaz y los efectos a la vista completa. Durante la carrera fullscreen se ocultan el mapa y el retrovisor; el mapa de resultados TT sí se muestra; el modo a dos jugadores mantiene la pantalla partida.
Corrección de los resultados del Time Trial- Los resultados muestran ahora todas las vueltas, los tiempos destacados, TOTAL y el mapa con BEST 5 / BEST LAP.
- La carrera sigue siendo fullscreen y el diseño de resultados del Grand Prix se mantiene.
- Probado un Time Trial y una carrera normal para comprobar la correcta visualización de los tiempos.
Mejoras conservadas de v1.4- Nuevo reparto geométrico de tamaños de los rivales, elegido después de comparar las alternativas en movimiento. Se conservan los once dibujos originales; no se reescalan continuamente ni se reduce el tamaño normal del jugador.
- Corrección lateral de la parrilla desde el comienzo, sin esperar a que termine el giro. Se conserva todo el acercamiento, zoom y órbita de la introducción.
- Sombras de Lakitu corregidas en fullscreen y en las dos vistas del modo a dobles. Se mantiene la corrección del cuerpo que asomaba por abajo.
- Se conservan las adaptaciones del HUD, carteles, monedas y otros efectos de las versiones anteriores.
PruebasSe compararon 3.360 fotogramas de la distribución final con la referencia anterior: cámara, cronómetro, posiciones/velocidades y sprites del jugador no cambiaron en los campos comprobados. Los 360 fotogramas del ensayo de dobles también coincidieron en la imagen completa, incluidas ambas sombras. Estas pruebas no garantizan que todos los modos estén libres de fallos. La v1.5 se ha probado en bsnes/RetroArch y validado visualmente; no afirmo una prueba nueva en consola real o flashcart.
Descarga e instalación- ZIP: Super Mario Kart - Fullscreen Edition (v1.5) (by Psicopompo).zip.
- Contiene IPS, BPS, LÉEME.md y README.md. No contiene la ROM.
- Base: USA limpia sin cabecera, 524.288 bytes, CRC32 CD80DB86.
- Resultado: 1.048.576 bytes, CRC32 6AF5145E.
- Aplicad uno solo de los parches; recomiendo BPS porque comprueba la ROM base. No se aplica sobre una versión ya modificada. PAL no está soportada.
Datos de la versión- Solo versión USA (224 líneas / 60 Hz).
- ROM limpia: 524.288 bytes, sin cabecera. CRC32 CD80DB86.
- Parches IPS y BPS. Recomiendo BPS.
- Probado en bsnes y RetroArch.
- Hardware real: OK (v1.4).
- En el título aparece una pequeña línea Fullscreen Edition · Psicopompo bajo el copyright.
ROM resultante (v1.5)- Tamaño: 1 MiB (1.048.576 bytes)
- CRC32: 6AF5145E
Si encontráis algún fallo que se me haya escapado, mandadme un save state y lo miro.