SPAIN (España): Dedicado al Siglo de Oro español y su literatura/arte. Zurbarán (pintor barroco), Felipe (reyes), Góngora (poeta), Alarcón (dramaturgo), Narváez (militar), Isidorus (San Isidoro de Sevilla), Guevedo (deformación de Quevedo), Primo (por Primo de Rivera), Blasco (Blasco Ibáñez, escritor).
GREECE (Grecia): Basado en la Grecia Antigua y su mitología/historia. Minos (rey mitológico), Callas (por Maria Callas), Apelles (el pintor de Alejandro Magno), Kadmos (fundador mitológico de Tebas), Theon (matemático antiguo), Nikias (general), Proklos (filósofo neoplatónico), Thales (Tales de Mileto, filósofo).
URUGUAY (Uruguay): Homenaje a los libertadores de América. Bolívar (Simón Bolívar), Páez (general venezolano), Sucre (Antonio José de Sucre), Saavedra, Sáenz, Morales.
BRAZIL (Brasil): Un sinsentido de nombres en español (ni siquiera en portugués). Metieron a Goya (pintor español), Blasco (escritor español), Serrano, Romano y Beckett (escritor irlandés).
TURKEY (Turquía): ¡Es el único equipo real camuflado! Corresponde a la legendaria selección turca que quedó 3ª en el Mundial de Corea-Japón 2002. Recep es Rüştü Reçber, Bulent es Bülent Korkmaz, Tugay es Tugay Kerimoğlu, Feyyaz es Feyyaz Uçar, Oguz es Oğuz Çetin, Ridvan es Rıdvan Dilmen.
Veo primero qué trae el zip.
Es una placa Namco System 12 con código MIPS. Interleavo las dos mitades de la ROM de programa y miro si objdump sabe desensamblar MIPS.
Ya veo dónde se guarda el estado: hay áreas EEPROM USER, RANKING y SECRET. El programa de partida debe estar en otra ROM, así que busco el ejecutable del juego.
La base de carga sale clara: el desplazamiento 0x28000 de la ROM se carga en 0x80010000, como un ejecutable de PlayStation. No hay un desensamblador MIPS a mano, así que escribo uno mínimo.
De momento no he conseguido deducir las condiciones de desbloqueo. Sí he sacado bastante estructura, pero me falta la parte que importa.
Lo que he averiguado:
El código del juego es legible. Los dos archivos lg2vera se interleavan en una ROM de unos 800 KB de código MIPS (R3000) de la placa Namco System 12. Se carga a partir de 0x80010000, igual que un ejecutable de PlayStation. Escribí un desensamblador mínimo para poder leerlo, porque aquí no hay ninguno instalado.
Hay una zona de datos secretos guardada en la EEPROM. La EEPROM se divide en tres áreas, USER, RANKING y SECRET, y el modo test imprime sus direcciones y tamaños. Que exista un área SECRET encaja con que los desbloqueos se guarden entre partidas.
Hay una tabla de nombres de 4 letras: Who?, Mage, Raim, Cail, Balb, Goes, Lang, Krug, Emps, Zona, Rola, Shaf, Kai, Vale, Debu, Poul. Es la lista que usa la pantalla de estadísticas del modo test (ADS CHARACTER DATA). El “Who?” parece un hueco sin identificar, pero no sé si estos nombres son los jugadores que tú dices ni si alguno es oculto.
Hay 31 selecciones como texto, de Hong Kong a Canadá, sin que ninguna aparezca marcada como oculta.
Lo que no he conseguido: ligar esa zona secreta con la lógica de partida. Casi todos los accesos que encontré al buffer de la EEPROM son rutinas de guardado y carga, y la comprobación de “este jugador está desbloqueado” debe de estar escondida detrás de punteros y tablas que no he podido seguir por análisis estático. El código no tiene nombres de funciones ni comentarios, y desde aquí no puedo ejecutar el juego con un depurador, que es lo que haría falta para ver qué se escribe en la zona secreta y cuándo.
Cómo podríamos avanzar:
Con tu ayuda: dime qué jugadores ocultos conoces (nombre, equipo, cómo los viste). Con un nombre concreto puedo buscar su identificador en las tablas y seguir qué código lo comprueba.
Con MAME y su depurador: poner un watchpoint en la zona secreta de la EEPROM mientras juegas permite ver qué acción activa cada bit. Es la vía más rápida y fiable, y si lo haces tú, yo interpreto los resultados.
Si quieres que siga solo: puedo seguir desensamblando, pero será largo y no te garantizo llegar a algo concluyente.
Tracing the accessor functions around that memory region
Sigo con el análisis. Empiezo por la rutina que imprime ADS CHARACTER DATA, para ver cuántos personajes recorre y de dónde saca los nombres.
Ejecutó un comando
Los personajes se guardan en una tabla de 24 bytes por entrada, con estadísticas en RAM por personaje. Vuelco la tabla de nombres entera para ver sus campos.
Ejecutó 3 comandos
Hay un grupo de variables justo antes de la tabla (0x800B5358) que usa el código de 0x80070ED0 y 0x80072xxx. Es buena candidata para la pantalla de selección. Miro esos datos y el código.
Ejecutó 7 comandos
Continuar
Tracing the menu's per-item struct layout
Sigo. Busco quién incrementa el contador de “veces que se elige cada personaje” (offset 0x148 del bloque), porque ahí debe estar la pantalla de selección y su límite de personajes.
Ejecutó 18 comandos
Sí, y la condición sale clara del código: los personajes se desbloquean por días de funcionamiento de la máquina. No es por puntuación, victorias ni códigos. La he leído directamente del código MIPS, aunque no he podido ejecutar el juego para comprobarlo.
Qué personajes y cuándo
La tabla de personajes tiene 15 con nombre: Poul, Debu, Vale, Kai, Shaf, Rola, Zona, Emps, Krug, Lang, Goes, Balb, Cail, Raim y Mage. Al principio solo se pueden elegir los 10 primeros, y el contador de días (DAYS) abre uno más cada diez días:
Días Personajes disponibles Nuevo
menos de 20 10 —
20 a 29 11 Goes
30 a 39 12 Balb
40 a 49 13 Cail
50 a 59 14 Raim
60 o más 15 Mage
Cómo sube el contador
El contador está en la zona SECRET de la EEPROM, con una cadena de valores de comprobación para detectar manipulaciones: si no cuadra, se pone a cero. Sube 1 cuando se cumplen dos cosas a la vez:
Tiempo encendida: la máquina lleva más de 648 000 fotogramas desde el arranque, es decir, unas 3 horas a 60 Hz.
Fecha distinta: el marcador de día que lee la máquina es distinto del guardado en el último incremento.
Al subir, se reinicia el temporizador y se guarda el nuevo marcador. El máximo es 128. La comprobación se hace en una rutina de guardado que también se ejecuta al terminar una partida.
El modo test tiene una pantalla DAYS %d donde se puede subir o bajar el contador de 1 en 1 y de 10 en 10. Un operador podría desbloquear todo poniendo 60 sin esperar.
Lo que no está claro
El marcador de día: el juego lo lee de un registro de hardware al arrancar y solo lo compara con el guardado. Por el nombre DAYS parece la fecha del reloj, pero no puedo confirmar que sea el calendario.
Qué personaje corresponde a cada número: asumo que el índice de selección coincide con el de la tabla, sin interposición. Lo apoyan el contador de estadísticas y el nombre, que usan el mismo índice, pero no lo he visto en pantalla.
Las cuatro entradas “WHO?”: están en la tabla (índices 15 a 18) pero no he encontrado ningún camino que las haga elegibles, porque el límite máximo es 15. Parecen huecos sin usar, aunque no puedo asegurarlo.
Partidas de varios jugadores: con dos o más jugadores, el cursor no permite elegir el primer ni el último de la lista. No he interpretado por qué, pero significaría que el último personaje desbloqueado no se puede elegir en esas partidas hasta que se abre el siguiente.
Para Wikipedia, esto es análisis mío de la ROM y no una fuente publicada. Lo ideal sería confirmarlo en el juego: poner días a 60 desde el modo test y comprobar que aparecen los 15, o conseguir una fuente que lo recoja. Si quieres, puedo redactar la sección en español dejando claro qué es dato del código y qué es deducción.
PABEOL escribió:Qué curioso cómo un juego que para mí (y entiendo que para la mayoría), siendo fan de los juegos de fútbol de los 80 y 90 en la época, no pasó de una demo (eso sí, molona) de la Play, para otros pueda ser parte de su vida.![]()
Lo mismo me pasa, pero a la inversa, cuando le hablo a la gente de Final Match de PC Engine, metido en un mueble a tiempo: al parecer nadie (en Interwebs) jugó más que yo.
Luego en el Winning Eleven, no sé si en el 5, pusieron también la vista en primera persona, je-je.
Siempre me dio la sensación de que se podría haber sacado más partido a ese tipo de juego y cámara.
![más risas [+risas]](/images/smilies/nuevos/risa_ani3.gif)