Jump to content

creacion de un soporte multilenguaje para npc,s


ratcham

Recommended Posts


  • Group:  Members
  • Topic Count:  1
  • Topics Per Day:  0.00
  • Content Count:  5
  • Reputation:   0
  • Joined:  11/17/12
  • Last Seen:  

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));

}

Edited by ratcham
Link to comment
Share on other sites


  • Group:  Members
  • Topic Count:  15
  • Topics Per Day:  0.00
  • Content Count:  59
  • Reputation:   19
  • Joined:  01/03/13
  • Last Seen:  

Sería mucho más sencillo crear un sistema de lenguaje con una serie de variables que se asignen según un comando (en el que decides cual es tu idioma o en que idioma prefieres que se muestren los npc). Una vez asignada esa variable, llamemos a esa variable "Lang", haces que los npc la identifiquen antes de hablarte y que te hable en ese idioma.

 

Si no te ha quedado claro te pongo un ejemplo de un npc que actue según esa variable:

prontera,150,150,4	script	Ejemplo	120,{

set .@nombre$,"[^0065DF Ejemplo ^000000]";

	if (Lang == 1) {

	mes .@nombre$;
	mes "Hola ^008888"+ strcharinfo(0) +"^000000,";
	mes "como has configurado tu idioma por defecto como Español, a partir de ahora te hablaré en Español.";
	close;

	}

	if (Lang == 2) {
	
	mes .@nombre$;
	mes "Hi ^008888"+ strcharinfo(0)"^000000,";
	mes "you have set English as your idiom, so from now i'll speak to you in English.";
	close;

	}

	mes .@nombre$;
	mes "Aún no has configurado tu idioma, utiliza @idioma para configurar el idioma del juego.";
	next;
	mes .@nombre$;
	mes "You have not set your idiom, please use @idioma to set the language of the game.";
	close;
} 

Si necesitas ayuda en algo o no te ha quedado claro avísame. Espero haberte sido de ayuda  /no1 .

Edited by Nanashi
Link to comment
Share on other sites


  • Group:  Members
  • Topic Count:  1
  • Topics Per Day:  0.00
  • Content Count:  5
  • Reputation:   0
  • Joined:  11/17/12
  • Last Seen:  

pero, si, veo tu propuesta, pero lo que yo digo es crear un fichero de texto en el que estén absolutamente todos los dialogos de los npc,s con un código.

 

Tu propuesta es para construir cada npc con varios idiomas, pero mi propuesta es crear un unico npc, que no contemple el idioma, sino que este venga definido según el fichero txt que uses.

 

Al igual que se usa const.txt y se dan por validas esas constantes para usarlas en los npc,s, digo de crear un fichero dialog.txt que según el idioma de cada uno pues lo tendra adaptado y verá todos los npc,s en su idioma.

 

Y si tengo un dialog.txt en ingles, pues tan solo tengo que meterlo en un traductor y ya lo tengo listo para el idioma que a mi me apetezca.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...