Hola a todos.
Mi nivel de C es bastante bajo, y espero que alguien me guie para poder hacer lo que pretendo o me indique si ya está hecho.
Mi idea es que se pueden usar en los scripts alguna herramienta que permita usar las cadenas que esten almacenadas en un fichero .txt. La cosa es crear un fichero, por ejemplo: dialog.txt, en el que haya constantes del tipo cadena de caracteres. Esto serviría para hacer npc,s que pudieran usar estas constantes para los diálogos.
Usando una forma de escribir los dialogos, ésta simplemente la evalue y si concuerda con la norma, pues que la cambie por una frase almacenada en el dialog.txt.
Pongo lo que hasta ahora he hecho.
He creado el fichero dialog.txt.
El formato del fichero dialog.txt es el siguiente: nombre [tab] cadena de texto
** El nombre consta de _._ + 'Nombre del npc' + número de orden. (todo esto sin usar espacios, solo usar guion bajo _ como separador de palabras)
** En vez de [space] tambien puede usarse otro tipo de separador más adecuado si así se determinara. Aunque este formato lo traduce muy bien muchos traductores de texto como por ejemplo el traductor de google que interpreta _._kafra_001 como algo que no debe cambiar.
Este es un ejemplo:
en el fichero dialog.txt:
... _._kafra_001 [space] Hola, buenos dias.
_._kafra_002 [space] ¿Necesitas mi ayuda?
_._kafra_003 [space] Nos vemos, chao. ...
luego en el script pondría:
... mes "_._kafra_001"; next; mes "_._kafra_002"; next; mes "_._kafra_003"; close; ...
y al hablar con el npc, no saldria "_._kafra_001" sino "Hola, buenos dias.":
Y todo esto para que?. Pues para que cuando haga un npc con diálogos, use este formato para que con tan solo cambiar o traducir el fichero dialog.txt, tenga todos los diálogos en el idioma que yo quiera.
Que he hecho hasta ahora?. En el source, en la función 'mes' evaluaría las 3 primeras letras de la cadena y si coinciden con '_._' se supone que es un texto que debe ser cambiado por el que esté en el fichero dialog.txt. Supongo que usando la funcion strncmp() se puede comparar los 3 primeros dígitos de la cadena, pero luego lo que no se hacer es leer el fichero dialog.txt y buscar la que coincida y reemplazarla.
Solicito ayuda en esto, en un cambio de la función mes para que si el formato de texto coincide con un estandar, lo cambie.
Muchas gracias.
Tembién he pensado en que podría haber problemas de multiacceso al fichero, como no entiendo muy bien como funciona esto de leer directamente en un fichero del server, pues no se que inconvenientes podrían surjir. He pensado en que también se podría crear un fichero en el propio cliente dentro de la carpeta /data/ y así no habría este problema de multiacceso.
Se podrán ir haciendo revisiones de este fichero para saber si se tienen todos los npc,s dentro del dialog.txt y además una actulizacion desde el propio server del juego, cuando se haya implementado nuevos npc,s con este formato.
*********************************************************************************
Disculpen los moderadores, me confundi al colgarlo, no se si este tema es tan generico que debería estar aquí o trasladarlo al sitio de proyectos. Muchas gracias y perdonen el error.
*********************************************************************************
Esta es la función para el uso de 'mes' dentro de un script: (esta en el source clif.c)
void clif_scriptmes(struct map_session_data *sd, int npcid, const char *mes)
{
int fd = sd->fd;
// he modificado esto:
// supongo que strncmp() trabaja de esta manera, si me he equivocado les ruego me ayuden a cambiarlo.
if (strncmp( *mes, "_._" , 3 ) == 0) // coinciden los 3 primeros caracteres con "_._"
{
*mes = read_dialogtxt(*mes); // sustituyo las cadenas si esta en dialog.txt
}
// read_dialogtxt() es la función que no se hacer.
// La cual evalua y busca *mes dentro del fichero dialog.txt
// Si la encuentra devuelve el valor nuevo, y si no, devuelve la misma cadena *mes
// La función deberá evaluar si existe algún duplicado y si la cadena a devolver está en una sola linea o en mas.
// El fichero dialog.txt igual debería estar en el cliente/data/dialog.txt para evitar posibles multiaccesos a un solo fichero en el server.
// Todo lo demás seguiría igual...
int slen = strlen(mes) + 9;
WFIFOHEAD(fd, slen);
WFIFOW(fd,0)=0xb4;
WFIFOW(fd,2)=slen;
WFIFOL(fd,4)=npcid;
memcpy((char*)WFIFOP(fd,8), mes, slen-8);
WFIFOSET(fd,WFIFOW(fd,2));
}