Tutorial: Implantar NPCs en el juego.

Ver el tema anterior Ver el tema siguiente Ir abajo

Tutorial: Implantar NPCs en el juego.

Mensaje  Josuviz el Sáb Jun 19, 2010 2:03 am

Aqui estoy una vez mas. Cada vez profundizando mas y mas, hoy traigo la forma de como poder implementar en el juego un NPC. Un NPC (non playable character) es un personaje que lleva el juego, como lo son el usurero, el gobernador, Morgan...

En nuestro caso, vamos a crear un NPC, lo pondremos en una ubicacion del juego, y le daremos un aC de dialogo para que pueda hablarnos.

Creando un NPC

Bien, si no poseemos de un editor de modelos, o simplemente, somo aficionados al tema, podemos escojer cualquier model existente en el juego. Si tenemos el HexEditor y sabemos como clonar models y cambiarles la ruta de la textura, pues es una buena opcion. En nuestro caso, voy a escoger a un personaje encapuchado bastante "molon" y misterioso, que dara mucho juego. (Este model pertenece al CMv3.1 de pirates ahoy).

Buscando localizacion

Una vez pensado que model y texturas usaremos, tenemos que ir a la carpeta:
aop2\program\locations\init\
Alli veremos un aC de cada ciudad. Vamos a entrar al de Tortuga por ejemplo, y vemos esto:

(...)
locations[n].id = "Tortuga_town";
locations[n].id.label = "Street";
(...)
locations[n].reload.l24.name = "houseF2";
locations[n].reload.l24.go = "CommonRoom_MH5";
locations[n].reload.l24.emerge = "reload1";
locations[n].reload.l24.autoreload = "0";
locations[n].reload.l24.label = "House";

locations[n].reload.l25.name = "houseH2";
locations[n].reload.l25.go = "CommonRoom_MH7";
locations[n].reload.l25.emerge = "reload1";
locations[n].reload.l25.autoreload = "0";
locations[n].reload.l25.label = "House";

locations[n].reload.l26.name = "houseSp1";
locations[n].reload.l26.go = "CommonResidence_BackHall";
locations[n].reload.l26.emerge = "reload1";
locations[n].reload.l26.autoreload = "0";
locations[n].reload.l26.label = "House";

locations[n].reload.l27.name = "houseH1";
locations[n].reload.l27.go = "CommonRoom_MH10";
locations[n].reload.l27.emerge = "reload1";
locations[n].reload.l27.autoreload = "0";
locations[n].reload.l27.label = "House";

locations[n].reload.l28.name = "houseSp2";
locations[n].reload.l28.go = "CommonFlamHouse";
locations[n].reload.l28.emerge = "reload1";
locations[n].reload.l28.autoreload = "0";
locations[n].reload.l28.label = "House";

locations[n].reload.l29.name = "houseH3";
locations[n].reload.l29.go = "CommonHut";
locations[n].reload.l29.emerge = "reload1";
locations[n].reload.l29.autoreload = "0";
locations[n].reload.l29.label = "House";
n = n + 1;
(...)
La location.id indica la referencia del lugar. Y dentro de ese lugar hay otras refencias (Es decir, primero esta la ciudad, que tendra sus ubicaciones, y en el escenario ciudad, hay casas, con otras ubicaciones), que son lo que indican los grupos de 5 lineas. De esas 5 lineas, la primera indica el nombre del lugar, la segunda la referencia, la tercera indica el punto donde aparece el personaje cuando se entra en esa estancia, la cuarta no se que es, y la quinta te indica el nivel del lugar, es decir, si es a pie de calle si se trata de una casa...

Imaginemos que quiero hacer que un personaje este en el faro de Tortuga. Revisando el documento encontramos:
(...)
locations[n].id = "Mayak6";
locations[n].id.label = "Mayak6";
(...)
Ese es la refencia al faro de Tortuga.

Una vez que se esa referencia, me voy a la carpeta:
Age of Pirates 2\Program\characters\init
Alli estan todos los personajes de las distintas ciudades, incluso hay un archivo llamado "StoryCharacters.c" donde guarda la informacion de algunos personajes como Morgan, ascold, Isabella...

Abrimos el archivo de tortuga, y si no queremos comernos mucho la cabeza copiamos la informacion de otro personaje (en mi caso, coji la de Isabella del archivo StoryCharacters.c) y la pegamos en el archivo Tortuga.c. Pero tenemos que editarlo, de tal manera que os quede algo asi:
makeref(ch,Characters[n]); // Ëþáîâü ïîíèìàøü...
ch.name = "Hombre";
ch.lastname = "Encapuchado";
ch.id = "josuviz001";
ch.model = "encap";
ch.sex = "man";
ch.model.animation = "man2_ab";

ch.location = "mayak6";
ch.location.group = "goto";
ch.location.locator = "goto30";

ch.Dialog.Filename = "char1.c";
ch.nation = SPAIN;
ch.rank = 8;
ch.DontClearDead = true; // íå óáèðàòü òðóï
ch.money = "10000";
LAi_NoRebirthEnable(ch);
LAi_SetStayType(ch);
LAi_group_MoveCharacter(ch, "SPAIN_CITIZENS");
LAi_SetLoginTime(ch, 0.0, 24.0);
LAi_SetHP(ch, 75.0, 75.0);

n = n + 1;
Tranquilos. Aqui hay mucha mas informacion de la que os he dado pero ahora os la explicare:
+ Lo que esta en naranja, me venia con el copia y pega de Isabella, pero no es algo que tenga que quitarnos el sueño.
+ Importante, el "ch.id" tiene que ser único. Aseguraros de poner un nombre que recordeis, que no repitais, y que sea casi imposible de que algun programador lo pusiera en algun otro personaje. Yo he puesto josuviz001, jaja.
+ La informacion de verde, model, sexo, y animation, aseguraros de que corresponde.
+ "ch.location", como veis, aqui he puesto la localizacion del faro que ya conociamos de ver el archivo de la carpeta locations, "mayak6".
+ La informacion de rojo es la ubicacion exacta donde se colocara nuestro NPC.
- Para ello, necesitaremos habilitar el modo beta, para que nos sea mucho mas facil. Vamos al archivo "mod_on_off" de la carpeta program. Buscamos las lineas adecuadas y las editamos tal que queden asi:
// Show special message for test game statment
#define MOD_BETTATESTMODE "On" // On -DEV version; Test - TST ver; Off - relize
- Entramos al juego, creamos nueva partida, presionamos f11, y en el cuadro de texto de arriba ponemos: "mayak6, reload, reload1_back" y presionamos aceptar. Como por arte de magia estamos en el faro de tortuga. Ahora presionamos f11, y en la esquina inferior derecha, hay un boton, instalaciones. Le damos a "mostrar buscador" y salimos de esa pantalla. Veremos que hay un monton de circulos de colores. (jajaja). Deberiamos fijarnos solo en los "goto/goto#". Bien, elegimos un goto en especial, (el 30, esta un poco lejos, lol). Y con esto ya tendriamos la informacion que necesitamos.

Creando una conversacion

+ Por ultimo, vamos a la carpeta "program\dialogs\russian" copiamos un aC, y lo renombramos con el nombre que querais, este sera el archivo de dialogo. Yo le he llamado "char1.c", y lo añadi a la linea "ch.dialog.filename". Bien, abris vuestro aC renombrado, y borrais por completo lo que ponga. Yo lo simplifique a una conversacion de una linea, desde aqui podeis seguir editandolo:

void ProcessDialogEvent()
{
ref NPChar;
aref Link, NextDiag;

DeleteAttribute(&Dialog,"Links");

makeref(NPChar,CharacterRef);
makearef(Link, Dialog.Links);
makearef(NextDiag, NPChar.Dialog);

switch(Dialog.CurrentNode)
{

case "First time":

dialog.text = "Esto es una conversacion vacia";
link.l1 = "Lo se";
link.l1.go = "Exit";
NextDiag.TempNode = "First time";
break;

case "Exit":
NextDiag.CurrentNode = NextDiag.TempNode;
DialogExit();
break;
}
}
Bueno y hasta ahi, ya deberias tener toda la informacion necesaria. Y ya podeis probar si ha funcionado:
[Tienes que estar registrado y conectado para ver esa imagen]
Si os fijais, esta situado en el goto/goto30
[Tienes que estar registrado y conectado para ver esa imagen]
Y aqui vemos que la conversacion funciona.

(Como lo he hecho a 200 por hora, igual quedan cosas por explicar, pero podeis postear aqui las dudas sin problema)
avatar
Josuviz
Admin

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

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

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.