Registrarse

[RH - ASM] ¿Cómo puedo crear un pointer "custom"?

Estado
Cerrado para nuevas respuestas.

MegaParadise

King of Games
Buenas! Actualmente ando trabajando en un proyecto de traducción (Yugioh GX - Duel Academy, GBA), pero tengo una serie de graves problemas que me están calcinando el cerebro. El juego esta estructurado en bloques de textos, por lo que repointear textos simplemente no es una opción. Pude ingeniármelas para traducir casi todo lo que me encuentro, especialmente los diálogos convencionales de los personajes. El problema esta realmente en una sección que contiene toda la información que son mostrados por comandos y en los menúes (cosas como días, meses, títulos, etc.). Por ejemplo, el comando "$101" es el responsable de mostrar el título "King of Games" en cualquier cuadro de texto en el que se introduzca, ahora, si buscas donde estan los títulos de donde el comando "$101" los lee te encuentras con que toda la información de títulos, días, meses y demás esta almacenada en el mismo bloque (así como información del mismo gameplay, como la palabra "invocar", "colocar" y demás), todas separadas entre si por valores Hex "00" (que son decodificados como "." en las tablas). Entonces, los títulos aparecen así "[...]..King of Games..Prince of games..[...]". Yo necesito repointear de alguna forma estas cadenas de texto particulares sin tocar todo el resto del bloque. La idea sería hacer un comando que interprete la siguiente función: "Tomar el texto "King of Games", solo el que esta en el offset 0xXXXXXXX, e reinterpretarlo para que se lea "Rey de los Juegos". O cualquier otro texto particular que sea parte del bloque.
Estuve averiguando un poco, y me enteré de las funciones ASM, pero no encontré una buena guía que me resuelva esta duda puntual. Gracias.
El bloque se ve algo así:
 
Última edición:

MegaParadise

King of Games
please i want to know how i can see the text in hex ,thank you
Use an Hex editor software (i use HxD). Then just open the rom in the software. You can locate the texts on the rom by searching them (if using HxD: Go to Search > Find > Write the text you want to find. Make sure to check "all"), but have in mind that not all games use the same system, so maybe you will not find any text on the Hex editor. Most of the times you find it, so try.
 

eing

Miembro de honor
Miembro de honor
Buenas! Actualmente ando trabajando en un proyecto de traducción (Yugioh GX - Duel Academy, GBA), pero tengo una serie de graves problemas que me están calcinando el cerebro. El juego esta estructurado en bloques de textos, por lo que repointear textos simplemente no es una opción. Pude ingeniármelas para traducir casi todo lo que me encuentro, especialmente los diálogos convencionales de los personajes. El problema esta realmente en una sección que contiene toda la información que son mostrados por comandos y en los menúes (cosas como días, meses, títulos, etc.). Por ejemplo, el comando "$101" es el responsable de mostrar el título "King of Games" en cualquier cuadro de texto en el que se introduzca, ahora, si buscas donde estan los títulos de donde el comando "$101" los lee te encuentras con que toda la información de títulos, días, meses y demás esta almacenada en el mismo bloque (así como información del mismo gameplay, como la palabra "invocar", "colocar" y demás), todas separadas entre si por valores Hex "00" (que son decodificados como "." en las tablas). Entonces, los títulos aparecen así "[...]..King of Games..Prince of games..[...]". Yo necesito repointear de alguna forma estas cadenas de texto particulares sin tocar todo el resto del bloque. La idea sería hacer un comando que interprete la siguiente función: "Tomar el texto "King of Games", solo el que esta en el offset 0xXXXXXXX, e reinterpretarlo para que se lea "Rey de los Juegos". O cualquier otro texto particular que sea parte del bloque.
Estuve averiguando un poco, y me enteré de las funciones ASM, pero no encontré una buena guía que me resuelva esta duda puntual. Gracias.
El bloque se ve algo así:
Creo que no has de buscar el puntero de estos textos, es decir donde empieza el texto1, texto2..
Por que por lo que dices, no parece estar hecho en forma de array, si no mas bien una string muy larga, que esta siendo separada por puntos.
De tal manera que el proceso sería leer la cadena de caracter por caracter hasta estar en la posicion de la palabra que se esta buscando y guardarla en la variable que mencionas. ($101) dependiendo de la posicion que tu le pasas.
Separando los textos por “.”

Seria algo asi en pseudocodigo.

Var101= leerCadena(0);

leerCadena(posicionPalabra){
contador = 0;
Texto = LeerCaracterCadena();
While (CaracterCadena!=“.” & posicionPalabra>=contador)
If (CaracterCadena = “.”)
{
Contador++;
}
else {
Texto = Texto + LeerCaracterCadena
}
return Texto;
}

Con este ejemplo leeriamos la primera palabra, si pusieramos un 1 a la funcion la segunda palabra.

¿que por que hicieron esto y no un array?
Supongo que por motivos de espacio, para no tener que repuntear textos uno por uno, o la tabla entera en caso de que necesiten meter mas entradas.
Aunque esto te digo que me parece una tonteria puesto que lo estas haciendo desde codigo C..

Así que eso, repuntea solo la string del principio (la que lleva todo el churro de esos datos) y modificala a ver si resulta que es así.

en fin, espero que esta teoria te sirva de algoy si no pues nada, que tengas un buen dia ajja
 

MegaParadise

King of Games
Creo que no has de buscar el puntero de estos textos, es decir donde empieza el texto1, texto2..
Por que por lo que dices, no parece estar hecho en forma de array, si no mas bien una string muy larga, que esta siendo separada por puntos.
De tal manera que el proceso sería leer la cadena de caracter por caracter hasta estar en la posicion de la palabra que se esta buscando y guardarla en la variable que mencionas. ($101) dependiendo de la posicion que tu le pasas.
Separando los textos por “.”

Seria algo asi en pseudocodigo.

Var101= leerCadena(0);

leerCadena(posicionPalabra){
contador = 0;
Texto = LeerCaracterCadena();
While (CaracterCadena!=“.” & posicionPalabra>=contador)
If (CaracterCadena = “.”)
{
Contador++;
}
else {
Texto = Texto + LeerCaracterCadena
}
return Texto;
}

Con este ejemplo leeriamos la primera palabra, si pusieramos un 1 a la funcion la segunda palabra.

¿que por que hicieron esto y no un array?
Supongo que por motivos de espacio, para no tener que repuntear textos uno por uno, o la tabla entera en caso de que necesiten meter mas entradas.
Aunque esto te digo que me parece una tonteria puesto que lo estas haciendo desde codigo C..

Así que eso, repuntea solo la string del principio (la que lleva todo el churro de esos datos) y modificala a ver si resulta que es así.

en fin, espero que esta teoria te sirva de algoy si no pues nada, que tengas un buen dia ajja
Joer me dejaste descolocado. He aquí mi problema: ignoro de programación. Entonces, consecuentemente, no entendí medio cacahuate de lo que me dijiste jajaja. Entendí la idea, pero no la teoría. ¿habrá una forma de simplificarlo para un burro como yo? Realmente quiero traducir este juego, pero me esta dando unos problemas muy malos. Saludos y gracias por la respuesta!
PD: Repointer toda la cadena de texto es algo imposible, es demasiado larga. No hay lugar donde repuntearla xd
 

MegaParadise

King of Games
Joer me dejaste descolocado. He aquí mi problema: ignoro de programación. Entonces, consecuentemente, no entendí medio cacahuate de lo que me dijiste jajaja. Entendí la idea, pero no la teoría. ¿habrá una forma de simplificarlo para un burro como yo? Realmente quiero traducir este juego, pero me esta dando unos problemas muy malos. Saludos y gracias por la respuesta!
PD: Repointer toda la cadena de texto es algo imposible, es demasiado larga. No hay lugar donde repuntearla xd
Otra cosita: mi objetivo es repointear textos puntuales aprovechando que estan separados entre si por bytes 00. Entonces, quiero reopintear uno a uno cada titulo, cada día, etc. Por eso prefiero no tener que tocar todo el bloque.
 

Acimut

Profesional de WaH
Esto es lo que pude ver en HxD:

0x17edc04 //3E C8 46 09 //puntero
0x146C83E //offfset del texto: Basic.Language Selection..

0x17EDC08 //58 C8 46 09 //puntero a los string
0x146C858 //offfset del texto: Title.King of Games.Prince of Games.Celebrity Duelist.Elite Duelist.Honored Duelist.Shrewd Duelist..


0x17F0D6C bc c8 46 09 //puntero
0x146C8BC //offfset del texto: Superior Duelist..

Cada string está separado por un 00 y cada grupo de strings termina en 00 00
Entonces, lo único que necesitas es identificar el offset de cada grupo de strings, convertirlo en puntero y buscarlo en HxD(así lo hice yo).
Si sabes donde está el puntero, pues puedes repuntear ¿no?

Así, tendrías que ir repunteando buscando espacio libre. Además, no olvidar cambiar los puntos y el doble punto en el editor hexadecimal, si te aparece en hex como 2E cambiar por 00, al final 2E 2E por 00 00 indicando que ahí acaba el grupo de strings.

Title.King of Games.Prince of Games.Celebrity Duelist.Elite Duelist.Honored Duelist.Shrewd Duelist..
100/0x64 bytes
Código:
54 69 74 6C 65 00 4B 69 6E 67 20 6F 66 20 47 61 6D 65 73 00 50 72 69 6E 63 65 20 6F 66 20 47 61 6D 65 73 00 43 65 6C 65 62 72 69 74 79 20 44 75 65 6C 69 73 74 00 45 6C 69 74 65 20 44 75 65 6C 69 73 74 00 48 6F 6E 6F 72 65 64 20 44 75 65 6C 69 73 74 00 53 68 72 65 77 64 20 44 75 65 6C 69 73 74 00 00
Título.Rey de los Juegos.Príncipe de los juegos.Duelista de Celebridades.Duelista de Élite.Duelista de Honor.Duelista Astuto..
126/0x7E bytes
Escribiendo directamente en HxD:
Código:
54 ED 74 75 6C 6F 2E 52 65 79 20 64 65 20 6C 6F 73 20 4A 75 65 67 6F 73 2E 50 72 ED 6E 63 69 70 65 20 64 65 20 6C 6F 73 20 6A 75 65 67 6F 73 2E 44 75 65 6C 69 73 74 61 20 64 65 20 43 65 6C 65 62 72 69 64 61 64 65 73 2E 44 75 65 6C 69 73 74 61 20 64 65 20 C9 6C 69 74 65 2E 44 75 65 6C 69 73 74 61 20 64 65 20 48 6F 6E 6F 72 2E 44 75 65 6C 69 73 74 61 20 41 73 74 75 74 6F 2E 2E
Cambiando los bytes 2E por 00:
Código:
54 ED 74 75 6C 6F 00 52 65 79 20 64 65 20 6C 6F 73 20 4A 75 65 67 6F 73 00 50 72 ED 6E 63 69 70 65 20 64 65 20 6C 6F 73 20 6A 75 65 67 6F 73 00 44 75 65 6C 69 73 74 61 20 64 65 20 43 65 6C 65 62 72 69 64 61 64 65 73 00 44 75 65 6C 69 73 74 61 20 64 65 20 C9 6C 69 74 65 00 44 75 65 6C 69 73 74 61 20 64 65 20 48 6F 6E 6F 72 00 44 75 65 6C 69 73 74 61 20 41 73 74 75 74 6F 00 00
 
Última edición:

MegaParadise

King of Games
Esto es lo que pude ver en HxD:

0x17edc04 //3E C8 46 09 //puntero
0x146C83E //offfset del texto: Basic.Language Selection..

0x17EDC08 //58 C8 46 09 //puntero a los string
0x146C858 //offfset del texto: Title.King of Games.Prince of Games.Celebrity Duelist.Elite Duelist.Honored Duelist.Shrewd Duelist..


0x17F0D6C bc c8 46 09 //puntero
0x146C8BC //offfset del texto: Superior Duelist..

Cada string está separado por un 00 y cada grupo de strings termina en 00 00
Entonces, lo único que necesitas es identificar el offset de cada grupo de strings, convertirlo en puntero y buscarlo en HxD(así lo hice yo).
Si sabes donde está el puntero, pues puedes repuntear ¿no?

Así, tendrías que ir repunteando buscando espacio libre. Además, no olvidar cambiar los puntos y el doble punto en el editor hexadecimal, si te aparece en hex como 2E cambiar por 00, al final 2E 2E por 00 00 indicando que ahí acaba el grupo de strings.

Title.King of Games.Prince of Games.Celebrity Duelist.Elite Duelist.Honored Duelist.Shrewd Duelist..
100/0x64 bytes
Código:
54 69 74 6C 65 00 4B 69 6E 67 20 6F 66 20 47 61 6D 65 73 00 50 72 69 6E 63 65 20 6F 66 20 47 61 6D 65 73 00 43 65 6C 65 62 72 69 74 79 20 44 75 65 6C 69 73 74 00 45 6C 69 74 65 20 44 75 65 6C 69 73 74 00 48 6F 6E 6F 72 65 64 20 44 75 65 6C 69 73 74 00 53 68 72 65 77 64 20 44 75 65 6C 69 73 74 00 00
Título.Rey de los Juegos.Príncipe de los juegos.Duelista de Celebridades.Duelista de Élite.Duelista de Honor.Duelista Astuto..
126/0x7E bytes
Escribiendo directamente en HxD:
Código:
54 ED 74 75 6C 6F 2E 52 65 79 20 64 65 20 6C 6F 73 20 4A 75 65 67 6F 73 2E 50 72 ED 6E 63 69 70 65 20 64 65 20 6C 6F 73 20 6A 75 65 67 6F 73 2E 44 75 65 6C 69 73 74 61 20 64 65 20 43 65 6C 65 62 72 69 64 61 64 65 73 2E 44 75 65 6C 69 73 74 61 20 64 65 20 C9 6C 69 74 65 2E 44 75 65 6C 69 73 74 61 20 64 65 20 48 6F 6E 6F 72 2E 44 75 65 6C 69 73 74 61 20 41 73 74 75 74 6F 2E 2E
Cambiando los bytes 2E por 00:
Código:
54 ED 74 75 6C 6F 00 52 65 79 20 64 65 20 6C 6F 73 20 4A 75 65 67 6F 73 00 50 72 ED 6E 63 69 70 65 20 64 65 20 6C 6F 73 20 6A 75 65 67 6F 73 00 44 75 65 6C 69 73 74 61 20 64 65 20 43 65 6C 65 62 72 69 64 61 64 65 73 00 44 75 65 6C 69 73 74 61 20 64 65 20 C9 6C 69 74 65 00 44 75 65 6C 69 73 74 61 20 64 65 20 48 6F 6E 6F 72 00 44 75 65 6C 69 73 74 61 20 41 73 74 75 74 6F 00 00
Buenas! Dos preguntitas: cómo llegaste a este offset 0x146C858? En mi HxD el offset donde empieza Title es 0x146C850. Y otra cosita: intenté repointear pero no funciono, de hecho, al cambiar los bytes del pointer de los titulos (los de King of Games.Prince Of Game, etc) no cambió nada, el juego los seguía leyendo de la misma forma que antes. Es todo muy raro, ¿como podría repointear? Ya escribí en un espacio libre la traducción de esa parte, usando correctamente los "00" para separar y al final. El offset de ese cacho es 013E8D30, por lo que tomé el 30 8D 3E y los puse reemplazando los bytes 58 C8 46, pero como dije antes, no cambió nada. ¿que estoy haciendo mal? :c
 

MegaParadise

King of Games
Buenas! Dos preguntitas: cómo llegaste a este offset 0x146C858? En mi HxD el offset donde empieza Title es 0x146C850. Y otra cosita: intenté repointear pero no funciono, de hecho, al cambiar los bytes del pointer de los titulos (los de King of Games.Prince Of Game, etc) no cambió nada, el juego los seguía leyendo de la misma forma que antes. Es todo muy raro, ¿como podría repointear? Ya escribí en un espacio libre la traducción de esa parte, usando correctamente los "00" para separar y al final. El offset de ese cacho es 013E8D30, por lo que tomé el 30 8D 3E y los puse reemplazando los bytes 58 C8 46, pero como dije antes, no cambió nada. ¿que estoy haciendo mal? :c
Ya descubrí porque 58 y no 50, me habia despistado jaja. Sigo sin poder repointear.
 

Acimut

Profesional de WaH
Me gustaría ayudarte con tu problema, así que si es posible, ¿me puedes enviar un archivo de guardado donde pueda ver los textos? no quiero jugar el tutorial, solo quiero ver si haciendo los cambios en Hex se ven reflejados en el juego.

La verdad no he jugado esta ROM, apenas la revisé muy rápidamente.
 

MegaParadise

King of Games
Me gustaría ayudarte con tu problema, así que si es posible, ¿me puedes enviar un archivo de guardado donde pueda ver los textos? no quiero jugar el tutorial, solo quiero ver si haciendo los cambios en Hex se ven reflejados en el juego.

La verdad no he jugado esta ROM, apenas la revisé muy rápidamente.
Los primeros dialogos del décano de la academia (es apenas le das new game) ya mencionan el comando "$101" que pone en pantalla "King of Games" (que esta relacionado con la sección de titulos que ya encontraste en la rom). Querés que te pase una save post-tutorial? Pasa que solo tengo saves de la ROM modificada (traducida) que estoy haciendo, y creo que corrompería una ROM normal.
 

Acimut

Profesional de WaH
Bien, según lo que voy probando, repuntear no hace diferencia alguna, además, mover de ubicación el byte del punto no soluciona nada, solo hace que algunas palabras terminen antes o no salgan en pantalla.
Supongo que la función que lee el texto tendrá como parámetro una ubicación de memoria y cuántos caracteres debe leer para cada palabra en específico. Después reviso con más calma.
 

MegaParadise

King of Games
Bien, según lo que voy probando, repuntear no hace diferencia alguna, además, mover de ubicación el byte del punto no soluciona nada, solo hace que algunas palabras terminen antes o no salgan en pantalla.
Supongo que la función que lee el texto tendrá como parámetro una ubicación de memoria y cuántos caracteres debe leer para cada palabra en específico. Después reviso con más calma.
Muy bien! Tomate tu tiempo, yo también me pondré a ver si puedo buscar una solución. Si llegas a algo, por favor avisame. Saludos, y muchas gracias!
 

Loz

_______
Bueno..., este juego lo vi hace mucho, pero mucho tiempo, me da mucho gusto que alguien lo este editando :).
Este juego, según recuerdo, no es tan fácil de editar, todo dependerá de que tan buena quieres que sea la traducción.

En cuanto a los punteros, si mal no recuerdo, el texto de este juego no tiene los punteros convencionales, menciono esto porque en aquel entonces no pude encontrarlos, pero tambien pude encontrar algunos punteros tradicionales, lo que me llevo a pensar de que este juego contaba con ambos sistemas de punteros

Mmm. ahora que hago memoria, en este juego se necesita realizar algunas ediciones aparte de la modificación de los textos, me refiero a los gráficos y a la fuente de caracteres que utiliza el juego.

Pero bueno, me da mucho gusto que alguien haya tomado este proyecto, ahora lo puedo tachar de mi lista.

Mucho animo para terminar tu proyecto.
:) :) :)
 
Estado
Cerrado para nuevas respuestas.
Arriba