Extracción e Inserción en textos y gráficos Devil Suvivor 2

Lugar donde se intentarán resolver problemas específicos
Responder
Avatar de Usuario
CUE
Administrador
Administrador
Mensajes: 5521
Registrado: 24 Ene 2011, 16:52

Mensaje por CUE » 15 Sep 2012, 09:19

Aquí está todo: http://www.mediafire.com/?aat11a75cxlwdrx

En realidad, cuando hablamos de SJIS nos referimos al codepage 932, que es más completo porque incluye los ASCII de 7 bits.

En el archivo hay 3 tablas:
- la ASCII, que es la chapuza para usar con el WindHex32
- la UTF8, que usaba antes en mis programas
- la UNICODE, que es la que uso ahora
Son la misma tabla, hechas por mí, 100% completas, no como las que circulan normalmente por la red, que las faltan los códigos finales. Yo suelo utilizar la UNICODE por eso de que cada carácter ocupa siempre 2 bytes, así no tengo que estar interpretando nada, que si ocupa un byte, que si no, etc.

Además de las tablas hay un fichero en formato HTML, por si quieres ver los caracteres de golpe, o para hacer copy&paste de ellos, que es lo que suelo usar yo.

¿Debo entender por lo que dices que sabes algo de programación? Si es así te paso una rutinita en C de las muchas que tengo para la transformación. Y/o te explico cómo lo hago, por si hay dudas.

Drek9
Mensajes: 10
Registrado: 04 Sep 2012, 16:14

Mensaje por Drek9 » 15 Sep 2012, 12:32

Sí, sé programar. No soy ningún experto pero me desemvuelvo. Aunque C no es mi fuerte, pero lo he usado.

Oky, te agradecería mucho tu rutinita, para ir échandole un ojo a la transformación.

Yo hasta ahora usaba el mapa de caracteres de windows para poder escribir el "abc" en doble ancho jaja. Pero más rápido copiar de tu html.

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

Mensaje por CUE » 15 Sep 2012, 15:09

La cosa de la tabla: http://www.mediafire.com/?kzs5z5czxjurcap

Lo miras y ya lo explicaré con un poco más de calma, que es bastante sencillo de entender.

También van las fuentes con sus datos, que son bastante simples, todas a 1bpp, de 8 ó 16 pixeles de ancho, cada una con su altura. Lo único a tener en cuenta es que los pixeles están al revés, de derecha a izquierda en vez de ir de izquierda a derecha, que es lo habitual. En los BMP no se nota porque los saco bien, pero hay que tenerlo en cuenta cuando se quiera leer/grabar la fuente.

Por cierto, los caracteres usados están en el ARM9. Busca los códigos SJIS de los números y los encontrarás.

Drek9
Mensajes: 10
Registrado: 04 Sep 2012, 16:14

Mensaje por Drek9 » 15 Sep 2012, 17:32

Por las fuentes no hay problema, son sencillas. La usada por los textos de la carpeta event es la 12x12, el resto supongo que será de los menus entre otros.

Le he estado echando un ojo, y me parece que necesito otros fuentes, por ejemplo con el método FileSize, FileLoad, Memory... ya que usa los métodos pero no están en el source que me pasaste.

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

Mensaje por CUE » 15 Sep 2012, 20:05

Pues no parece haber más fuentes. ¿Estás seguro de que no se trata de gráficos, que es una opción bastante común?

Drek9
Mensajes: 10
Registrado: 04 Sep 2012, 16:14

Mensaje por Drek9 » 15 Sep 2012, 22:35

Gráficos? Ah! Cuando dije fuentes en el segundo parrafo, yo me referia a sources adicionales a tabla.c

Y te nombre los metodos que al compilar me dice [Linker error] undefined reference to `FileSize' y así con el resto que te puse, porque claro, llama a esos métodos pero no existen en el fichero.

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

Mensaje por CUE » 16 Sep 2012, 10:22

Ah, coño. Para que luego me digan que las cervezas no afectan al funcionamiento normal del ser humano. Esas funciones son normaluchas, leer un fichero, coger el tamaño de un fichero, ... Lo tengo así para que cada uno use las que le apetezca, que siempre aparece un notas que dice que él prefiere hacerlo con no-sé-qué o que sólo sabe el no-sé-cuántos. Así dejo en el programa sólo las "cosas" básicas del lenguaje, y todas las funciones pueden ser sustituidas por las que más agraden. Además me sirve para añadir mensajitos por si pasa algo.

Más o menos deberían ser éstas:

Código: Seleccionar todo

/*----------------------------------------------------------------------------*/
int FileSize(char *filename) {
  FILE *fp;
  int   fs;

  if ((fp = fopen(filename, "rb")) == NULL) EXIT("File open error\n");
  fs = filelength(fileno(fp));
  if (fclose(fp) == EOF) EXIT("File close error\n");

  return(fs);
}

/*----------------------------------------------------------------------------*/
void *FileLoad(char *filename) {
  return(FileRead(filename, 0, FileSize(filename)));
}

/*----------------------------------------------------------------------------*/
void *FileRead(char *filename, int offset, int length) {
  FILE *fp;
  char *fb;

  if ((fp = fopen(filename, "rb")) == NULL) EXIT("File open error\n");
  if (fseek(fp, offset, SEEK_SET)) EXIT("File seek error\n");
  fb = Allocate(length, sizeof(char));
  if (fread(fb, 1, length, fp) != length) EXIT("File read error\n");
  if (fclose(fp) == EOF) EXIT("File close error\n");

  return(fb);
}

/*----------------------------------------------------------------------------*/
void FileSave(char *filename, void *buffer, int length) {
  FileCreate(filename);
  FileWrite(filename, 0, buffer, length);
}

/*----------------------------------------------------------------------------*/
void FileCreate(char *filename) {
  FILE *fp;

  Folder(filename);

  if ((fp = fopen(filename, "w+b")) == NULL) EXIT("File create error\n");
  if (fclose(fp) == EOF) EXIT("File close error\n");
}

/*----------------------------------------------------------------------------*/
void FileWrite(char *filename, int offset, void *buffer, int length) {
  FILE *fp;

  if ((fp = fopen(filename, "r+b")) == NULL) EXIT("File open error\n");
  if (fseek(fp, offset, SEEK_SET)) EXIT("File seek error\n");
  if (fwrite(buffer, 1, length, fp) != length) EXIT("File write error\n");
  if (fclose(fp) == EOF) EXIT("File close error\n");
}

/*----------------------------------------------------------------------------*/
void Folder(char *path) {
  int i;

  for (i = 0; path[i]; i++) {
    if ((path[i] == '/') || (path[i] == '\\')) {
      path[i] = 0;
      if (mkdir(path) > 0) EXIT("Create folder error\n");
      path[i] = '/';
    }
  }
}

/*----------------------------------------------------------------------------*/
void *Allocate(int length, int size) {
  char *fb;

  fb = (char *)calloc(length, size);
  if (fb == NULL) EXIT("Memory error\n");

  return(fb);
}

/*----------------------------------------------------------------------------*/
void *ReAllocate(void *buffer, int length, int size) {
  char *fb;

  fb = realloc(buffer, length * size);
  if (fb == NULL) EXIT("Memory error\n");

  return(fb);
}

/*----------------------------------------------------------------------------*/
void Free(void *buffer) {
  free(buffer);
}
Con todo eso ya podrás cargar la tabla de conversión unicode. Ya sólo te queda leer el fichero con los textos y usar las tablas font/finv para convertir caracteres.

Drek9
Mensajes: 10
Registrado: 04 Sep 2012, 16:14

Mensaje por Drek9 » 16 Sep 2012, 13:24

Ah! Vale, vale jaja. Como llevo tiempo sin tocar C no habia caido en eso. Y es buena idea, la verdad.
Pero el metodo al que llamas "memory" es el que has puesto al final como "Free"?

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

Mensaje por CUE » 16 Sep 2012, 15:09

El Memory es el Allocate y el Free no se usa en este caso, debería estar en vez de los free(). Es que depende de qué versión de las funciones sea, que las he cambiado mil veces.

Ahora aprovecho y sigo.

font y finv son tablas globales de 65536 elementos de 32 bits que se crean al cargar la tabla de conversión, que debe ser una tabla unicode, con formato XXXX=YYYY, siempre con 4 dígitos hexadecimales para el valor (YYYY) y creo que hasta 4 para el código (XXXX), aunque yo suelo poner siempre 4, rellenando con ceros a la izquierda si es el caso, que así queda todo del mismo tamaño. Verás que hago un montón de cosas, pero es porque me gusta poder poner comentarios en los ficheros, los típicos que van precedidos por ';'.

font va a llevar la conversión en sí, con el valor 0xFFFF si no está definido en la tabla, mientras que finv es la tabla inversa, que es la que nos da el código a partir del valor, lo que se usará para reinsertar los textos.

Lo único que tienes que hacer es leer el texto original, que será de 1-2 bytes, que eso te lo dejo a ti, mirar a ver si existe en font, o sea, que no tenga el valor 0xFFFF, y poner el valor. En caso de que sea 0xFFFF yo suelo poner el código hexadecimal entre llaves, para saber nada más verlo que estaba en el texto pero no tiene carácter convertido. Así siempre me aseguro que todo esté convertido, tenga o no definidos todos los caracteres usados. Otra cosa que hay que controlar es que si el valor corresponde a la llave de apertura puede dar problemas, así que ése es un carácter que pongo dos veces, parecido a lo que se hace con el '\\', pero yo con la llave, para dar la nota.

Para hacer el proceso inverso es lo mismo, leyendo dos bytes del texto unicode para analizarlo. Si hay una llave, se mira si sigue otra, lo que indicará que originalmente era una llave, y si no es así es que viene un código hexadecimal que se pondrá tal cual. Cualquier otro valor se mira en finv, pero teniendo en cuenta que ahora será 0xFFFFFFFF quien indique que no está definido. No es 0xFFFF porque 0xFFFF siempre será un valor valido en font, aunque no este usado. Si no está definido, mal asunto, algo está mal porque no podemos generar el código.

Y básicamente eso es todo. Todo el proceso, más o menos igual, está en alguna de las cosas que he subido a RHDN, así que puedes mirar por allí también.

Drek9
Mensajes: 10
Registrado: 04 Sep 2012, 16:14

Mensaje por Drek9 » 16 Sep 2012, 16:46

Oky! Es algo similar a lo que hiciste en Radiant Historia y Rune Factory.
Me pondré a ello pero seguramente reescribiré el código para aclararme mejor jeje, creo que será más rápido.

Lo que si te quiero pregunta es sobre el ancho de los caracteres. Están en arm9.bin, pero dónde exactamente? Podría reemplazarlo usando algunos kanjis o hiragana jaja.

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

Mensaje por CUE » 16 Sep 2012, 17:58

Claro que es similar. Yo todos los programas los hago con un copy&paste de otros anteriores, así que son primos hermanos por parte de padre. También es la razón por la que algunos bugs pasan de unos a otros, pero no se lo digas a nadie. Ahora mismo acabo de darme cuenta que esas funciones no son las "buenas", lo que no quiere decir que no funcionen, pero he visto que están limitadas a 31 bits de longitug de los ficheros, el típico int con signo, o sea, que como trates ficheros de más de 2 gigas te dará un error, pero no creo que sea el caso.

¿El ancho está en el ARM9? Pues si te he dicho eso no sé por qué ha sido. La verdad es que no sé de qué va el juego porque nunca lo he ejecutado, así que no sé si usa caracteres de ancho variable o no.

Drek9
Mensajes: 10
Registrado: 04 Sep 2012, 16:14

Mensaje por Drek9 » 16 Sep 2012, 18:08

Jaja gracias, y no, no es el caso de ficheros de más de 2GB.

Pues supongo que serán de doble ancho fijo, pero no lo puedo asegurar...
Ya le meteré mano a ver.

Gracias!

Responder