neowar3020 escribió:franzrogar escribió:¿Cual es el problema? Pues que que no soy capaz de encontrar dónde demonios tiene package.bin la toc y, por ende, la división correcta de archivos...
entonces no viene tampoco esa info en el package_info.bin? mmm...
franzrogar escribió:Aún suponiendo que package_info.bin tenga el tamaño y el puntero de los archivos... ¿dónde están los nombres de los MPKs? Porque en package_info.bin no están... -_- o yo no los encuentro...
.....
0x00366BD0: "system_effect.mpk"
0x00366BE4: "battle_system-effe.mpk"
0x00366BFC: "arrow-effe.mpk"
0x00366C0C: "crystal-effe.mpk"
0x00366C20: "desion-effe.mpk"
0x00366C30: "effect/system/system_effect.mpk"
....
0x003686F0: "region/region_achievement.dat"
0x00368710: "sound/snd_region.scd"
0x00368728: "effect/%s.mpk"
0x00368738: "region/reward/DPB_get_tbl.dgt"
0x00368758: "region/reward/DPB_set_tbl.dst"
......
............
0x003621B8: "menu/battle/encount/encount_text_tim2/encount_one100.gim"
0x003621F4: "menu/battle/encount/encount_text_tim2/encount_one200.gim"
0x00362230: "menu/battle/encount/encount_text_tim2/encount_two100.gim"
0x0036226C: "menu/battle/encount/encount_text_tim2/encount_two200.gim"
0x003622A8: "menu/battle/encount/encount_text_tim2/encount_thr100.gim"
0x003622E4: "menu/battle/encount/encount_text_tim2/encount_thr200.gim"
0x00362320: "menu/battle/encount/encount_text_tim2/encount_for100.gim"
0x0036235C: "menu/battle/encount/encount_text_tim2/encount_for200.gim"
0x00362398: "menu/battle/encount/encount_text_tim2/encount_fiv100.gim"
0x003623D4: "menu/battle/encount/encount_text_tim2/encount_fiv200.gim"
0x00362410: "menu/battle/encount/encount_text_tim2/encount_six100.gim"
0x0036244C: "menu/battle/encount/encount_text_tim2/encount_six200.gim"
0x00362488: "menu/battle/encount/encount_text_tim2/encount_sev100.gim"
0x003624C4: "menu/battle/encount/encount_text_tim2/encount_sev200.gim"
0x00362500: "menu/battle/encount/encount_text_tim2/encount_eht100.gim"
0x0036253C: "menu/battle/encount/encount_text_tim2/encount_eht200.gim"
0x00362578: "menu/battle/encount/encount_text_tim2/encount_nin100.gim"
0x003625B4: "menu/battle/encount/encount_text_tim2/encount_nin200.gim"
0x003625F0: "menu/battle/encount/encount_text_tim2/encount_ten100.gim"
0x0036262C: "menu/battle/encount/encount_text_tim2/encount_ten200.gim"
0x00362668: "menu/battle/encount/encount_text_tim2/encount_gst100.gim"
0x003626A4: "menu/battle/encount/encount_text_tim2/encount_gst200.gim"
0x00362840: "menu/battle/encount/encount_text_tim2/encount_org200.gim"
0x0036287C: "menu/battle/encount/encount_text_tim2/encount_zako_01.gim"
....
codestation escribió:franzrogar escribió:Aún suponiendo que package_info.bin tenga el tamaño y el puntero de los archivos... ¿dónde están los nombres de los MPKs? Porque en package_info.bin no están... -_- o yo no los encuentro...
En el eboot.bin . Lo desencripte con el prxdecryptor y luego le hice un desensamblado con prxtool y alli estan los nombres de los mpk y muchos otros más.
Pequeño extracto de nombres [...]
Hablando un poco de los archivos .gim, me da mala espina en la sección en que se encuentran:
Un extracto (ummm, menu....text........dios, que no este todo el texto en imagenes!!!) [...]
Le echare un vistazo al formato gim para conocer de donde puedo sacar su tamaño, ver como los consigo extraer y salir de la grán duda.
P.D.: aun sin sinformación de como dividir el bigfile principal :/
franzrogar escribió:De hecho, todos los archivos que extrae por defecto el programa que pusiste son los correspondientes al primer MPK Yo extraje unos 15 de prueba. Sólo habría que revisar (no he tenido tiempo) por qué en los PNGs añade al final, después de la cadena de cierre, algunos bytes que no son suyos (explicación en la página anterior).
codestation escribió:franzrogar escribió:De hecho, todos los archivos que extrae por defecto el programa que pusiste son los correspondientes al primer MPK Yo extraje unos 15 de prueba. Sólo habría que revisar (no he tenido tiempo) por qué en los PNGs añade al final, después de la cadena de cierre, algunos bytes que no son suyos (explicación en la página anterior).
No me habia fijado, esos 4 bytes al final de cada fichero parece que estan de más. Probablemente se arregle restando 4 al tamaño de los archivos antes de iniciar la copia. Lo mirare mañana (24 de diciembre a las 11pm y yo en la PC con un editor hexadecimal abierto )
P.D.: Feliz Navidad
FILE *tfd = fopen(filename, "w");
if(tfd) {
while(file_size--) {
fread(&tmp, 1, 1, fd);
fwrite(&tmp, 1, 1, tfd);
}
fclose(tfd);
} else {
kaiseki escribió:Yo de programación sé bien poco, estoy en proceso de aprender (estudio informática), pero de japonés se bastante, entre yo y el google hacemos uno xDD. Yo no soy partidiario de los juegos en version USA O PAL, ya que ponen las voces americanas y capan bandas sonoras, así que pienso ayudar en todo lo que haga falta para parchear la versión JAP al español.
Ya me diréis si queréis mi ayuda.
Un saludo.
wiikeyo escribió:desgraciadamente no se como traducirlo,pero puedo ser de ayuda traduciendolo de la version inglesa
franzrogar escribió:EDITADO: Me pondré a extraer todo lo que pueda y a decompilar para ver qué podemos ir traduciendo (cuanto menos, imágenes hay para un rato y... por lo visto hasta ahora... el texto lo han hecho en capas de imágenes [si son bestias]). ¿Qué tal el dominio de editores gráficos? Tal que Photoshop, GIMP...
neowar3020 escribió:franzrogar escribió:EDITADO: Me pondré a extraer todo lo que pueda y a decompilar para ver qué podemos ir traduciendo (cuanto menos, imágenes hay para un rato y... por lo visto hasta ahora... el texto lo han hecho en capas de imágenes [si son bestias]). ¿Qué tal el dominio de editores gráficos? Tal que Photoshop, GIMP...
Pues excelente, mientras no sea la historia no hay problema, que ahorita ando traduciendo el manga de MonsterHunter2 al ingles y todavia me falta bastante, pero si es el menu y las cosas de items le daria prioridad para ya tenerlo, solo me dirias en que formato quedan *tga? para regresarte el rar y que lo recompiles.
franzrogar escribió:neowar3020 escribió:franzrogar escribió:EDITADO: Me pondré a extraer todo lo que pueda y a decompilar para ver qué podemos ir traduciendo (cuanto menos, imágenes hay para un rato y... por lo visto hasta ahora... el texto lo han hecho en capas de imágenes [si son bestias]). ¿Qué tal el dominio de editores gráficos? Tal que Photoshop, GIMP...
Pues excelente, mientras no sea la historia no hay problema, que ahorita ando traduciendo el manga de MonsterHunter2 al ingles y todavia me falta bastante, pero si es el menu y las cosas de items le daria prioridad para ya tenerlo, solo me dirias en que formato quedan *tga? para regresarte el rar y que lo recompiles.
Por ahora, todas las imágenes que he ido encontrando están en formato .gim. Tengo el conversor oficial de Sony, así que no hay pérdidas y las convierto en su salida natural .tga
Por ahora, todas las imágenes corresponden a partes del menú (por ejemplo, nombres de contrincantes cuando dice lo de «vs Quien_sea» y demás), es decir, las partes de texto que tienen efectos visuales. A parte de un par de iconos sueltos por allí.
franzrogar escribió:PD: Sí, ya sé... pero ¿cómo darse cuenta dónde se mostraba el cambio?... Pues haciendo que, de verse, sea muy llamativo
EDITADO: «Luciérnaga verde» es «Warrior of Light» (Guerrero de la Luz) en modo «Combate rápido».
raymc escribió:Hola, yo tambien querria ayudar, tengo mucho tiempo libre asi que podria encontrar y traducir partes del juego , se algo de programacion y edicion hexadecimal aunque no mucho, por favor decirme que editor (nombre) usais y en k modo (ej: unicode) en seguida me pondria a intentar por lo menos traducir . Saludos.
franzrogar escribió:No sigo aquí, pondré una página web completa porque la información necesaria y las explicaciones son tan largas, que resultaría incómodo de leer aquí en un foro.
kaiseki escribió:franzrogar escribió:No sigo aquí, pondré una página web completa porque la información necesaria y las explicaciones son tan largas, que resultaría incómodo de leer aquí en un foro.
Nos dejas con la miel en la boca, justo en la importante xDD. Es broma no pasa nada, gracias por el tuto . Ya tengo ganas de trastear con esto.
Saludos.
franzrogar escribió:kaiseki escribió:franzrogar escribió:No sigo aquí, pondré una página web completa porque la información necesaria y las explicaciones son tan largas, que resultaría incómodo de leer aquí en un foro.
Nos dejas con la miel en la boca, justo en la importante xDD. Es broma no pasa nada, gracias por el tuto . Ya tengo ganas de trastear con esto.
Saludos.
Ya está
GUÍA - TUTORIAL
kaiseki escribió:franzrogar escribió:GUÍA - TUTORIAL
¡Oh yeah! Tú eres de los míos, de tirarse toda la noche trasteando, como molas . Me parece que hoy no duermo trasteando .
Un saludo.
Jxus escribió:me parece muy interesante esto de traducir el dissidia, por que la verdad esperar medio año para tenerlo en español ya ves... Aunque sean los menus y tal (sin historia) la verdad que no me importaria, me gustaria ayudaros pero no entiendo NADA de esto. Si quereis que os eche una mano a algo facilillo darme un toque salu2
franzrogar escribió:Jxus escribió:me parece muy interesante esto de traducir el dissidia, por que la verdad esperar medio año para tenerlo en español ya ves... Aunque sean los menus y tal (sin historia) la verdad que no me importaria, me gustaria ayudaros pero no entiendo NADA de esto. Si quereis que os eche una mano a algo facilillo darme un toque salu2
Ok. Sólo una cosita... esperarás «medio año» para la versión americana (que no implica que tenga el español). Para el español de España, aún no hay fecha (puede ser en diciembre del año que va a empezar).
Ponisito escribió:Sin intención de ofender y con todo el respeto del mundo, pero me parece una chorrada. Te sale mucho más sencillo coger las voces japonesas e insertarlas en la versión PAL o USA a pegarte el palizón de traducir todas las string table. Como bien se hizo con el Crisis Core FFVII, y siendo ambos juegos de SE seguramente el formato de audio será el mismo y el mismo método de sobreescribirlos.
Además de que hay muchos videos del narrador que no tienen subtítulos, sino que los textos están incrustados en el video y eso no lo podéis traducir.
Y luego no es solamente traducir Kanjis con babelfish, porque hay términos y habilidades que tendréis que ir trasteando y compilando la ISO cada dos por tres para ver si tiene sentido.
Pero bueno, cada uno que haga lo que quiera.
PD: Irónicamente, yo estoy esperando la versión USA para poder tener las voces en inglés, las japos no me molan demasiado.
buddy669 escribió:ola buenas...
estoy siguiendo los pasos e "intentar" traducir...
pero solo no puedo,necesito algo de ayuda...
asik si alguien lo desea,podria ayudarme
gracias
me parece una tonteria traducir un juego que ya va a ser traducido que no traducir otros juegos que nunca estaran en ingles y que llevamos esperando una traduccion de alguna alma caritativa.
santhy escribió:Muy buenas!
Hace bastante tiempo que no me paso por EOL, (he estado ocupado ); y he visto cómo se ha montado en 8 días todo un equipo de gente dispuesta a traducir un juego.
Por tanto, este mensaje lo veo ahora por primera vez y tampoco tengo el juego.
Si aún no teneis programador, por favor, decidme cuanto ocupa más o menos el archivo que teneis que "desmenuzar" (porque desempaquetar sería quitar todos los trozos ¿no? ^_^) y si no es demasiado tal vez haya otra forma...
Lo digo porque C no es mi fuerte tampoco, pero PHP ya es otra cosa
Si no es demasiado pesado (es decir, mi memoria "puede" con el procesado del archivo; supongo que sí) tal vez pudiera hacerlo.
No tengo el archivo como ya he dicho, así que no puedo ver aquí el hexadecimal xD
Y oye, franzrogar, ¿por qué hay que buscar byte-a-byte?
[Abriendo la cadena en modo 1byte-1caracter (en cualquier codificación) se puede hacer $cadena_a_buscar = chr(0x4D).chr(0x49).chr(0x47).[ETC] (siendo . el operador de concatenación) hasta completar la secuencia de caracteres y luego hacer strpos($cadena_que_contiene_archivo_entero, $cadena_a_buscar) ]
De la forma entre corchetes, se puede obtener la posición del inicio del paquete; de una forma similar se encuentra la cadena fin (teniendo en cuenta que inicio < fin; sino se puede hacer que el programa trunque el archivo por el comienzo) y luego tan solo hay que copiarlo.
Y si no me equivoco, el offset tiene que ser [posición_inicio] en hexadecimal. Esto último tendría que comprobarlo, acabo de pensarlo.
Feliz Navidad!
minihuesos escribió:compañeros estais haciendo un trabajo fascinante y os mando todo mi apoyo para que consigais traducirlo suerte y un saludo!!
Primero, decir que no tienes «intención de ofender» y decir que el trabajo que estamos haciendo «parece una chorrada», es la mayor mentira que pueda existir. El indicar que traducimos con Babelfish (lo que sea eso) indica que ni has tenido la decencia de molestarse en leer este hilo. El resto es una soberana idiotez sin sentido. Sinceramente, si no tienes nada que hacer más que marcar tu ironía, por favor, no envíes más spam si no tienes ninguna crítica constructiva. El que tenga que malgastar mi tiempo en responder un mensaje que no aporta nada no me hace la menor gracia.
int buscar(string myFile ){
int offset=0, chunk, step=65535, contador=0, tope=16;
byte[] databin= {0xd6,0xe3,0x69,0xa0,0x50,0xfd,0xe5,0x23,0x10,0x75,0xa4,0xcc,0x86,0xbc,0x8e,0xec};
byte[] buffer = new byte[step];
int inicio=0,acierto_inicio=0,i;
if (myFile=="") return -1;
BinaryReader br = new BinaryReader( File.Open(myFile, FileMode.Open, FileAccess.Read));
while ((chunk=br.Read (buffer,0,step ))>0 ){
inicio=0;
while (inicio<step) {
if (contador>0) {
for(i=contador;(i<databin.Length);i++){
if (databin[i]==buffer[i-contador]) {
contador++;
} else {
contador=0;
inicio++;
i=20;
};
}
};
if (contador==tope) {
br.Close(); return (offset-contador);
}; //--------------------- objetivo logrado
//vuelta a empezar :(
acierto_inicio=busca_inicio(buffer,databin,step,inicio);
if (acierto_inicio!=-1)
{ // hemos encontrado algo que empieza igual :)
for( i = 0;(i<databin.Length) && (i+acierto_inicio<step);i++) {
if (databin[i]==buffer[i+acierto_inicio]) {
contador++;
} else {
contador=0;
acierto_inicio++;
i=20;
};
};
if (contador==tope) {
br.Close();
return (offset+acierto_inicio);
};// ------ objetivo logrado
inicio=acierto_inicio;
} else {
inicio=step+1;
};
}
offset+=step;
label1.Text = offset.ToString();
Application.DoEvents ();
};
br.Close();
return -1;
}
int busca_inicio(byte[] in_buff, byte[] data, int tope,int inicio)
{
int i=0;
for (i=inicio;i<tope;i++){
if (in_buff[i]==data[0]) return i;
};
return -1;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PACKAGE_SIZE 636454912
char gim_header[] = {0x4D, 0x49, 0x47, 0x2E, 0x30, 0x30, 0x2E, 0x31, 0x50, 0x53, 0x50, 0x00};
char gim_footer[] = {0x47, 0x69, 0x6D, 0x43, 0x6F, 0x6E, 0x76, 0x20, 0x31, 0x2E, 0x34, 0x31, 0x00};
long find_data(FILE *fd, char *data, long size, long current_offset, long end_offset) {
char tmp[16];
while(!feof(fd) || (current_offset + size) <= end_offset) {
fseek(fd, current_offset, SEEK_SET);
fread(&tmp, size, 1, fd);
if(!memcmp(data, tmp, size)) {
return ftell(fd) - size;
} else {
current_offset++;
}
}
return -1;
}
int save_file(FILE *fd, int counter, long gim_offset, int size) {
char filename[64];
unsigned int data;
sprintf(filename, "%i_%X.gim", counter, gim_offset);
FILE *tfd = fopen(filename, "w");
if(fd) {
fseek(fd, gim_offset, SEEK_SET);
while(size) {
fread(&data, 4, 1, fd);
fwrite(&data, 4, 1, tfd);
if(size > 4) {
size -= 4;
} else {
fread(&data, size, 1, fd);
fwrite(&data, size, 1, tfd);
size = 0;
}
}
fclose(tfd);
return 0;
}
return -1;
}
int main(int argc, char **argv) {
long gim_offset;
long gim_eof;
long current_offset = 0;
int size;
int counter = 0;
FILE *fd = fopen("package.bin","r");
if(fd) {
while((gim_offset = find_data(fd, gim_header, sizeof(gim_header), current_offset, PACKAGE_SIZE)) != -1) {
printf("Found gim file at offset %X\n", gim_offset);
if((gim_eof = find_data(fd, gim_footer, sizeof(gim_footer), gim_offset + sizeof(gim_header), PACKAGE_SIZE)) == -1) {
fprintf(stderr, "Error, can't find footer of gim file at offset %X. Aborting\n", gim_offset);
break;
}
size = gim_eof + sizeof(gim_footer) - gim_offset - 4;
printf("Size of gim file: %i bytes\n", size);
if(save_file(fd, counter, gim_offset, size) == -1) {
fprintf(stderr, "Error, can't save file %i_%X.gim. Aborting\n", counter, gim_offset);
break;
}
current_offset = gim_offset + size;
fseek(fd, current_offset, SEEK_SET);
counter++;
}
fclose(fd);
} else {
fprintf(stderr, "Error, can't find package.bin\n");
}
return 0;
}
santhy escribió:Y lo de byte a byte....
Es cierto, pero lo que se puede hacer es buscar el 1er byte (buscamos 0x0ABCDEFA en 0xFF0AC00ABCDEFADDE4) de esta forma: buscamos todos los 0x0A en el archivo (encontramos 0xFF0AC00ABCDEFADDE4). En cada uno de los encontrados buscamos lo que falta (en 0xFF0ACO != 0x0ABC..., pero en el otro 0ABCDEFA(DDE4...) == 0ABCDEFA).
Ya lo hemos encontrado.
Haré una prueba a ver si funciona en la práctica
Nordal escribió:[... código]
[...código]
Esta función retorna el punto de inicio de la cadena hex dada en DATABIN. Funciona, yo la uso para encontrar el inicio del fichero Data.Bin en el parcheador del MHP2G.
Con unas ligeras modificaciones puede que os sirva
santhy escribió:Si os interesa, tengo un script en PHP que ha funcionado para archivos pequeños.
[...]
Ahora me falta saber como quereis que extraiga las partes entre las que están las cadenas mágicas.
Contactad conmigo por MP y hablamos por MSN o GTalk si quereis, que es más rápido
codestation escribió:Aqui esta el extractor de los archivos gim. En total extrajo 4820 archivos, 143.3 MiB. Los nombres de archivo tienen el siguiente formato: [numero_fichero]_[offset].gim. Tengo algunos problemas con el Virtualbox asi que no pude convertirlos/revisarlos todos con el GimConv.
[... código]
#/bin/bash
echo -e "Converting from GIM to TGA"
LIST=`ls *.gim`
for i in $LIST ;
do wine GimConv.exe $i -TGA $i.tga;
echo -e "$i converted\n";
done
Jxus escribió:como va el tema chicos? Aveis conseguido encriptar ya algun dato en la iso?
// $bcad es la cadena binaria buscada (el 0xFF0A....); se importa a la función desde fuera.
// Leemos 30 Bytes (se puede asegurar que habrá 6 bytes entre cabecera y pie
$kb = fread($fp, $READSIZE);
$offset = NULL; // Por defecto
$more = fread($fp, strlen($bcad)+1); // Prelectura. Se hace por si se encuentra parcialmente en $kb la cadena.
// Para ello se lee $kb+{longitud_de_la_cadena}+1
if($more) // Si es el fin del archivo no hay prelectura y no debemos retroceder.
fseek($fp, -strlen($bcad) , SEEK_CUR);
$READSIZETOTAL = strlen($kb);
debug_lec($kb, $more);// basicamente dice "Estamos leyendo [representacion hexadecimal de $kb y $more]
if(($p = strpos($kb, $bcad)) !== FALSE) {
$offset = ftell($fp) - $READSIZETOTAL + $p; // posicion de lectura ultima (ftell-$READSIZE) porque leimos $READSIZE + posicion relativa.
if($exceso) $offset += strlen($bcad); // Exceso es una variable pasada a la funcion para saber si incluir la cadena en el offset (para el pie)
$hexo = '0x'.dechex($offset);
// Encontrada
echo "Encontrada $acad en $offset ($hexo)".NL;
usleep(5);
} elseif(FALSE !== ($p = strpos($kb.$more, $bcad))) { // Puede ser una busqueda parcial. Buscamos un poco más.
$offset = ftell($fp) - $READSIZETOTAL + $p;
if($exceso) $offset += strlen($bcad); // Igual que en el if() anterior
$hexo = '0x'.dechex($offset);
// Encontrada
echo "Encontrada con prelectura $acad en $offset ($hexo)".NL;
usleep(5);
} //else echo "Pero no hemos encontrado nada".NL.NL;
if($PRIMERO) $PRIMERO = 0;
return $offset;
}