Mostrando las entradas con la etiqueta NOTAS. Mostrar todas las entradas
Mostrando las entradas con la etiqueta NOTAS. Mostrar todas las entradas

miércoles, 15 de octubre de 2025

[Notas Romhacking] 15-10-2025

Hace bastante que no creaba una entrada para contar en qué proyectos estoy trabajando, en parte porque muchas veces no estoy seguro de si los terminaré, y en otras simplemente por mera procrastinación.

En fin, comencemos:

1.- Bomberman Jetters (GBA):

Este es el primer juego de Game Boy Advance que estoy traduciendo, y me he encontrado con varias ventajas que ofrece esta consola. La principal es que los juegos se cargan completamente en la CPU. ¿Y cuál es la ventaja de eso? —se preguntarán—.
Pues bien, en resumen, podemos acceder a cualquier parte de la ROM en cualquier momento, ya que no dependemos de manejar bancos que se vayan alternando, como ocurre en consolas más viejas, como la NES o la SNES.

Esto tiene un impacto directo en la traducción, ya que podemos mover el texto libremente a los lugares más convenientes, y solo debemos preocuparnos de manejar correctamente los punteros. Y qué mejor que hacerlo con mi propia herramienta, que gestiona punteros de 4 bytes en GBA (perdón por la autopromoción 😅).

Hablando de la ROM, esta es japonesa y nunca tuvo una versión americana, por lo que estoy usando como base una traducción puente realizada por Normmatt, quien además implementó la difícil tarea de incluir una rutina de texto con ancho variable (VWF).

Algo a destacar es que dicha rutina complica un poco el conteo de caracteres por línea, ya que el juego no formatea el texto automáticamente como en otros títulos. Así que habrá que tener paciencia con este proyecto, porque no sé cuánto me demoraré en completarlo.






Con respecto al apartado técnico que supone la traducción, los gráficos se encuentran comprimidos con LZ77, el algoritmo usado en la BIOS del GBA. Afortunadamente, nuestro colega CUE ha creado una herramienta que permite descomprimir y comprimir gráficos con facilidad. A él, por supuesto, se le darán los créditos correspondientes.

2.- Romancing SaGa (SNES):

Otro RPG. En este caso, mi idea inicial era ayudar a Damniel a pulir un poco su traducción, simplemente por mera satisfacción de ayudar a a terminar un proyecto de la comunidad. Así que comencé toqueteando la ROM para ver como modificar la introducción, integrar las letras del alfabeto español y ajustar las tablas de anchos variables presentes en la traducción puente, ya que este juego es originalmente japonés.

Sin embargo, soy consciente del tiempo que requieren este tipo de proyectos, y dado su poco tiempo disponible, él me ha autorizado a utilizar y modificar su trabajo para ofrecer una versión mejorada de su traducción.

Así que… próximamente 😉






Al igual que con Bomberman Jetter, alterar el texto con rutina VWF puede ser un calvario a la hora de contar caracteres, esto supone un gran problema a la hora de traducir, y es evidente la falta de una herramienta que se encargue de esto...

En el apartado técnico no tengo mucho que decir, si bien modificar los punteros es cosa sencilla, me he encontrado con un pequeño problema en el menú incial, en el que deber crear tu personaje, que impide volver atrás, por el momentos no lo he arreglado, porque me encuentro haciendo el grueso de la traducción, el script principal.

ROMS DE PICADILLO


Bomberman Tournament (GBA)

Internamente es igual al Jetters, por lo que debería ser relativamente sencillo, aunque igual de demandante en tiempo.

Bill & Ted’s Excellent Adventure (NES)

Si bien encontré los textos comprimidos en 5 bits, aún no he localizado los diccionarios de palabras del MTE que incluye internamente, pese a que sé cuáles son.

Otro punto desalentador es que los punteros parecen estar desordenados, lo que me hace pensar que requeriré una herramienta propia para modificarlos. Y sinceramente, ahora mismo me da pereza programarla, ya que necesitaría bastante depuración.

Wurm – Journey to the Center of the Earth! (NES)

Algo parecido ocurre con este juego. He encontrado los textos, el diccionario y los punteros, pero también están desordenados. En resumen, otro pequeño calvario.

Demi Kids: Light Version (GBA)

Mientras escribía esta entrada me había olvidado por completo de este juego. Actualmente manejo todos mis proyectos mediante batch files: de esta forma, al terminar, simplemente ejecuto un build.bat y se genera todo automáticamente, desde la ROM hasta el parche IPS. Esto tiene muchas ventajas, entre ellas poder mantener y modificar facilmente, teniendo un registro de todo, sin embargo me hace más olvidadizo, porque puedo dejar proyectos  a medio hacer, sin tener que preocuparme por olvidar cosas.

Entre lo que recuerdo, hace falta el dump completo del texto. Si bien  los gráficos comprimidos se encuentran extraidos y listos para reinsetarlos, creo aún hace falta algunos. Al menos encontré la fuente principal, que es una de las partes más importantes.

En cuanto al script, curiosamente maneja entradas multibyte, lo cual no debería representar un problema.






martes, 1 de diciembre de 2020

[Notas Romhacking] Compresión de Golomb-Rice de 4 bits

En este artículo documentaré como funciona la codificación de Golomb, esto se hace con la intención de compartir conocimientos con la comunidad de romhack hispana.

Esta codificación se hace presente de la desarrolladora Imagineering Inc. específicamente en los siguientes títulos de NES:

  • Barbie
  • Home Alone 2
  • Ren & Stimpy Show, The
  • Simpsons Bart vs Space Mutants
  • Simpsons Bart vs The World
  • Simpsons Bartman Meet Radiactive Man

Para entender como funciona primero debemos entender la diferencia entre 1 byte y 1 bit. Recordemos un 1 byte esta conformado por una cadena binaria conformada por 8 bits, tal y como muestra la imágen de abajo.



Si ocupamos las mates, con potencias de 2 tenemos que 2^8 = 256 combinaciones, y los bytes pueden representarse en formato hexagecimal del 0x00 al 0xFF.

Bien para la codificación de estos juegos se han ocupado 4 bits, osea la mitad de un byte, si ocupamos mates nuevamente, 2^4 = 16 combinaciones, no es mucho, ya que el alfabeto consta de 26 letras (sin contar caracteres de puntuación, etc), sin embargo como solución podemos sacrificar un espacio y asignarle un "byte flag", de esta manera podemos crear otro alfabeto de 16 espacios, y cuantos queramos sacrificando siempre un espacio en el primer diccionario.

Para ver esto de mejor forma tomaré como ejemplo el juego: "The Ren & Stimpy Show - Buckeroo$!" de NES. Si analizamos su tabla de caracteres (char map):



Como podemos ver en la imágen en la parte seleccionada, este juego ocupa 49 caracteres, a su derecha los tenemos en ASCII. Bien si hacemos los cálculos: 49 / 16 = 3,0625, (aproximamos al entero siguiente) o sea necesitaremos 4 diccionarios para poder llenar todos los caracteres. Ahora, ¿cuántos caracteres caen en el primer diccionario?, Si pensaste en 13 estas en lo correcto, pues debemos sacrificar 3 espacio para ocuparlos como flag para apuntar a los otros diccionarios.

La siguiente tabla resume lo anterior:


Algo importante de mencionar es que orden de los caracteres están basado es su frecuencia de aparición, lo que quiere decir que los caracteres de la columna 0 serán los que tienen mayor probabilidad de aparecer y por lo tanto al no requerir de un "flag" ocuparan solo 4 bits , por el contrario los de la demas columnas (1, 2 y 3) ocuparán 8 bits.

Después solo debemos encontrar donde esta el texto (no explicaré esto aquí) y tomar todos los valores hexagecimales y dividirlos en 2 partes cada byte, por ejemplo el byte "D0", nos quedaría "D" y "0", si lo pasamos a decimal "13" "0", a esto se le llamarán "nybbles", y abajo tenemos un extracto del texto en nybbles.



Ahora solo debemos interpretar lo números como si fueran coordenadas, y ocupar la tabla de más arriba, recuerden ocuparemos por defecto la fila 0, si es que llegamos a un flag, cambiamos de diccionario y  ocupamos el "nybble" siguiente, para ejemplificar mejor ocuparemos la región que está encerrada.

5 = N, 6 = I,
13 (flag para ir al diccionario 1) -> 0 = C, 
13 (flag para ir al diccionario 1) -> 12 = K,

1 = E, 12 = L, 2 = O, 10 = D, 1 = E, 2 = O , 5 = N, 11 = {0D}

Así nos queda la cadena de texto:

NICKELODEON{0D}

Bien, ya decodificamos el texto, y esto corresponde a la intro del juego, la primera línea específicamente:


Luego solo queda hacer una herramienta que haga esto automáticamente, y bueno hacer lo contrario, osea comprimir de texto, para eso debemos también crear nuevos diccionarios, basados en la frecuencia de aparición de cada caracter, para comprimir con la misma eficacia. Y por último y no menos importante manejar los punteros de los textos.

Herramienta disponible aquí.

Hasta pronto en otra nota de romhacking.



lunes, 30 de noviembre de 2020

[Notas Romhacking] Robocop Vs The Terminator (USA) (Proto) (NES)

Este juego de Virgin Games para NES, al igual que M.C KIDS (McDonaldLand) tiene el texto comprimido con un algoritmo LZSS, también ambos juegos presentan punteros de 2 bytes separados en 2 tablas, en un lado los bits menos siginificativo (LSB) y en otro los bits mas significativos (MSB). 

El algoritmo funciona de la siguiente manera:

  • 4 bits: tamaño del argumento "source" para las copias anteriores, en bits.
  • 4 bits: tamaño del argumento "length" para las copias anteriores, en bits.
  • Secuencia de bits comprimidos; lee cada byte de más significativo a menos significativo.

La secuencia de bits comprimidos consta de una serie de dos comandos:

1.- Pastcopy0 (source) (length)
  • Copia los datos que ya se han descomprimido previamente.
  • El número de bits utilizados por "source" y "length" se especifica en el primer byte de los datos comprimidos.
  • El "source" es cuántos bytes atrás copiar, y un valor de 0 indica el final.
  • El "length" es el número de bytes a copiar, menos tres (por lo que una longitud de 0 copia 3 bytes, 1 copia 4, etc.)
2.- Literal1 nnnnnnnn
  • Genera un byte literal.
    Tenia hecho hace tiempo un editor para esto, originalmente hecho por Alchemic, el cual agradezco, ya que puede tradcuir el M.C Kids con su ayuda, sin embargo la herramiento presentaba falencias a la hora de comprimir el texto,entre algunas, la compresión ocupan más espacio, no formatea punteros, no poder maneja caracteres no ASCII, como también no poder ocupar una tabla de caracteres externos. 

     Así que era hora de aportar con mi granito de arena a la comunidad de romhacking, y me di la tarea de hacer la herramienta desde 0, pero que además de mejorar el algorimo de compresión, ayudará a cubrir lo puntos anteriormente expuestos.

    He aquí los resultados:

Texto original descompresión

Texto orignal(sin modificar) compresión


    Algo que olvidé mencionar es que el juego posee tres bloques comprimidos de texto, divididos en script1,2,3... Utilizaremos como ejemplo el primero, el texto ocupa un total de 1782 bytes, sin embargo como muestra la imágen , al descomprimir tenemos 2641 bytes, un crecimiento del 48%. Ahora si lo comprimimos nuevamente podemos apreciar que nos quedan 72 bytes libres en ese bloque, por lo tanto, texto comprido original: 1782, compresión mía: 1710 bytes, una mejora de compresión de un 5% con respecto al original.

    Se que no es mucho, pero si lo pensamos al traducir al español, solemos ocupar más palabras para decir lo mismo en inglés (con excepciones), así que esto ayuda muchísimo.


    Bueno me despido, y nos vemos en otra nota de romhacking.



[Notas Romhacking] 03-02-2025



1.- Mississippi Satsujin Jiken (NES)

Desarrolle la herramienta "HexString" para este juego, tiene la capacidad de comprimir por DTE/MTE, además formatear los punteros automaticamente, proximamente más avances.






2.- Compresión de Golomb de 4-bits:


He estado trabajando en la creación de herramientas para sacar adelante nuevas traducciones de ROM que por su complejidad aún no se disponen de traducción. En este caso la compresión de Golomb, permite al desarrollador crear un mapa de caracteres, que divide en distintos diccionarios, lo que permite seleccionar los caracteres que presentan más frecuencia y en este caso asignarlo con un valor de 4 bits (mitad de byte), de esta forma asignamos al primer diccionario los 16 valores con más repetición. Si se preguntan de donde sale el 16 (2^4 =16). Con esto podemos asignar a un byte 2 valores.


Ahora, esto es hipotético, si tenemos mucho mas que 16 caracteres, necesitaremos construir otros diccionarios, pero deberemos sacrificar indices, osea reduciremos la capacidad a 15. Y en 1 por cada diccionario extra. A estos índices por cierto, se les denomina "nybble".

Pero dejemos de tanta explicación técnica, he localizado una serie de juegos, de la desarrolladora Imagineering que ocupa esta compresión de texto. Entre algunos títulos:


Barbie (NES)
Home Alone 2 (NES)
Ren & Stimpy Show, The (NES)
Simpsons Bart vs Space Mutants (NES)
Simpsons Bart vs The World (NES)
Simpsons Bart Meet Radiactive Man (NES)
(Y otros más que no he revisado)


Algunas imágenes de textos dumpeados:


Simpsons Bart vs The World


Simpsons Bart vs Space Mutants






Y en el juego que comenzé a trabajar:


The Ren & Stimpy Show







3.- Robocop vs The Terminator (NES)


Mientras reivsaba que juego podia traducir me di cuenta de la existencia de este título, pero algo llamo mi atención, la desarroladora era Virgin, y recordé otro juego con compresión de la misma desarroladora, exacto "M.C KIDS", así que tome el decompresor sin modificar, solo depure algunas direcciones y la ROM, y grande fue mi sorpresa:




Pero, sin embargo, debo reconstruir la herramienta para manejar mejor los caracteres no ASCII, también debo agregar que ya se donde está su tabla de punteros, así que toca incluirlo y queda una mega herramienta. Quizás le haga un repaso a M.C kids.


4.- Star Fox 2 (SNES)


Bueno este a sido un dolor de cabeza, si bien el texto es facil de dumpear, es simple DTE. Los gráficos son otro cuento, el chip que incluye, el FX , que permite medio rendelizar en 3D (Algo bastante adelantado a su época). Sobra decir que está todo comprimido y no he podido dar con la tabla de las letras. Sin embargo he descomprimido bastante offset de gráficos, (y son bastantes), un proyectoq ue veo que me supera más que nada por la gran inversión de tiempo que se debe dedicar ( además no me considero artista gráfico), me gustaría delegar esto a alguien que tome el liderazgo del proyecto.



Texto Principal Dumpeado









Así que se vienen cositas...


Última actualización
03-02-2025