Fuente Radiant Historia

Lugar donde se intentarán resolver problemas específicos
Responder
Avatar de Usuario
gadesx
Administrador
Administrador
Mensajes: 2011
Registrado: 24 Ene 2011, 16:43
Ubicación: El puche
Contactar:

Mensaje por gadesx » 05 May 2012, 16:22

No te preocupes por el tamaño de la rom, yo dejo dentro de las betas de mis juegos copias de archivos de insercion y tal, y aunque ocupe el juego el doble o mas luego tira bien. Logicamente cuando termino el juego quito todo ese material XD

Skye
Mensajes: 95
Registrado: 03 Ago 2011, 20:09

Mensaje por Skye » 05 May 2012, 21:12

Pues genial xD

Pero claro, el problema siempre son los punteros... lo cual lleva de vuelta a nuestro querido idx.
Bueno, esta tarde me he puesto con ello y tengo un programa que, a partir de la ruta de archivo (del ndx) te da el puntero en el bin. Tras pelearme con que si algunos punteros son "largos" (puntero+longitud+control) y otros son "cortos" (puntero+control), he sacado algo en Python que parece que funciona:

Código: (Python 3)
[spoil]

Código: Seleccionar todo

import sys
import struct

#mas o menos:
text_start = 23784716
text_end = 25363488

def hash_path(path):
    hashed = ord(path[0])
    for x in range(1, len(path)):
        add = ord(path[x])
        hashed = hex(hashed*37+add)
        hashed = hashed[-8:]
        hashed = hashed.lstrip('0x')
        hashed = int(hashed, 16)
    hashed = hex(hashed)
    return hashed

def get_idx_offset(hashed_path): #offset de la primera zona de punteros en idx
    hashed = int(hashed_path, 16)
    n = int('7FF', 16)
    offset = hashed & n #AND con 0x7ff
    offset = offset*6
    offset += 8
    return offset

def get_pointer_offset(idx_offset): #offset del puntero en sí
    with open('Data.idx', 'rb') as idx:
        idx.seek(idx_offset)
        pointer = int.from_bytes(idx.read(4), 'little')
        pointer = hex&#40;pointer <<6>> 7 #lsr de 7
        return pointer
        
def get_bin_pointer&#40;pointer_offset, filepath&#41;&#58; #offset del archivo en el bin
    size = None
    with open&#40;'Data.idx', 'rb'&#41; as idx&#58;
        #print&#40;pointer_offset&#41;
        idx.seek&#40;pointer_offset+1&#41; #saltamos el primer byte ya que no forma parte del puntero
        while True&#58;
            pointer = idx.read&#40;4&#41;
            pointer = struct.unpack&#40;'<L', pointer&#41;&#91;0&#93;
            #print&#40;hex&#40;pointer&#41;&#41;
            if pointer*4 > text_start and pointer*4 < text_end&#58; #solo con esto ahorra un montón de tiempo
                unknown = idx.read&#40;4&#41;
                if struct.unpack&#40;'<L', unknown&#41;&#91;0&#93; < 57500&#58; #el texto mas grande que he visto
                    size = struct.unpack&#40;'<L', unknown&#41;&#91;0&#93;
                    control = struct.unpack&#40;'<BB', idx.read&#40;2&#41;&#41;
                    controlpos = control&#91;1&#93;
                    controlchar = control&#91;0&#93;
                    #print&#40;hex&#40;controlpos&#41;, hex&#40;controlchar&#41;&#41;
                    if controlpos < len&#40;filepath&#41;&#58;
                        if ord&#40;filepath&#91;controlpos&#93;&#41; == controlchar&#58;
                            return pointer*4, size
                        else&#58;
                            offset = idx.tell&#40;&#41; +1
                            idx.seek&#40;offset&#41;
                    else&#58;
                        offset = idx.tell&#40;&#41; +1
                        idx.seek&#40;offset&#41;
                else&#58; #si es mas grande debe ser un puntero corto &#40;que omite el tamaño&#41;
                    control = struct.unpack&#40;'<BB', unknown&#91;&#58;2&#93;&#41;
                    controlpos = control&#91;0&#93;
                    controlchar = control&#91;1&#93;
                    if controlpos < len&#40;filepath&#41;&#58;
                        if ord&#40;filepath&#91;controlpos&#93;&#41; == controlchar&#58;
                            return pointer*4, size
                        else&#58;
                            offset = idx.tell&#40;&#41; -1
                            idx.seek&#40;offset&#41;
                    else&#58;
                        offset = idx.tell&#40;&#41; -1
                        idx.seek&#40;offset&#41;
            else&#58;
                offset = idx.tell&#40;&#41;
                idx.read&#40;3&#41;
                if idx.read&#40;1&#41; != b'\x00'&#58; #si es corto, solo hay que saltar 3 bytes
                    offset += 3
                else&#58;
                    offset += 7
                idx.seek&#40;offset&#41;

filepath = str&#40;input&#40;'Ruta de archivo&#58; '&#41;&#41;
hashed_path = hash_path&#40;filepath&#41;
idx_offset = get_idx_offset&#40;hashed_path&#41;
pointer_offset = get_pointer_offset&#40;idx_offset&#41;
bin_pointer = get_bin_pointer&#40;pointer_offset, filepath&#41;
print&#40;'Puntero&#58;', hex&#40;bin_pointer&#91;0&#93;&#41;&#41;
input&#40;&#41;
sys.exit&#40;&#41;
[/spoil]

Resultado:
[spoil][img]http://img190.imageshack.us/img190/78/punterorh.png[/img][/spoil]

Y funcionará hasta que a alguno entre los más de 13000 archivos le dé por no funcionar xD

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5615
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 05 May 2012, 21:33

Yo es que soy más vago que tú, de ahí que en el verano prefiera estar en la piscina en vez de delante del ordenador.

Todos los ficheros con textos y las fuentes están en una carpeta. El primer fichero de texto está en el offset de ese programilla que puse, así que ya tenemos el OFFSET_1. Después de extraer el texto de ese fichero, saltamos los 0xFF finales, ajustamos a 4 bytes, y ya estamos en el segundo, que empieza en otro offset, el OFFSET_2, ... , y así hasta el último. Pues sólo es cuestión de buscar esos offsets en el fichero, sin tener que mirar nombres, que eso cansa mucho, y guardar ésa dirección en cada fichero con los textos. A la hora de insertar los textos, como ya tenemos la dirección donde irá el offset, sólo hay que actualizarlo, y casi ni nos despeinamos.

Bueno, todo eso queda muy bonito en teoría. Pasarlo a la práctica ya cuesta un poco más, pero, como ya he dicho que soy más vago que tú, te lo dejo a ti ;)

Skye
Mensajes: 95
Registrado: 03 Ago 2011, 20:09

Mensaje por Skye » 06 May 2012, 12:20

Pues algo así he acabado haciendo. Al fin parece que he conseguido "domar" al idx (xD). Tengo un archivo csv con la ruta de archivo, su offset en el BIN, y el offset de su puntero en el IDX. Parece que los offsets están bien, en orden, pero no voy a mirar los 13911 archivos xD tras un scroll rápido no hay nada que haya saltado a la vista.
[img]http://img442.imageshack.us/img442/3919 ... adiant.png[/img]

Se puede ver más bonito en excel claro xD

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5615
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 06 May 2012, 13:12

Así quedará "más mejor" a la hora de extraer los textos, con nombrecito en los ficheros y todo, no como otros pelanas, que sólo saben poner números y luego la gente se pierde (si es que hay cada gentuza por ahí).

Por cierto, había un fichero "raro" en japonés entre medias. No sé por qué, pero me da la impresión que está en SJIS y no en otra codificación, que es lo que pensé en un principio (normal, no iba a mirar si era algo sencillo, que entonces no tendría gracia). Si lo tienes a mano, echa un ojo. Más que nada es por curiosidad, que eso de que haya un fichero entre tantos que sea distinto hace que destaque y pienses más en él, aunque luego no sirva para nada.

Tengo que mirar el extractor que hice en unicode, para decirte cómo sacar los códigos, por si te interesa sacar todos los textos, en cristiano y en japonés. Sé que en algún DVD lo tengo, así que es cuestión de tiempo que lo encuentre, pero hasta el verano tengo tiempo.

Skye
Mensajes: 95
Registrado: 03 Ago 2011, 20:09

Mensaje por Skye » 06 May 2012, 13:59

El fichero que decías que era HTM o algo así? Empieza en 0x16C1A6C, y según el nombre es un csv (place_table.csv). Justo después viene un place_table.msg, con los nombres en inglés. Supongo que el csv será lo mismo pero en japonés.
Lo he abierto en el Firefox y puesto codificación Shift-JIS, y parece una lista de algo. Pero claro, yo de japonés nada, así que no entiendo lo que dice.
Es algo así

Código: Seleccionar todo

&#22478;&#38272;&#21069;<br>
&#20013;&#22830;&#36890;&#12426;<br>
&#21830;&#26989;&#21306;<br>
&#35251;&#20809;&#21306;<br>
&#29579;&#23470;&#21069;&#24195;&#22580;<br>
&#38609;&#36008;&#23627;&#12300;&#12501;&#12451;&#12540;&#12509;&#12301;<br>
&#37202;&#22580;&#12300;&#12456;&#12523;&#12489;&#12521;&#12489;&#12301;<br>
&#23487;&#23627;&#12300;&#26376;&#12392;&#26143;&#12301;<br>
&#23487;&#23627;&#12300;&#26376;&#12392;&#26143;&#12301;<br>
&#23487;&#23627;&#12300;&#26376;&#12392;&#26143;&#12301;<br>
&#35023;&#36890;&#12426;<br>
&#23487;&#23627;&#12300;&#26376;&#12392;&#26143;&#12301;<br>
&#27494;&#22120;&#23627;&#12300;&#12487;&#12483;&#12489;&#12456;&#12531;&#12489;&#12301;<br>
&#37202;&#22580;&#12300;&#12456;&#12523;&#12489;&#12521;&#12489;&#12301;&#22320;&#19979;<br>
Y sigue...

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5615
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 06 May 2012, 15:05

Ése mismo. Le puse extensión ".htm" porque vi los "<br>", para no complicarme la vida. Con el gugueltransleitor se puede ver que sí son nombres, alguna lista que no se sabe para qué sirve, seguramente lo que indica el fichero siguiente.

Hay otro fichero "especial", al que puse la extensión ".log", y, si miras con detalle, verás para qué sirve. Si te lo digo pierde la gracia.

Skye
Mensajes: 95
Registrado: 03 Ago 2011, 20:09

Mensaje por Skye » 06 May 2012, 16:01

El ".log" empieza en 0x16AE30C y se llama "fonttbl.bin". Lo único que veo es que con codificación Unicode, salen los mismos caracteres y en el mismo orden que en la fuente. Pero no sé para que servirá...

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5615
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 07 May 2012, 13:57

Pues si vas a usar los código unicode, no uses los del tipo 0xFF??. Puedes reemplazarlos por 0x00?? para poder escribirlos con el teclado.

En http://jrgraphix.net/r/Unicode/ puedes ver que los 0xFF?? son los llamados "Halfwidth and Fullwidth Forms", que no son otra cosa que los ASCII de ancho diferente (usa sólo los que van de 0x20 a 0x7F).

Ye he encontrado lo que tenía del juego. Cuando tenga un ratillo cambio una cosilla para sacar en condiciones el fichero que llamo ".htm" y cambiar lo del 0xFF que he comentado. Después lo pondré por aquí, por si te puede servir de ayuda. Sólo hace la extración y funciona con las versiones americana y japonesa, sacando todo en unicode menos el htm, que lo hará en SJIS y sin necesidad de tener que cambiar la codificación para verlo (aunque no sé para qué vas a necesitarlo).

Skye
Mensajes: 95
Registrado: 03 Ago 2011, 20:09

Mensaje por Skye » 07 May 2012, 18:21

Pues por mi parte, tengo las rutas de los 25258 archivos del juego, con su offset en el BIN y el offset del puntero en el IDX, en un cómodo archivo csv. Lo que fastidiaba mis anteriores intentos era que algunos punteros tenían 2 pares de bytes de control en vez de 1. Y además no hay que preocuparse por los largos/cortos: sólo el primer puntero de un bloque es corto, el resto son todos largos.

Leñe, en un fin de semana he conseguido lo que llevo intentando desde agosto :D

Ahora habría que pensar en extraer, y luego el gran problema: insertar de vuelta. Sin que se cuelgue el juego.
Ains, si es que no tengo tiempo. Pero antes de empezar con historias de traducción y tal, mejor tenerlo todo listo.

xulikotony
Mensajes: 500
Registrado: 29 Jul 2011, 15:38

Mensaje por xulikotony » 08 May 2012, 07:42

Muy bien hecho Skye, parece que la inspiración te ha venido mejor el Finde, que en verano XD... y como dice CUE, el verano está para disfrutarlo yendo a la playa... :P

Ya he visto chorrecientos POSTS de que quieren traducir este juego... de habla hispana... ¡así que deseo lo mejor del proyecto!

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5615
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 08 May 2012, 11:41

¿Que quieren traducir o que quieren la traducción? Ya sabes cómo va esto, que muchos se equivocan al poner una palabra.

La cosa de los textos en unicode: http://www.mediafire.com/?3cd2wl0wunqq794
Si alguien necesita ayuda, pues que pulse F1 y diga eso de meideimeidei.

xulikotony
Mensajes: 500
Registrado: 29 Jul 2011, 15:38

Mensaje por xulikotony » 08 May 2012, 15:13

CUE escribió:¿Que quieren traducir o que quieren la traducción? Ya sabes cómo va esto, que muchos se equivocan al poner una palabra.

La cosa de los textos en unicode: http://www.mediafire.com/?3cd2wl0wunqq794
Si alguien necesita ayuda, pues que pulse F1 y diga eso de meideimeidei.
Eso es lo que DICEN muchos, "Queremos traducir", pero al final no pueden y eso mismo le ha pasado a Pleonex que ha hecho la herramienta de Layton, y ahora no traducen ni sabe él cómo van los avances. Y mira que Pleonex se molesta bastante en mejorar el programa Tinke, pero eso la gente poco agradecer y mucho darse fama. Pero me da bastante coraje que los programadores se dejen de lado y los "traductores" pues son más importantes que eso, pero sin el "programador" no hay "traducción", así más claro que el agua...
También otros apuestan por hacerlo hexadecimalmente xD, que me acuerdo yo extrayendo texto a pelo xD y me dio hasta risa

Skye
Mensajes: 95
Registrado: 03 Ago 2011, 20:09

Mensaje por Skye » 08 May 2012, 21:46

Muchas gracias CUE :D

Ya tengo toooodo extraído. Texto, gráficos, modelos 3D, scripts... 25258 archivos :) Si mis profesores siguen sin mandarme deberes (xD), mañana veré si puedo conseguir insertar de vuelta, y, a ser posible editando el IDX cuando haga falta. En teoría, si funciona no haría falta acoplar archivos al final ni hacer cosas raras, con actualizar todos los punteros mientras se inserta debería ser suficiente...

Extraer texto a pelo xDD que cosas. Por cierto, tendré que convertir los .txt de vuelta a .msg...

Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5615
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 09 May 2012, 13:34

Skye escribió:Por cierto, tendré que convertir los .txt de vuelta a .msg...
¡Qué pena! ¡Y los demás estaremos en la piscina! :twisted:

Lo iba a hacer yo porque estabas desaparecida, pero ahora, como estás de vuelta, tó'pa'ti.

Responder