Últimos temas
» Zona Descargas
Dom Feb 23, 2014 11:01 pm por Telf R

» Los 18 de AoPII
Jue Ene 09, 2014 1:40 pm por RomnerB

» Nueva decoracion y temática!
Jue Ene 09, 2014 11:52 am por RomnerB

» Investigación: Explorando los archivos modificalbes del juego (Carpeta principal y RESOURCES)
Lun Dic 30, 2013 10:14 pm por RomnerB

» Parche Banderas
Lun Nov 25, 2013 5:50 pm por yvandario9

» Tutorial: Como usar convertorTX y Gmview (Imagen)
Sáb Sep 28, 2013 8:46 am por criss

» Tutorial: HeroDescribe.txt & Cambiar apariencia del personaje.
Sáb Sep 28, 2013 7:59 am por criss

» NAvegacion 1ra-3ra persona
Mar Ago 13, 2013 1:40 am por GDI-BOSS

» ayuda urgente porfabor
Jue Jun 20, 2013 10:58 am por vilota

Buscar
 
 

Resultados por:
 


Rechercher Búsqueda avanzada

Compañeros
Crear foro Webmastersworld 3dJuegos: AOP2 Pirates Ahoy

Tutorial: Modificar conversaciones (Básico) -Por completar-

Ver el tema anterior Ver el tema siguiente Ir abajo

Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Josuviz el Dom Mayo 23, 2010 10:59 pm

Introducción
Las conversaciones en AOP2 constan generalmente de dos archivos, un archivo con extensión ".h" (a partir de ahora "aH" -archivoH-) y otro ".c" (A partir de ahora "aC" -archivoC-). Los directorios donde se ecuentran estos archivos son:
"Age of pirates 2/Program/dialogs/russian/*.c"
"Age of pirates 2/Program/text/dialogs/*.h"
El aC, es lo que podemos considerar como la programación de la conversación, y el aH el texto que en la conversacion se dice. Desde el archivo aC, prodriamos generar la conversacion sin necesidad de recurrir a un archivo aH, pero eso lo explicaré mas adelante.

Empezando a Editar:
En este tutorial básico, diremos brevemente lo que hay que modificar sin tener que profundizar demasiado en los detalles. Del mismo modo, tendreis que aceptar el hecho de que muchas cosas que vereis no sepais para que son ni que significan, por ahora.

Además, yo tampoco se que significan muchas cosas (xD), pero quizas con el tiempo las descubramos.

Para aprender como modificar las lineas de las conversaciones, he extraido como ejemplo una parte del archivo "morgan.c", que corresponde a la conversacion con Henry Morgan:
case "Step_1_1": (Esta linea corresponde a un nudo de laconversacion)
dialog.text = DLG_TEXT_Q[27]; (respuesta del NPC)
link.l1 = DLG_TEXT_Q[28]; (respuesta del jugador)
link.l1.go = "Step_1_2"; (nudo al que lleva esta respuesta)
break;

case "Step_1_2": (nudo al que llevo la respuesta anterior)
dialog.text = DLG_TEXT_Q[29]; (respuesta del NPC)
link.l1 = DLG_TEXT_Q[30]; (respuesta del J)
link.l1.go = "Step_1_3"; (nudo al que lleva la respuesta del J)
break;

case "Step_1_3": (etc..)
dialog.text = DLG_TEXT_Q[31]; (otra respuesta del NPC..)
link.l1 = DLG_TEXT_Q[32]; (respuesta J...)
link.l1.go = "Step_1_4"; (nudo...)
break;
En este ejemplo, vemos una conversacion donde solo hay una una opcion a la hora de hablar, es decir, el dice algo y tu le dices la unica cosa que el juego te deja decirle. Es una conversacion sin opcion a preguntarle varias cosas. Si nos fijamos, hay un numero entre "[]" en las lineas de pregunta y respuesta. Este numero indica la posicion de la linea en el aH correspondiente. Para saber que puede ser lo que estan diciendo, vamos al aH de Morgan, y veremos lo siguiente:
string DLG_TEXT_Q [526] = {
"¿Tenéis algún asunto que discutir conmigo? ¿No? ¡Entonces marcharos de mi residencia de inmediato!", (linea numero 0)
"Creo que ya lo he dejado todo claro.",
(linea numero 1...)

(...)


"El gobernador general de Jamaica, Sir Thomas Modyford, necesita vuestra ayuda.", (26)
"¿Y quién sois vos?", (27)
"Su enviado.", (28)
"Mmm. Muy bien, ¿y en qué podría ayudarle a Sir Thomas Modyford?", (29)
"Tenéis que atacar la ciudad holandesa de Curazao.", (30)
"Me parece que ahora mismo no va a poder ser. No tengo suficientes hombres para llevar a cabo semejante operación. Decídselo a Modyford.", (31)
"Sir Thomas Modyford cuenta con vuestra ayuda.", (32)

(...)

}
Si os dais cuenta, EXISTE LINEA NUMERO 0, con lo que si usais la funcion "cntrl+t" (ir a linea X) del bloc de notas, teneis que tener en cuenta la linea "string DLG_TEXT_Q [526] = {" y la linea 0, por lo que si buscais la linea 27 de dialogo, teneis que buscar la linea 29 del bloc de notas.

La primera linea indica cuantas lineas de dialogo hay en el archivo (526 contando con la linea 0, por lo que la ultima linea sera la numero 525). Si decidierais añadir mas lineas de dialogo en el aH, tendreis que indicarlo en esa primera linea: es decir si añadis la linea "Morgan me caes mal"...
"No, Morgan.", (525)
"Morgan me caes mal", (526)
};
...la primera linea deberá poner "string DLG_TEXT_Q [527] = {"

Bien, con esta informacion, si unimos mentalmente (aunque a continuacion os lo mostrare) los datos del aC con los del aH, la conversación queda asi:
Morgan: "¿Y quién sois vos?",
Player: "Su enviado.",
M: "Mmm. Muy bien, ¿y en qué podría ayudarle a Sir Thomas Modyford?",
P: "Tenéis que atacar la ciudad holandesa de Curazao.",
M: "Me parece que ahora mismo no va a poder ser. No tengo suficientes hombres para llevar a cabo semejante operación. Decídselo a Modyford.",
P: "Sir Thomas Modyford cuenta con vuestra ayuda.",
Pues bien, teniendo esto en cuenta, podemos cambiar las lineas de dialogo cambiando el numero de linea de dialogo. Aunque algo asi sólo nos serviria para corregir posibles errores en la conversacion, y lo que de verdad da juego, es crear nuestros propios "nudos" en la conversacion.

Crear "nudos" de conversacion.
Crear nudos en las conversaciones, hará que domines la direccion de la conversacion, abrir posibles respuestas donde antes no las habia, dar nueva informacion, etc, etc... Parece que no es mucho, pero usando el ingenio y conociendo algunas ordenes podrias mover algunas montañas, xD. En las conversaciones existen lineas de codigo comunes. Un grupo de ellas se presenta asi:
switch(Dialog.CurrentNode)
{
case "First time": (...)
Despues de la linea "switch(Dialog.CurrentNode)" vemos como hace aparicion la lista de "cases".Un case para que os hagais una idea, es el grupo de "pregunta del NPC" y "posibles respuestas del jugador". Seguir una conversacion, no es mas que el mero hecho de ir de un case a otro case.
Imaginemos que querriamos que los mercaderes de las calles nos regalaran una vela, para rezar por los amigos caidos (XDDDD). Vamos al "Common_ItemTrader.c" y vemos donde esta situado el case "First time". Este case es especial, ya que si no esta sujeto a condiciones, este case es el que nos recibira. Vemos esto:
case "First time":
//çà÷àðîâàííûé ãîðîä -->
if (pchar.questTemp.MC == "toCaracas" && npchar.city == "Caracas")
{

dialog.text = LinkRandPhrase(DLG_TEXT_BASE[0],
DLG_TEXT_BASE[1],
DLG_TEXT_BASE[2]);
link.l1 = DLG_TEXT_BASE[3];
link.l1.go = "exit";
break;
}
if (pchar.questTemp.MC == "toCaracasPadre" || pchar.questTemp.MC == "toCaracasTavern")
{

dialog.text = DLG_TEXT_BASE[4];
link.l1 = DLG_TEXT_BASE[5];
link.l1.go = "exit";
break;
}
//<-- çà÷àðîâàííûé ãîðîä

dialog.text = NPCharSexPhrase(npchar, DLG_TEXT_BASE[6], DLG_TEXT_BASE[7]);
link.l1 = DLG_TEXT_BASE[8];
link.l1.go = "Trade_exit";

link.l2 = DLG_TEXT_BASE[9];
link.l2.go = "quests";

//--> eddy. Àñêîëüä, ïåðåõâàò íà ðåíäîìíîãî ïåðöà
if (pchar.questTemp.Ascold == "Seek_powder")
{

link.l4 = LinkRandPhrase(DLG_TEXT_BASE[10], DLG_TEXT_BASE[11], DLG_TEXT_BASE[12]);
link.l4.go = "AscoldMerchant";

}
//<-- eddy. Àñêîëüä, ïåðåõâàò íà ðåíäîìíîãî ïåðöà
link.l3 = DLG_TEXT_BASE[13];
link.l3.go = "exit";


NextDiag.TempNode = "First time";
break;
Bien, he remarcado en verde alguna condicion dentro de la conversacion, y en azul las opciones que no estan sujetas a condicion dentro de la conversacion. Eso quiere decir por ejemplo, que si estas atacando a los ciudadanos, los comerciantes ni te hablaran. Eso es debido a una condicion fuera de la conversacion. Bien, ahora, si quisieramos añadir una nueva linea de dialogo, deberiamos situarla despues del "link.l3", y antes del "NextDiag.TempNode = "First time";break;".
Pero en esta conversacion, hay un pequeño detalle a tener en cuenta. Si veis dentro de la condicion "if (pchar.questTemp.Ascold == "Seek_powder")" veis que hay un "link.l4" y que no contiene ningun "break;". Los breaks cortan/limitan los cases. En este caso, si se diera la condicion citada, se añadiria una opcion de dialog en la 4º posicion, y se respetarian las demas. De haber un break, solo habria una posible opcion de dialogo, como ocurre en la condicion "if (pchar.questTemp.MC == "toCaracasPadre" || pchar.questTemp.MC == "toCaracasTavern")".

Teniendo esto en cuenta, añadiriamos el "link.l5" que seria de cosecha propia, vemamos como quedaria:
case "First time":
//çà÷àðîâàííûé ãîðîä -->
if (pchar.questTemp.MC == "toCaracas" && npchar.city == "Caracas")
{

dialog.text = LinkRandPhrase(DLG_TEXT_BASE[0],
DLG_TEXT_BASE[1],
DLG_TEXT_BASE[2]);
link.l1 = DLG_TEXT_BASE[3];
link.l1.go = "exit";
break;
}
if (pchar.questTemp.MC == "toCaracasPadre" || pchar.questTemp.MC == "toCaracasTavern")
{

dialog.text = DLG_TEXT_BASE[4];
link.l1 = DLG_TEXT_BASE[5];
link.l1.go = "exit";
break;
}
//<-- çà÷àðîâàííûé ãîðîä

dialog.text = NPCharSexPhrase(npchar, DLG_TEXT_BASE[6], DLG_TEXT_BASE[7]);
link.l1 = DLG_TEXT_BASE[8];
link.l1.go = "Trade_exit";

link.l2 = DLG_TEXT_BASE[9];
link.l2.go = "quests";

//--> eddy. Àñêîëüä, ïåðåõâàò íà ðåíäîìíîãî ïåðöà
if (pchar.questTemp.Ascold == "Seek_powder")
{

link.l4 = LinkRandPhrase(DLG_TEXT_BASE[10], DLG_TEXT_BASE[11], DLG_TEXT_BASE[12]);
link.l4.go = "AscoldMerchant";

}
//<-- eddy. Àñêîëüä, ïåðåõâàò íà ðåíäîìíîãî ïåðöà
link.l3 = DLG_TEXT_BASE[13];
link.l3.go = "exit";

link.l5 = "Hola, quisiera encender una vela por mis amigos caidos en combate, ¿tienes alguna que ofrecerme?";
link.l5.go = "velas_1";


NextDiag.TempNode = "First time";
break;
Como veis, he añadido (remarcado en rojo) las ultimas lineas. He utilizado una tactica en ocasiones mas cómoda a la hora de editar, ya que prescindimos modificar tambien el aH. En vez de usar el tipico "link.l# = DLG_TEXT_BASE[#];", lo he cambiado por el "link.l# = "Texto_a_mostrar";". Pero imaginad que quereis explicar alguna historia larga, en ese caso es mejor recurrir al aH. En donde pongo "link.l5.go = "velas_1";", le estoy indicando a que case quiero que vaya al elegir esa opcion, en este caso al "velas_1". Como muchos, este case sera otra parte de la conversacion, con sus lineas de dialogo pero el case esta por crear. Si se nos olvidara crearlo, la opcion de dialogo estaría presente en la conversacion, pero al elegirla no avanzariamos. Nos fijamos en donde acaba el case "first time", es decir el break y a continuacion ya podremos crear nuestro case. Veamos como quedaria:
(...)
link.l3 = DLG_TEXT_BASE[13];
link.l3.go = "exit";

link.l5 = "Hola, quisiera encender una vela por mis amigos caidos en combate, ¿tienes alguna que ofrecerme?";
link.l5.go = "velas_1";


NextDiag.TempNode = "First time";
break;

case "velas_1":
dialog.text = "Vaya es un acto muy noble por tu parte, y en ese caso te la regalare";
link.l1 = "Oh! gracias muy amable";
link.l1.go = "exit";
break;
Como veis, la estructura del case de conversacion, lo he remarcado en azul. He llamado al case "velas_1", exactamente igual a como puse que debia avanzar la conversacion en nuestra linea de dialogo "link.l5". Tambien vereis como sigo con la técnica de no modificar el aH, por comodidad.

A la hora de crear los cases debeis tener ciertas cosas en cuenta:
Question En la linea "case" debeis poner el nombre entre comillas, y dos puntos al final "case "nombre":". En las demas lineas, debereis poner ";", incluso despues del break, "break;"
Question En las opciones de dialogo del jugador, debeis tener en cuenta el numero de link, "link.l#", que cada link tenga su link.go "link.l#.go" y que el nombre del case al que la opcion del dialogo de lugar, vaya entre comillas, "link.l#.go = "Nombre_del_case_al_que_avanza_la_conversacion";"
Question No olvidarse del "break;" al acabar el case.


En este punto, y si todo ha salido bien, podriamos guardar y probarlo en el juego. No obstante, veriamos que por mucho que pidamos, tenemos que indicarle al juego que al seleccionar esa opcion de dialogo, el jugador reciba una vela. Aqui es donde se aprecia la organizacion que nos otorga el sistema de cases.

Dar recompensas.
Segun nuestro modelo de case (velas_1), la conversacion acabara alli, y al decir esa opcion deberiamos recibir una vela. Hay una serie de comandos que hacen posible decirle al juego que haga una serie de cosas. Para poder recibir una vela usaremos el comando
TakeNItems(pchar, "id_del_item", #);
.
La "id" de los items es el identificador con el que el juego reconoce los objetos. Es decir, para el juego no existe "vela", existe "mineral3". La id de los objetos puede verse en el archivo
Age of Pirates 2\Program\ITEMS\InitItems.c
El simbolo # representa la cantidad de objetos que recibe el jugador.Asi que el comando quedaria perfectamente ensamblado de la siguiente manera: TakeNItems(pchar, "mineral3", 1);, y su lugar en el aC en el que estamos trabajando:
(...)
link.l3 = DLG_TEXT_BASE[13];
link.l3.go = "exit";

link.l5 = "Hola, quisiera encender una vela por mis amigos caidos en combate, ¿tienes alguna que ofrecerme?";
link.l5.go = "velas_1";


NextDiag.TempNode = "First time";
break;

case "velas_1":
dialog.text = "Vaya es un acto muy noble por tu parte, y en ese caso te la regalare";
link.l1 = "Oh! gracias muy amable";
link.l1.go = "exit";
TakeNItems(pchar, "mineral3", 1);
break;
De esta manera, recibiriamos la vela, sin coste, siempre que seleccionemos estas opciones de dialogo.

(En estos momentos estoy trabajando en un Excel, el cual rellena las lineas de codigo del aC segun la linea de codigo que quieras meter en ese momento, para facilitar la modificacion de aC, pero esta aun en fase beta)


Última edición por Admin el Mar Mayo 25, 2010 1:36 am, editado 1 vez
avatar
Josuviz
Admin

Mensajes : 101
Fecha de inscripción : 20/05/2010

Ver perfil de usuario http://gamers.activoforo.com

Volver arriba Ir abajo

Re: Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Gedrox el Lun Mayo 24, 2010 10:35 pm

oye esta muy buena la explicacion te lo has "currado" bien hecho!!!

Gedrox

Mensajes : 15
Fecha de inscripción : 24/05/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Josuviz el Lun Mayo 24, 2010 10:57 pm

¿si? me alegro, por que tenia miedo de que hubiera problemas a la hora de seguir lo que decia, jeje. Seguire añadiendo mas cosas.
avatar
Josuviz
Admin

Mensajes : 101
Fecha de inscripción : 20/05/2010

Ver perfil de usuario http://gamers.activoforo.com

Volver arriba Ir abajo

Re: Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Gedrox el Lun Mayo 24, 2010 11:07 pm

oye josuviz. ups!!!! ... digo admin se puede por ejemplo modificar los premios de las misiones
tambien como por ejemplo.... : que hagamos que le tengas que hacer una quest a alguien et....
y q te de por ejemplo una buena espada.

Gedrox

Mensajes : 15
Fecha de inscripción : 24/05/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Josuviz el Mar Mayo 25, 2010 12:19 am

Gedrox escribió:oye josuviz. ups!!!! ... digo admin se puede por ejemplo modificar los premios de las misiones
tambien como por ejemplo.... : que hagamos que le tengas que hacer una quest a alguien et....
y q te de por ejemplo una buena espada.
Mmmm, me gusta que tengas ese ambicioso objetivo. Te explico. Es complicado, y no descarto en un futuro aprender como, pero de momento crear misiones, esta un nivel o dos, por encima de mis conocimientos. Tendria que indagar un poco para hacer las cosas correctamente, aunque mas o menos tengo una idea en la cabeza de como funcionan las cosas en el juego. Primeramente cambiarimos la conversacion del NPC que te da la mision, un tendero, mendigo... (en principio, conviene unsa un NPC del juego, por que aun estoy en proceso de saber como implementar nuevos NPCs en el juego). Este te encomienda hacer una mision, y bueno, tendria que explorar un poco, pero mediante un comando estableceriamos que tiene activada una mision. Tambien tendriamos que implantarle la condicion de que si se ha cumplido la mision, se abren nuevas opciones de dialogo y como recompensa lo que tuvieras pensado. Incluso podrian ser objetos nuevos, modificando el inititems previamente. Tendriamos que modificar en el archivo donde se almacenan las quests, y crear nuestra propia quest estableciendo las condiciones de la nueva mision, cuando fracasa la mision, cuando es un exito, o cuando se da una circunstancia especial. Despues de establecer eso, creo que mas o menos estaria hecho, teniendo en cuenta los diferentes estados de la mision.

Pero por ejemplo, podemos crear misiones sencillas, te explico. Hay un comando, que ahora buscare pero que no recuerdo, que comprueba si llevas cierto item en el inventario. Mediante ese comando, podriamos crear por ejemplo, una mision de caza tesoros: En principio, vamos al initItem, y lo modificamos de tal manera que existan 4 o 5 objetos nuevos. Para hacerlo perfecto, tendriamos que usar el convertorTX, con el GIMP para crear las imagenes, pero eso lo explicare en otro tutorial. Bien, modificariamos la conversacion de un NPC, que nos manda buscar los objetos. Los objetos los pueden tener otros NPCs y conseguirlos negociando, o podemos hacer (tambien modificando el inititems) que estos items aparezcan en los cuerpos de los enemigos o tiendas (como los totems de tenochtitlan). Y una vez recolectados, podemos usar el comando de comprobar objetos en el inventario, en la conversacion del NPC que te da la mision, para que nos abra nuevas opciones de dialogo si los llevamos encima, nos de la recompensa, y nos libre de los objetos. Este metodo es mas "simplon" pero igual vale. Si ademas, consigo que se grabe en el diario, yo creo que a efectos del jugador, la sensacion de tener que hacer la mision y conseguirla es la misma que en las demas.

Espero añadir pronto mas tutoriales de todo lo que se, para que pronto podamos dominar el juego. Un saludo.

PD: Puedes llamarme Josuviz, no pasa nada, lol...
avatar
Josuviz
Admin

Mensajes : 101
Fecha de inscripción : 20/05/2010

Ver perfil de usuario http://gamers.activoforo.com

Volver arriba Ir abajo

Re: Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Gedrox el Mar Mayo 25, 2010 12:59 am

ok josuiz con respecto a lo de cambiar ojbetos por dinero u otros objetos creo q seria bueno
hechar un ojo a las misiones de askold ya que recuerda la quest en la q hay que buscar 3 objetos
un cuchillo una tasa una estatua y un a olla de arcilla si mas no recuerdo el "secretario" de morgan
nos vendia esos objetos por 1.000.000 a que va esto me explico: si logramos entender como
programaron para que el nos vendiera esas cosas podriamos hacer un avance en crear nuevas
quests ya que podriamos crear misiones que requieran cambiar objetos por dinero por pedido de alguien
o q alguien en una casa especifica nos diga si me traes 40 velas te dare 1 pistola exelente
nose si me entiendes. creo que hay que revisar a fondo los blocs de notas de las quests

EDITO: Si ves q algo lo escribi muy raro disulpa es que mi teclado se esta jodiendo

Gedrox

Mensajes : 15
Fecha de inscripción : 24/05/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Josuviz el Mar Mayo 25, 2010 1:40 am

Vale. Mira voy a investigar por la mision de askold. En este hilo [Tienes que estar registrado y conectado para ver este vínculo], te explico el modus operandi que suelo hacer para conocer nuevas cosas.
avatar
Josuviz
Admin

Mensajes : 101
Fecha de inscripción : 20/05/2010

Ver perfil de usuario http://gamers.activoforo.com

Volver arriba Ir abajo

Re: Tutorial: Modificar conversaciones (Básico) -Por completar-

Mensaje  Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.