Este es mi intento para mostraros como crear un NPC (muy) simple usando WeiDU. Espero que no sea difícil de entender para un usuario nuevo. Este tutorial ha sido actualizado el 19/11/2004, para aclarar cosas y actualizar la sintaxis de WeiDU. Las nuevas adiciones estan en texto azul.
Tabla de Contenidos
Una lista de todo lo que necesitas para poner un NPC en juego.
I. Hacer los archivos de dialogo (.dlg) para tu NPC.
II. Crear un archivo de criatura (.cre) que sera tu NPC con stats y equipo.
III. (opcional) Crear un script (.bcs) para tu criatura.
IV. Crear un script instalador en WeiDU (.tp2) para instalar tu NPC en otros PCs
Seccion I: Archivos .D y .DLG
Lo primero que hay que hacer es crear un archivo .dlg para el NPC. Esto es lo que permite al NPC hablar con tu psj principal (llamado PC), y unirse al grupo. Crea un archivo con extension .d , que puedes crear en el bloc de notas, creando un .txt y renombrandolo a .d. Nombrare el mio
J#Vondo.d. La primera linea de codigo debe ser "BEGIN J#Vondo", que quiere decir que en el momento de compilar creara un archivo llamado *J#Vondo.dlg.
* Nota que NO tienes por que usar el prefijo "J#", esto es algo que yo uso por convencion. Tu prefijo puede ser cualquier cosa como TJ o 01 o y6 o algo asi.
El codigo por ahora deberia verse asi:
BEGIN J#Vondo
Las partes basicas de nuestro dialogo tienen que tener dos States. Uno es para la primera vez que el NPC y el PC (tu psj) se encuentran, y la segunda para cuando el PC se ha negado a llevarlo en el grupo antes pero ahora ha regresado. Asi escribes el primer state...
IF ~NumTimesTalkedTo(0)~ FirstMeeting
(Este es el trigger para el primer state. Si ~Vondo hasn't talked yet~ (~Vondo aun no ha hablado~) entonces comienza el bloque llamado "FirstMeeting" (primer encuentro). ¿Se entiende?)
SAY ~Hola, buen <SIRMAAM>! Mi nombre es Vondo el Justo.~
(Esto es lo que dice Vondo. El siguiente bloque seran las posibles respuestas que puedas darle a tu PC.)
IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~Hola Vondo, ¿has visto a Irenicus por aqui?~ GOTO InquireIrenicus
IF ~~ THEN REPLY ~Hola.~ GOTO Greet
+ ~Class(Player1,PALADIN)~ + ~¡Conozco a un paladin cuando lo veo!~ + BothPaladins
++ ~Vete.~ + GoAway
(Estas son las opciones que puede elegir el jugador. La opcion 1 solo aparece si el jugador esta en el capitulo 1 o 2 ("Chapter","GLOBAL",3). La opcion 2 y la 4 siempre estan disponibles (IF ~~), y la opcion 3 esta disponible si el pc es un paladin (Class(Player1,PALADIN)).
Nota que la sintaxis de cada contestacion es un poco diferente. Las primeras dos usan la forma larga, mientras que las otras dos usan la forma mas nueva y corta. El primer "+" quiere decir "IF". Y el segundo "+" quiere decir "THEN REPLY". El tercer "+" es para "GOTO". Esto hace que ahorres bastante tiempo.
END
(Esto termina el bloque de dialogo.)
Asique nuestro archivo .d debe verse asi:
BEGIN J#Vondo IF ~NumTimesTalkedTo(0)~ THEN BEGIN FirstMeeting SAY ~¡Saludos, <SIRMAAM>! Mi nombre es Vondo el Justo.~ + ~GlobalLT("Chapter","GLOBAL",3)~ + ~Hola Vondo, ¿has visto a Irenicus por aqui?~ + InquireIrenicus ++ ~Hola.~ + Greet IF ~Class(Player1,PALADIN)~ THEN REPLY ~¡Conozco a un paladin cuando lo veo!~ GOTO BothPaladins IF ~~ THEN REPLY ~Vete.~ GOTO GoAway END
Ahora necesitamos crear los states a los que enlazan nuestras respuestas anteriores.
IF ~~ THEN BEGIN InquireIrenicus
(Esto es cuando el PC elige preguntar por irenicus Irenicus.)
SAY ~Nop, pero puedo ayudarte a buscarlo, ¡soy un paladin!~
(respuesta de Vondo)
++ ~Claro. Unete al grupo~ DO ~SetGlobal("VondoJoined","LOCALS",1)
JoinParty()~ EXIT
(Esto creara la variable que quiere decir que Vondo se ha unido a la partida. La accion
"JoinParty()" obviamente le hace unirse a la partida. EXIT es lo que hace terminar al dialogo.)
IF ~~ THEN REPLY ~No, vete.~ EXIT
(Esto terminara el dialogo, y Vondo seguira parado donde esta.)
END
Ahora el resto de los bloques.
IF ~~ THEN BEGIN Greet SAY ~¿Necesitas un paladin en tu grupo?~ IF ~~ THEN REPLY ~Si, la verdad que si.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~No, vete.~ GOTO GoAway END IF ~~ THEN BEGIN BothPaladins SAY ~¡Otro paladin! Saludos, mi hermano. Viajemos juntos y aplastemos el mal.~ IF ~~ THEN REPLY ~Suena bien.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~No, vete.~ GOTO GoAway END IF ~~ THEN BEGIN GoAway SAY ~Muy bien mi <LADYLORD>, esperare a que regreses, ¡para poder aplastar el mal!~ IF ~~ THEN EXIT END
(El codigo "GoAway" demuestra una situacion donde el jugador simplemente aprieta el Intro para que continue el dialogo. En este caso, el dialogo termina enteramente).
Eso es todo lo que necesitamos para el state "First meeting" (primer encuentro). Ahora hay que hacer otro dialogo para cuando el PC regresa a hablar con Vondo si este no se ha unido al grupo.
IF ~NumTimesTalkedToGT(0)~ THEN BEGIN ReturnDialogue SAY ~Veo que has regresado, camarada.~ IF ~~ THEN REPLY ~sip, ven y unete al grupo.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~Si, pero aun no te quiero en el grupo.~ GOTO RefusedAgain END IF ~~ THEN BEGIN RefusedAgain SAY ~Ah, otra vez niegas mi oferta. No importa, me entretendre con este objeto magico que acabo de comprar. Me lo dio un gnomo llamado John Johnson, o algo asi.~ IF ~~ THEN EXIT END
Y ese es el dialogo inicial con que comenzara el NPC. El otro archivo que es absolutamente esencial es el *P.dlg, o el archivo que se usa cuando echas al NPC de tu grupo.
Esto es lo que quiero decir; Vondo se une a tu grupo (usando el archivo J#Vondo.dlg), y automaticamente se le asignan 3 dialogos usando varios archivos .2da (Pdialog.2da y Interdia.2da). Cuando lo echas, su archivo *P.dlg comienza a funcionar, y busca el primer state que es true.
Por mas info de cuales son los archivos de dialogo de NPCs y como funcionan pincha aqui: http://forums.pocket....php?topic=53.0 (en ingles)
Ahora, como comenzamos un archivo .dlg nuevo, tenemos que incluir la linea
BEGIN J#VondoP
Ahora, J#VondoP es lo que entrara en el archivo pdialog.2da, ya que ese es el nombre del archivo .dlg que tendremos al final. Los contenidos de este archivo .dlg son los siguientes:
IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut
(Esta es la variable que se ha creado cuando Vondo se unio al grupo. Si es un 1, quiere decir que esta en el grupo, y sera echado si se pone a funcionar el archivo *P.dlg).
SAY ~Me estas echando.~
IF ~~ THEN REPLY ~Oops, queria echar a Anomen, no a ti. Sorry.~ DO ~JoinParty()~ EXIT
(el archivo P.dlg automaticamente echa al NPC, asi que si no quieres echarle, agrgale un comando de JoinParty().)
IF ~~ THEN REPLY ~Asi es, no te quiero en el grupo.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT
(Esto pone a la variable "VondoJoined" en 0, que quiere decir que se le ha hechado del grupo.)
END
El bloque tiene que quedar asi:
IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut SAY ~Me estas echando.~ IF ~~ THEN REPLY ~Oops, queria echar a Anomen, no a ti. Sorry.~ DO ~JoinParty()~ EXIT IF ~~ THEN REPLY ~Asi es, no te quiero en el grupo.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT END
Y eso es todo lo que necesitas para echarlo. Si quieres que se pueda re-unir tienes que escribir lo siguiente:
IF ~Global("VondoJoined","LOCALS",0)~ THEN BEGIN Rejoin SAY ~¿Quieres que regrese?~ IF ~~ THEN REPLY ~Asi es Vondo, regresa a la formacion.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~No, no te quiero en el grupo.~ EXIT END
ESO es todo el dialogo que necesitas para hacer un NPC. Lo demas son agregaditos, asique tu archivo .d final tiene que verse asi...
BEGIN J#Vondo IF ~NumTimesTalkedTo(0)~ THEN BEGIN FirstMeeting SAY ~¡Saludos <SIRMAAM>! Mi nombre es Vondo el Justo.~ IF ~GlobalLT("Chapter","GLOBAL",3)~ THEN REPLY ~hola Vondo, has visto a Irenicus por aqui?~ GOTO InquireIrenicus IF ~~ THEN REPLY ~hola.~ GOTO Greet IF ~Class(Player1,PALADIN)~ THEN REPLY ~¡Conozco a un paladin cuando lo veo!~ GOTO BothPaladins IF ~~ THEN REPLY ~Vete.~ GOTO GoAway END IF ~~ THEN BEGIN InquireIrenicus SAY ~Nop, pero puedo ayudarte a encontrarlo. ¡Soy un paladin!~ IF ~~ THEN REPLY ~claro. Unete al grupo~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~No, vete.~ EXIT END IF ~~ THEN BEGIN Greet SAY ~¿Necesitas a un paladin en tu grupo?~ IF ~~ THEN REPLY ~Si, la verdad que si.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~No, vete.~ EXIT END IF ~~ THEN BEGIN BothPaladins SAY ~¡Otro paladin! Saludos, hermano. Viajemos juntos y aplastemos el mal~ IF ~~ THEN REPLY ~Suena bien.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~No, vete.~ EXIT END IF ~~ THEN BEGIN GoAway SAY ~Muy bien mi <LADYLORD>, esperare a que regreses, ¡para aplastar el mal!~ IF ~~ THEN EXIT END BEGIN J#VondoP IF ~Global("VondoJoined","LOCALS",1)~ THEN BEGIN KickOut SAY ~Me estas echando.~ IF ~~ THEN REPLY ~Oops, queria echar a Anomen, no a ti. Sorry~ DO ~JoinParty()~ EXIT IF ~~ THEN REPLY ~Asi es, no te quiero en el grupo.~ DO ~SetGlobal("VondoJoined","LOCALS",0)~ EXIT END IF ~Global("VondoJoined","LOCALS",0)~ THEN BEGIN Rejoin SAY ~¿quieres que regrese?~ IF ~~ THEN REPLY ~Asi es Vondo, regresa a la formacion.~ DO ~SetGlobal("VondoJoined","LOCALS",1) JoinParty()~ EXIT IF ~~ THEN REPLY ~No, no te quiero en el grupo.~ EXIT END
Al principio parece complicado, pero es muy facil cuando te acostumbras.
Enhorabuena, has temrinado la seccion I, el resto sera mas corto, no te procupes.
Seccion II: Haciendo un .CRE
Esto es facil. Crea una partida multijugador en BG2 y crea un personaje.
Dale la experiencia, equipo y stats que quieras y luego exportalo.
Usa el Shadowkeeper, DLTCEP, o NearInfinity si es necesario para editar el archivo .chr y hacer otros cambios y luego abre el NearInfinity. De ahi baja hasta la pestaña de "characters", busca a tu personaje y abrelo. En el menu de File, elige "Convert CHR to CRE".
Una vez convertido en formato .cre, puedes asignarle su Death Variable (variable de muerte), Dialogue file (archivo de dialogo), Scripts, y borrar ciertas Flags.
Sobre la, Death Variable (llamada Script Name), debes bajar el scroll hasta offset 0x2e4. Esto es, bajar mas o menos a 2/3 del archivo segun como lo muestra el NI. Esto es lo que identifica a tu NPC en el juego. Otras Death Variables incluyen "Minsc", "Jaheira", e "Imoen2". Recomiendo que useis un prefijo unico en est campo. Pondre la DV de Vondo como j#vondothejust.
Este campo puede ser el mismo nombre de archivo que tu CRE, pero no tiene por que. Para hacer un ejemplo claro, he puesto la DV como j#vondothejust, para que veais la diferencia entre el nombre y la death variable.
Las scripts por el momento no son importantes, pero debes poner la casilla de override script como "J#Vondo". Esto quiere decir que cuando creemos el archivo J#Vondo.bcs, se le asignara a nuestro archivo .cre. Debes tambien limpiar lo que ha dejado tu archivo .chr (que deberian ser dplayer3.bcs), y dejarlo vacio. Si quiers que tu PC inicie el dialogo ni bien vea al NPC, entonces debes usarshoutdl2.bcs. Si quieres que camine hacia tu PC y comience el dialogo usa initdlg.bcs. Una script basica de combate es WTASIGHT.bcs, o WTARSGT.bcs para armas a distancia. Asi que ahora deberiamos tener a J#Vondo asignado al override, initidlg.bcs asignado a una casilla mas abajo y wtasight o wtarsgt.bcs debajo de eso.
La asignacion del dialogo es en 0x330, o en la misma area que el Script Name/Death Variable, un pelin mas abajo. Click derecho en el campo y elige "Edit as String", y escribe J#Vondo. Esto quiere decir que cuando nuestro producto final se instale, y nuestro dialogo compilado, J#Vondo.cre usara el archivo J#Vondo.dlg inicialmente.
¡Importante, leedlo! - Ghreyfain, 07/30/05
Finalmente, un pequeño cambio que igual se os pasa y es responsable de varios dolores de cabeza. Ve a la parte de arriba de tu archivo .cre y busca el campo Flags. En un archivo .cre recien convertido, la flag "Export allowed" (exportar permitido) aun esta seleccionada. De-seleccionala. Algunos efectos raros de esto, podrian ser que tu NPC se comporte como un personaje de multi player, y eso no lo queremos.
Listo el .cre.

Section III: Scripts
IF See([PC]) NumTimesTalkedTo(0) THEN RESPONSE #100 Dialogue(Nearest([PC])) END
El metodo de poner el NPC en un area es agregar una pequeña porcion de script a un script de area ya existente. Digamos que queremos ponerlo en el distrito del gobierno. Tenemos que append (agregar) un trocito al archivo AR1000.bcs. Por ahora creemos nuestra script llamada AR1000.baf con los trocitos que queremos agregar.
IF Global("J#VondoExists","AR1000",0) THEN RESPONSE #100 SetGlobal("J#VondoExists","AR1000",1) CreateCreature("J#Vondo",[1137.2046],3) // 1137.2046 son las coordenadas x.y que haran que se cree el NPC. 3 es la direccion a la cual esta mirando. Va desde 0 (sur) hasta 15, segun las agujas del reloj. END
Esta porcion de script estara en nuestro paquete de instalacion y se agrgara al AR1000.bcs por WeiDU cuando llegue el momento. Mira la seccion IV para ver los detalles de como se hace.
Seccion IV: El WeiDU .TP2
El .tp2 es el script de instalacion que instala tu NPC en el ordenador de otra persona, compila los dialogos, scripts y asigna texto a su dialog.tlk que se corresponde a los archivos .cre. Lo siguiente ha sido extraido con mucho morro de un tutorial de Domi, porque estaba vago como para actualizarlo.
Haz lo siguiente:
1) Abre el directorio del BG2
2) Crea una carpeta llamada VondoTheNPC
3) Abre la carpeta llamada VondoTheNPC y dentro crea otra carpeta llamada backup
4) En la carpeta llamada VondoTheNPC copia tu cre, tus baf's y tus d's
5) Vuelve al directorio del BG2
6) Copia/pega el archivo WeiDU.exe y renombralo como VondoTheNPC-setup.exe
7) En el directorio principal del BG2 crea un archivo llamado VondoTheNPC-setup.tp2 (usa el bloc de notas y renombra el txt a tp2)
ABRE el TP2 en tu editor de texto y continua leyendo.
BACKUP ~VondoTheNPC\backup~ AUTHOR ~ghreyfain@pocketplane.net~ BEGIN ~Vondo el NPC para BG2:ToB~ // Lo siguiente es la copia del archivo .cre de Vondo, y el agregado de su audio. Mira el archivo sndslot.ids para obtener la lista de audio que puedes elegir. COPY ~VondoTheNPC\J#Vondo.cre~ ~override\J#Vondo.cre~ SAY NAME1 ~Vondo~ SAY NAME2 ~Vondo~ SAY SELECT_COMMON4 ~Blah blah.~ [Vondo1] // [Vondo1] este es el nombre del archivo .wav para este sonido SAY SELECT_COMMON5 ~Da la orden.~ [Vondo2] SAY SELECT_COMMON6 ~Dime la direccion.~ [Vondo3] SAY SELECT_ACTION1 ~Estoy en ello.~ [Vondo4] SAY SELECT_ACTION2 ~Como desees.~ [Vondo5] // Lo siguiente es decir a WeiDU que compile los sigueintes archivos .d COMPILE ~VondoTheNPC\J#Vondo.d~ // Lo siguiente es compilar la script y ponerla en el override. Aun no hemos hecho una script, asi que no es necesario. COMPILE ~VondoTheNPC\J#Vondo.baf~ // Lo siguiente es appending (agregar) lo que escribimos en el AR1000.baf al final del // AR1000.bcs EXTEND_TOP ~Ar1000.bcs~ ~VondoTheNPC\ar1000.baf~
Lo siguiente son algunos .2DA agregados para Vondo, que tambien van en el .tp2.
Deberia detallar a que se refiere esto. Pdialog es un array 2-d (.2da) que asigna varias scripts y dialogo al NPC.
El primer campo es nuestro Script Name/Death Variable, j#vondothejust.
El segundo es el "post" archivo de dialogo, para cuando el NPC se echa del grupo.
La "J" es para las interjections y dialogo mientras se esta en el grupo, como flirts o discusiones comenzadas por el PC.
J#VondoD es el archivo de script de "dream". Actua como una script normal, solo que se activa cuando el jugador presiona el boton de dormir.
Los siguientes 4 campos son solo para Tob. Se recomienda que se agreguen incluso solo si tu NPC tiene contenido de SOA, porque no hace daño tenerlos y cambiarlo despues puede ser complicado.
La linea UNLESS es un comando de WeiDU que le dice al programa que solo agregue este texto si J#VondoTheJust no existe aun en el archivo.
APPEND ~pdialog.2da~ ~J#VondoTheJust J#VondoP J#VondoJ J#VondoD J#Von25P J#Von25J J#Von25D J#Vond25~ UNLESS ~J#VondoTheJust~
// interdia.2da es un poco mas simple, pero actua igual que el pdialog.2da. Agrega banters al NPC, que se usan para conversaciones dentro del grupo y dialogos de romance.
APPEND ~interdia.2da~ ~J#VondoTheJust J#VondoB J#VonB25~ UNLESS ~J#VondoTheJust~
Fin!!!
Enlaces utiles:
http://www.weidu.org - Casa de WeiDU.
http://www.idi.ntnu.no/~joh/ni/ - Casa de NearInfinity