[Hack] Super Mario Kart - Fullscreen Edition [ACTUALIZADO a v1.2]

Imagen

Super Mario Kart - Fullscreen Edition

Lo 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.


Imagen Imagen Imagen


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.


Imagen Imagen Imagen


La parte que no se ve

Para 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.


Imagen Imagen Imagen


Un HUD nuevo aprovechando el espacio

El 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.


Imagen Imagen Imagen


¿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í.


Imagen Imagen Imagen


En resumen

Ha 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.

DESCARGA

Super Mario Kart - Fullscreen Edition (v1.2) (by Psicopompo).zip


Enlaces de interés:
- Ficha oficial en RomHacking.net
- Repositorio en GitHub

Datos de la versión
  • Solo versión USA (224 líneas / 60 Hz).
  • ROM limpia: CRC32 CD80DB86.
  • MD5: 7f25ce5a283d902694c52fb1152fa61a
  • SHA-1: 47e103d8398cf5b7cbb42b95df3a3c270691163b
  • Parches IPS y BPS. Recomiendo BPS.
  • Probado en bsnes y RetroArch.
  • Hardware real: la corrección de píxeles blancos de la v1.1 se confirmó en consola real; la v1.2 aún no se ha probado.
  • En el título aparece una pequeña línea Fullscreen Edition · Psicopompo bajo el copyright.

ROM resultante (v1.2)
  • Tamaño: 1 MiB (1.048.576 bytes)
  • CRC32: 8D91CAC9
  • MD5: 779a4560f4af920b3dc82f9697d43cb8
  • SHA-1: c908a843a4147d8dda018fa2c5ca364dd7babf9c

Si encontráis algún fallo que se me haya escapado, mandadme un save state y lo miro.
Olé!
Lo has conseguido.
Enhorabuena. Habrá que probarlo.
Este debes de publicarlo en sitios importantes de romhacking, te aseguro que hay muchas personas en el mundo a quienes les interesará mucho este hack.
Guapísimo! Gracias por el currazo. A ver si alguien puede probarlo en una snes original [beer]
¡He estado jugándolo un rato y te ha quedado genial! la otra versión que había de hace unos años estaba bien pero el coche estaba muy arriba, ahora SI esta perfecto tío, que bien ha quedado!
@heinki Gracias. Me alegro de que lo disfrutes. El otro hack se limitaba a quitar el mapa, nada más, pero en su momento hizo su papel.
Mis aplausos, estoy impresionado. Has hecho lo que creo que Nintendo debería haber hecho en su día y que hasta el día de hoy ha sido imposible hacer. Más aplausos.
Que pasada de hack, ojalá lo hubiera tenido de crío XD. Muchas gracias [beer]

Edito para confirmar que funciona bien en una consola K36 [oki] .
se agradece todo este gran trabajo , hace años que buscaba esta modificacion de mario kart en pantalla completa pero nunca encontre esta modificacion asta oy , lo e probado en una super famicom con un everdrive chino version 3.0 que soporta el chip dsp y en un televisor crt triniton funciona bien , lo unico que e notado 2 pixeles blancos muy pequeños que salen en la carrera pero tampoco tiene inportacia .
tendre que jugar mas para saber si estos pixeles solo salen en la primera carrera o en todo el juego .

un juego que me gustaria ver algun dia seria Street Fighter 2 a pantalla completa sin las barras negras como en la recreativa original , estaria buenisimo verlo , gracias y un saludo .
@baque @Waldo64 @Xfactor Gracias a los tres. 🙂🙃

@baque Si puedes darme más detalles, lo miro. ¿Te sale en emulador? Yo he usado BSnes durante todo el proyecto, cambiando de vez en cuando a algún otro. Probaré con Mesen, que suele ser más puñetero.

EDITO: Nada, he probado con Mesen y con Snes9x, y en ambos también se correctamente. Si alguien más ve ese par de píxeles en Everdrive, ya sabe.
@psicopompo lo estaba probando con el FX pak pro no hubo ningún problema, lo único que vi fue ese par de pixeles en blanco , por lo demás perfecto 👍
@Snes Pues, ya te digo que no veo nada en ningún emulador, y no dudo que ese par de píxeles te aparezcan con el FX Pak Pro, pero si no logro reproducirlo, no puedo solucionarlo. Si puedes, la próxima vez que juegues, fíjate en dónde salen exactamente, si aparecen ya cargados en la carrera o si se ven un poco antes o después. Cualquier cosa puede ser útil, aunque parezca insignificante. Y una foto de la pantalla, también. 👍🏻
@psicopompo https://imgur.com/a/Rr4xFBm . Aquí tienes una foto esos dos puntos blancos que salen al lado derecho paralelos con el (Yes), siempre aparecen en las pistas en la carrera, no apárese en el menú, es a la hora de competir y aparecen en todas las pistas del primer circuito que fue el que pude probar.
Muchas gracias @psicopompo un gran trabajo Lo acabo de probar una snes usa con el sd2snes y va muy bien:

Equipos utilizados:

snes americana
sd2snes
tv sony trinitron

Al jugar varias vueltas, encuentro que lo que dice @Snes es verdad, el juego muestra un par de puntos que titilan continuamente.

Ojo, no afecta en nada y para darme cuenta lo tuve que buscar, pero si que estaba ahí, dejo capturas:



Imagen
Imagen


En la captura parece un solo pixel pero como titilan no pude fotografiar a los dos juntos.

Pero como digo no afecta a nada del juego y no fue hasta que snes lo mencionó que lo vi.
@ChepoXX @Snes Gracias a los dos. Voy a ver si lo cazo. 👍🏻
@psicopompo gracias a ti por este gran hack, excelente trabajo 👍
Actualizando el parche...
@ChepoXX en mi caso de momento solo lo he probado en snes9x, me queda pendiente de usar en hard original o bsnes/higan. A ti te falla el pillar los cuadros de objetos al hacer un salto para esquivar una barra de salto?

Me explico, en el circuito de la casa fantasma de la copa champiñón, al intentar pillar esos cuadros a los laterales que tienen las barras de salto, hay que usar L/R para evitarlas y poder pillar esos cuadros de objeto, en mi caso no ha sido posible al ir corriendo y en algún otro circuito me paso igual que al usar para derrape aún estando encima de los cuadros no los pilla y era por descartar si es del emulador en sí más que nada.

Lo poco que lo pude probar (me pasé las copas Champi en 50cc y 100cc)

Por cierto @psicopompo , mola mucho el hack, se hace un tanto extraño al principio para lo que estamos acostumbrados pero se termina uno haciendo bien al tema [beer]
@yuragalo Luego te lo miro. Ese tipo de cosas muy concretas es lo que esperaba que reportaran, porque siempre se te escapa algo. 👍🏻
@psicopompo gracias compa, si puedo probaré mañana también en bsnes/higan y/o consola con flashcart.

Pudiera ser del emulador, que probé un poco con el super zsnes y ahí ya el despiporre es curioso, pero eso seguro que es el emulador por eso lo descarté directamente.
@psicopompo perfecto problema resuelto
Nota: el último parche se tiene que aplicar encima de el primer parche, para arreglar el problema de los pixeles en blanco en el hadware real.
@Snes @yuragalo Gracias a los dos. El parche lo voy a borrar del mensaje anterior y subiré uno que se aplique directamente a lo rom USA. Pero antes voy a ver si doy con el problema de Yuragalo y lo soluciono también. Además quiero bajar un poco la tabla de resultados tras la carrera.
@psicopompo una partida rápida que he echado en bsnes, hace lo mismo, para poder pillar esos cuadros hay que saltar bastante antes sobre todo cuando vas con velocidad (hay que saltar lo antes posible y quedar a ras de entrada de la barra de salto pero sin tocarla), cosa que en vanilla no (en cuanto pisaras encima lo pillabas) en este caso tienes que haber tocado antes pista porque si caes encima tocando cuadro no lo pillas.

Mas cosas que he notado:

- Algunas ralentizaciones (sobre todo cuando estás en medio del pelotón pero cuando no hay tanto rival también alguna que otra) aunque supongo es normal y no es nada exagerado aunque se note algo.

- Lakitu no hace la animación completa cuando te recoge del vacío (la parte final que te cobra el par de monedas)

- Algunos choques contra diferentes muros de distintos circuitos como que se hace antes de llegar realmente (como un cuadro de distancia de los del borde del circuito fantasma aproximadamente), como si la posición del corredor no fuera la misma que en vanilla (no sabría como explicarlo bien)
Donde más lo noto es en el circuito fantasma 1 que es el que más he probado hasta ahora.

- Con las caídas al vacío he visto algo similar pero nuse si es la animación debido a la inercia del corredor que aunque frenes caes sí o sí y por ello se ve así la animación (como si cayeras antes de tiempo habiendo borde de pista aparentemente) o es como por la posición del mismo como intento explicar en el caso anterior.

También en castillo fantasma 1 por el momento esto de las caídas que comento por lo que he podido probar.

Mañana si eso sigo probando precisamente estos casos que me han surgido espontáneamente
PARCHE ACTUALIZADO A LA VERSIÓN 1.2

@yuragalo

Gracias por los reportes. Ya está disponible la versión 1.2, que corrige lo que comentabas:

  • Píxeles blancos: corregidos (ya lo estaban desde la 1.1; la corrección la confirmó @Snes en consola real). ✅
  • Lakitu: el rescate tras caer de la pista funciona otra vez en pantalla completa. Lakitu entra en pantalla, recoge el kart, lo devuelve a la pista y se va con las monedas, como en el juego original. ✅
    Causa: el script de Lakitu espera a que su coordenada Y alcance ciertos valores, pensados para el rango de pantalla original. Con la vista ampliada su trayectoria pasa por valores negativos y esas esperas (y la de la moneda) no se cumplían. Se han adaptado las comprobaciones sin cambiar su velocidad ni su secuencia.
  • Colisiones con muros: antes los choques con muros, bordes y vacíos saltaban demasiado pronto; ahora ocurren cuando el kart realmente los toca. ✅
    Causa: el punto del suelo que el juego usa como posición del kart caía unas 37 filas de pantalla por encima de sus pies (en el juego original, 6). Se ha realineado la proyección del suelo con la posición del kart en pantalla, y ahora el punto está justo bajo él.

Sobre las ralentizaciones: hemos perfilado el código ciclo a ciclo. En la escena más pesada (el rescate de Lakitu) la lógica llegaba a consumir más tiempo del que dura un fotograma (≈358k de los ≈357k ciclos de reloj disponibles), con un 18 % de fotogramas con lag. La causa principal era una comprobación (¿estamos en 1P a pantalla completa?) que se ejecutaba entre 40 y 55 veces por fotograma desde las rutinas de dibujo de sprites. Ahora su resultado se calcula una sola vez por fotograma y las rutinas más llamadas lo leen directamente. Resultado: el rescate de Lakitu baja a prácticamente 0 fotogramas con lag. En conducción normal, en la salida con los 8 karts juntos y en una carrera completa en Donut Plains no hemos medido lag, con entre un 17 % y un 22 % de CPU libre.

Cada cambio se ha comparado fotograma a fotograma con la versión anterior en más de veinte estados de partida.

Si ves algo raro en algún circuito, lo mejor es un save state justo antes del problema, para poder reproducirlo.
psicopompo escribió:PARCHE ACTUALIZADO A LA VERSIÓN 1.2

@yuragalo

Gracias por los reportes. Ya está disponible la versión 1.2, que corrige lo que comentabas:

  • Píxeles blancos: corregidos (ya lo estaban desde la 1.1; la corrección la confirmó @Snes en consola real). ✅
  • Lakitu: el rescate tras caer de la pista funciona otra vez en pantalla completa. Lakitu entra en pantalla, recoge el kart, lo devuelve a la pista y se va con las monedas, como en el juego original. ✅
    Causa: el script de Lakitu espera a que su coordenada Y alcance ciertos valores, pensados para el rango de pantalla original. Con la vista ampliada su trayectoria pasa por valores negativos y esas esperas (y la de la moneda) no se cumplían. Se han adaptado las comprobaciones sin cambiar su velocidad ni su secuencia.
  • Colisiones con muros: antes los choques con muros, bordes y vacíos saltaban demasiado pronto; ahora ocurren cuando el kart realmente los toca. ✅
    Causa: el punto del suelo que el juego usa como posición del kart caía unas 37 filas de pantalla por encima de sus pies (en el juego original, 6). Se ha realineado la proyección del suelo con la posición del kart en pantalla, y ahora el punto está justo bajo él.

Sobre las ralentizaciones: hemos perfilado el código ciclo a ciclo. En la escena más pesada (el rescate de Lakitu) la lógica llegaba a consumir más tiempo del que dura un fotograma (≈358k de los ≈357k ciclos de reloj disponibles), con un 18 % de fotogramas con lag. La causa principal era una comprobación (¿estamos en 1P a pantalla completa?) que se ejecutaba entre 40 y 55 veces por fotograma desde las rutinas de dibujo de sprites. Ahora su resultado se calcula una sola vez por fotograma y las rutinas más llamadas lo leen directamente. Resultado: el rescate de Lakitu baja a prácticamente 0 fotogramas con lag. En conducción normal, en la salida con los 8 karts juntos y en una carrera completa en Donut Plains no hemos medido lag, con entre un 17 % y un 22 % de CPU libre.

Cada cambio se ha comparado fotograma a fotograma con la versión anterior en más de veinte estados de partida.

Si ves algo raro en algún circuito, lo mejor es un save state justo antes del problema, para poder reproducirlo.



Muchas gracias por la nueva versión. Mas tarde probaré en la consola y solo una pregunta:

¿A que hora duermes? saludos
Muchas gracias por este trabajo. Tiene mucha importancia y desde luego esto lo va a disfrutar muchísima gente. Además es cojonudo leer las explicaciones de lo que pasa en esas entrañas de silicio. [tadoramo]
psicopompo escribió:@baque @Waldo64 @Xfactor Gracias a los tres. 🙂🙃

@baque Si puedes darme más detalles, lo miro. ¿Te sale en emulador? Yo he usado BSnes durante todo el proyecto, cambiando de vez en cuando a algún otro. Probaré con Mesen, que suele ser más puñetero.

EDITO: Nada, he probado con Mesen y con Snes9x, y en ambos también se correctamente. Si alguien más ve ese par de píxeles en Everdrive, ya sabe.


en Snes9x 1.63 parece funcionar ok , los pixeles blancos se me ven en
consola super famicom y everdrive chino gracias.
Gracias por tu trabajo. Con qué velocidad nos has proporcionado la actualización, @psicopompo . Le seguiré dando caña al juego.
que guay no habia visto la actualizacion 1.2 la e probado pasando la primera copa tanto en emulador como en super famicom y funciona perfecto lo agradezco un monton y que rapido se a solucinado los pixeles blancos , asi lo tenian que haber echo los de Noentiendo en su dia .
un pasote ,enhorabuena porque ha quedado de lujo
psicopompo escribió:PARCHE ACTUALIZADO A LA VERSIÓN 1.2

@yuragalo

Gracias por los reportes. Ya está disponible la versión 1.2, que corrige lo que comentabas:

  • Píxeles blancos: corregidos (ya lo estaban desde la 1.1; la corrección la confirmó @Snes en consola real). ✅
  • Lakitu: el rescate tras caer de la pista funciona otra vez en pantalla completa. Lakitu entra en pantalla, recoge el kart, lo devuelve a la pista y se va con las monedas, como en el juego original. ✅
    Causa: el script de Lakitu espera a que su coordenada Y alcance ciertos valores, pensados para el rango de pantalla original. Con la vista ampliada su trayectoria pasa por valores negativos y esas esperas (y la de la moneda) no se cumplían. Se han adaptado las comprobaciones sin cambiar su velocidad ni su secuencia.
  • Colisiones con muros: antes los choques con muros, bordes y vacíos saltaban demasiado pronto; ahora ocurren cuando el kart realmente los toca. ✅
    Causa: el punto del suelo que el juego usa como posición del kart caía unas 37 filas de pantalla por encima de sus pies (en el juego original, 6). Se ha realineado la proyección del suelo con la posición del kart en pantalla, y ahora el punto está justo bajo él.

Sobre las ralentizaciones: hemos perfilado el código ciclo a ciclo. En la escena más pesada (el rescate de Lakitu) la lógica llegaba a consumir más tiempo del que dura un fotograma (≈358k de los ≈357k ciclos de reloj disponibles), con un 18 % de fotogramas con lag. La causa principal era una comprobación (¿estamos en 1P a pantalla completa?) que se ejecutaba entre 40 y 55 veces por fotograma desde las rutinas de dibujo de sprites. Ahora su resultado se calcula una sola vez por fotograma y las rutinas más llamadas lo leen directamente. Resultado: el rescate de Lakitu baja a prácticamente 0 fotogramas con lag. En conducción normal, en la salida con los 8 karts juntos y en una carrera completa en Donut Plains no hemos medido lag, con entre un 17 % y un 22 % de CPU libre.

Cada cambio se ha comparado fotograma a fotograma con la versión anterior en más de veinte estados de partida.

Si ves algo raro en algún circuito, lo mejor es un save state justo antes del problema, para poder reproducirlo.


Que buen trabajo, que GRAN aporte [beer]
Huy! Como mola esto!

Pedazo de curro, felicidades!
34 respuestas