Saltar al contenido

Más en DLAN: Nuestras Traducciones | Otras Traducciones | Mods y modding | Revisiones y Guías | Videojuegos | Arte | Literatura | Rol y Rol por foro e IRC | Mapa de la web

Tutorial de scripting de Potencius (MaxTeamBG)


2 respuestas al tema

#1

  • Invitado

Posteado 10 September 2003 - 08:10 AM

Tutorial de scripting de Potencius Traducido por Albert


1. Declaración General - Elementos básicos imprescindibles para empezar
2. Lógica IF-THEN (SI-ENTONCES) y RESPONSE (RESPUESTA)
3. Activadores, acciones y todo lo que hay en medio
4. Cómo se escribe un script
5. La compilación de tu script
6. Cómo utilizar tu script dentro del juego
7. Diferencias entre juegos
8. Miscelánea


NOTA: ESTE TUTORIAL SE HA CREADO PARA BG2. MUCHAS ACCIONES QUE SE ENCUENTRAN EN BG2 COMO "OR()"EXISTEN EN OTROS JUEGOS, O BIEN SE UTILIZAN DE MANERA DISTINTA. ASEGÚRATE DE CONSULTAR LOS ARCHIVOS IDS DEL JUEGO EN CUESTIÓN PARA CONOCER LOS ACTIVADORES Y FORMATOS CORRECTOS DE LAS ACCIONES. UNA VEZ MÁS, ESTE TUTORIAL DE HA DISEÑADO BÁSICAMENTE PARA BG2.


Declaración General
El scripting SIEMPRE parece muy complicado la primera vez que lo intentas. Si tienes experiencia de programación, resultará algo más fácil, pero cualquiera puede aprender a hacerlo. El scripting se utiliza en el Infinity Engine para controlar lo que pueden hacer los PNJ (personajes no jugador), los hechizos que lanzan en la batalla y cuándo se activan ciertos acontecimientos, entre otras cosas.


Elementos básicos imprescindibles
Lo primero que te sugiero es que visites www.teambg.com para descargarte e instalar el paquete VB5 y el TeamBG AI Scriptor. El TeamBG Scriptor es la utilidad que empleo para hacer scripts. Otro programa que resulta útil para estudiar los scripts utilizados por el juego y para comprobar si has compilado correctamente tu script es Infinity Explorer de www.sourceforge.net/infexp.html.
Los corchetes, “[“ y “]”, indican la traducción de un término del script.
Dos barras invertidas indican las anotaciones laterales de un script. Por ejemplo, podría escribir...
IF
See(NearestEnemyOf(Player1)) // Si veo el enemigo más cercano al jugador 1
THEN
RESPONSE#100
Attack(NearestEnemyOf(Player1) // entonces lo atacaré
END
... y las palabras que se encuentran a lo largo de las barras inclinadas sólo son mis comentarios.

Lógica IF - THEN
La lógica IF - THEN es el sistema que se utiliza para determinar el por qué, el cuándo y el cómo suceden las cosas.
Se utiliza para decir "IF (si) sucede esto, THEN (entonces) haz esto otro." El formato que se utiliza para hacerlo en el Infinity Engine es el siguiente:
IF //si
ThisHappens() //algo específico sucede (Activador)
THEN //entonces
RESPONSE#100 // las posibilidades de que esto suceda. En este caso, son del 100%.
DoThis() // Haz algo específico (Acción)
END // Final de esta exposición IF - THEN


RESPUESTAS
RESPONSE#yyy, donde yyy es el número, es como un sistema de pesada. Establece las posibilidades porcentuales de que se produzca la acción. De este modo, las acciones con una RESPONSE#100 se darán todas las veces que es cierta una circunstancia específica. Las acciones con una RESPONSE#50 se dan el 50% de las veces.
Si tienes una declaración IF - THEN como la que sigue:
IF
ThisHappens()
THEN
RESPONSE#100
DoThis()
RESPONSE#100
DoSomethingElse()
RESPONSE#100
DoAnotherThing()
END
En este caso habría un 33% de posibilidades de que sucediera DoThis(), un 33% de posibilidades de que ocurriera DoSomethingElse() y un 33% de posibilidades de que lo que ocurriera fuera DoAnotherThing(). Sólo puede ocurrir UNA de las tres respuestas. La que sucede se elige al azar. ¿Lo pillas?


THEN -- ¿Cuándo se utiliza?
THEN es el punto de división de una declaración IF - THEN. Marca el lugar en el que han terminado los activadores de la declaración IF - THEN y el sitio en el que se inician las acciones. THEN sólo se utiliza una vez en cada declaración IF -THEN.


Activadores, acciones y todo lo que hay en medio
Todos los activadores (triggers) posibles pueden encontrarse en trigger.IDS. todas las acciones (actions) posibles pueden encontrarse en action.IDS. Los objetivos (denominados Objects, es decir, objetos) pueden encontrarse en el archivo object.IDS. Todo lo demás que está relacionado con los scripts (EA.IDS, RACE.IDS, SPECIFICS.IDS, etc.) puede encontrarse en el resto de archivos IDS.
Los activadores se ocupan de comprobar que algo es cierto. Siempre se escriben debajo de IF. Así pues, si lo que querías comprobar es si tu personaje puede ver al Player 1, podrías utilizar un activador como:
IF
See(Player1)
Las acciones son lo que sucede cuando un activador es verdadero. Las acciones siempre se encuentran debajo de RESPONSE#yyy. De modo que si lo que pretendías era atacar al Player 1, podrías utilizar una acción como la siguiente:
RESPONSE#100
Attack(Player1)
Ahora pongamos el caso de que quieres comprobar si puedes ver al Player1. Si PUEDES verle, entonces le atacarás. Si no puedes ver al Player1, entonces no se producirá esta acción. Cuando se monta esta declaración IF - THEN, el resultado es:
IF
See(Player1)
THEN
RESPONSE#100
Attack(Player1)
END
Los objetos son los objetivos que se utilizan tanto en los activadores como en las acciones. En el ejemplo anterior de declaración IF - THEN, el Player1 es el objeto. Los objetos pueden combinarse entre sí (se denomina Nesting, esto es, nidada). De modo que si tu intención era atacar al enemigo más cercano del player1, podrías utilizar una acción como la siguiente:
RESPONSE#100
Attack(NearestEnemyOf(Player1))
Observa que el objeto real tiene el aspecto del NearestEnemyOf(Player1), es decir, el enemigo más cercano, en este caso al jugador 1. Los paréntesis a ambos lados separan al Objeto: NearestEnemyOf(Myself), de la Acción: Attack. Cada uno de los objetos anidados está separado por un paréntesis de apertura "(".
Una buena manera de recordar cuántos paréntesis de cierre debes utilizar consiste en contar el número de objetos distintos utilizados en esa acción. NearestEnemyOf + Player1 es igual a 2 objetos. Por lo tanto, debe haber 2 paréntesis al final "))".
Nidada - Protector(LastAttackerOf(LastTargetedBy(ProtectorOf(Myself)))) es válido y devolverá el protector de la última persona atacada por la última persona objetivo de la persona que se protege a sí misma. Sin embargo, NO se permite profundizar más allá de este nivel en la nidada.
El uso de OR() - OR() se clasifica como activador, pero en realidad es otra cosa. OR() te permite comprobar lo siguiente:
IF
ThisIsTrue()//esto es cierto
or
ThatIsTrue()//esto es cierto
or
SomethingElseIsTrue()//esto otro es cierto
No obstante, éste NO es el formato en el que se utiliza OR(). OR() contabiliza los activadores que hay debajo y los agrupa en su cláusula OR(). Así pues, si querías comprobar si puedes ver al player1, o al player2, o al player3, utilizarías la siguiente declaración:
IF
OR(3)
See(Player1)
See(Player2)
See(Player3)
Aquí se han agrupado en una cláusula OR() 3 activadores, de modo que 3 es el "número OR".


Cómo se escribe tu Script
Aquí empieza propiamente el tutorial. Agárrate fuerte, ahora probaremos un script MUY sencillo para un personaje de luchador.
Haremos que ataque a un enemigo cuando lo vea, que se beba una poción de curación si está casi muerto y que utilice unas armas concretas según lo cerca que se encuentre del enemigo.
En primer lugar (utilizando el TeamBG AI Scriptor), haz clic en Add Wizard (añadir mago), después haz clic en OK - no utilizaremos Add Wizard, sólo hay que utilizarlo una vez antes de guardar.




¡Empieza el Tutorial!
Muy bien, empecemos por el principio. Si queremos que nuestro luchador ataque al enemigo más cercano con su arma a distancia si se encuentra relativamente lejos de dicho enemigo. Por consiguiente, lo primero que debes hacer es comprobar el alcance de la distancia:
IF
!Range(NearestEnemyOf(Myself),7) // Un signo de exclamación de cierre delante del
// activador significa "no es cierto". De modo que este activador significa: Si
// no es cierto que el enemigo que está más cerca de mi
// está a menos de 7 pies (que son 2,1 metros).
Y ahora necesitamos dos acciones - Una que haga que utilice el arma a distancia, y la otra que ataque al enemigo más cercano. Estas acciones son las siguientes:
RESPONSE#100
EquipRanged() // [Utilizar-arma-a-distancia] Observa que estas acciones debajo de
Attack(NearestEnemyOf(Myself)) // RESPONSE siempre se producirán en el orden que
se presenten.
// Si Attack() estuviera antes de EquipRanged(), entonces
// EquipRanged() no se aplicaría hasta que el
// personajes terminara de atacar al enemigo que tiene
// más cerca.
Ahora has de unir los activadores y las acciones y tendrás tu primera declaración IF - THEN del script...
IF
See(NearestEnemyOf(Myself))
!Range(NearestEnemyOf(Myself),7)
THEN
RESPONSE#100
EquipRanged()
Attack(NearestEnemyOf(Myself))
END
A continuación, necesitas una declaración IF - THEN para que utilice un arma cuerpo a cuerpo y que ataque si el enemigo está a menos de 7 pies. En esta declaración IF - THEN sólo hay 2 diferencias respecto a la anterior. 1- Range [alcance] no debe llevar signo de exclamación porque ahora quieres comprobar que el enemigo se encuentra a menos de 7 pies. 2- EquipRanged() debería cambiarse por
EquipMostDamagingMelee() [Utiliza-arma-cuerpo-a-cuerpo-más-potente].
Por lo tanto, esta declaración IF - THEN sería como sigue:
IF
See(NearestEnemyOf(Myself)) //Puedo ver el Enemigo que tengo más cerca
Range(NearestEnemyOf(Myself),7) //El Enemigo que tengo más cerca está a menos de 7 pies.
THEN
RESPONSE#100
EquipMostDamagingMelee() // Utilizo mi arma cuerpo a cuerpo
Attack(NearestEnemyOf(Myself)) // Ataco al enemigo
END
Muy bien, ahora nuestro luchador va a beberse una poción de curación extra (POTN52) si tiene menos del 25% de sus puntos de vida.
En primer lugar, hay que comprobar que disponga de esta poción específica. Para ello, necesitamos un activador como...
IF
HasItem("POTN52",Myself)
A continuación, es preciso otro activador para saber si tiene menos del 25% de sus puntos de vida. Sería algo así como...
IF
HPPercentLT(Myself,25)
Y por último, necesitamos una acción que empleará la poción si dispone de ella y tiene menos del 25% de sus puntos de vida. Dicha acción sería como sigue:
RESPONSE#100
UseItem("POTN52",Myself) //Se utilizará la poción aunque no esté en la posición de uso rápido.
Así pues, combinamos estas frases en una declaración IF -THEN que dice: IF (si) tengo la poción de curación extra y tengo menos del 25% de mis puntos de vida, THEN entonces existe una posibilidad del 100% de que intentaré utilizar la poción de curación extra.
La declaración sería la siguiente:
IF
HasItem("POTN52",Myself)
HPPercentLt(Myself,25)
THEN
RESPONSE#100
UseItem("POTN52",Myself)
END
De modo que el script final para el luchador sería así:
IF
See(NearestEnemyOf(Myself))
!Range(NearestEnemyOf(Myself),7)
THEN
RESPONSE#100
EquipRanged()
Attack(NearestEnemyOf(Myself))
END
IF
See(NearestEnemyOf(Myself))
Range(NearestEnemyOf(Myself),7)
THEN
RESPONSE#100
EquipMostDamagingMelee()
Attack(NearestEnemyOf(Myself))
END
IF
HasItem("POTN52",Myself)
HPPercentLT(Myself,25)
THEN
RESPONSE#100
UseItem("POTN52",Myself)
END
¿Lo has pillado? Ahora accede al menú File (Archivo), a Save As (Guardar como), y guarda este script como una archivo .BAF en el lugar que te parezca. El archivo .BAF es la fuente del script y utilizarás esta fuente para compilarlo.
También te recomiendo que lo copies y lo pegues en un archivo .TXT como copia de seguridad. Según los activadores y las acciones que se empleen, los archivos.BAF pueden liarse un poco cuando los vuelvas a abrir.


Compilación
La compilación es un proceso bastante sencillo después de crear la fuente de tu script.
Pasos:
1. Asegúrate de que la ruta hasta el compilador se ha definido para la carpeta de scripts del compilador. La ubicación por defecto es la siguiente: C:/ProgramFiles/BlackIsle/BGII - SoA
2. Accede al menú File, luego a Compile To... (Compilar en...). Guarda este script con 8 caracteres o menos como un archivo .bs en la carpeta de Scripts.
3. Si todo va bien, debería aparecer un mensaje diciendo "AI Script Compiled and Ready to Go!" (Script de IA compilado y listo para utilizar). Si hay errores de sintaxis, algo no está en el lugar que le corresponde o hay errores de ortografía en cualquier activador o acción o bien ni siquiera existe, aparecerá un Compiler Error (error del compilador) y te contará lo que has hecho mal. Asegúrate de arreglarlo y vuélvelo a guardar como un archivo .baf de nuevo antes de la compilación.


Cómo utilizar tu script dentro del juego
Es muy sencillo. Si has compilado tu script correctamente y los has guardado en la carpeta Scripts, el script estará disponible para que lo utilices desde la Character Information Screen (pantalla de información de personajes). Aparecerá debajo de los scripts del juego con la palabra CUSTOM. Sólo tienes que seleccionarlo y ya está.


Diferencias entre los juegos
Baldur's Gate I es el primer juego de la serie con el Infinity Engine y en consecuencia dispone de menos comandos que BG II o IWD. Icewind Dale no se basaba en un grupo de PNJ, de modo que los comandos como JoinParty() o InParty() se quedaron fuera. BG II es mejor que BG I e IWD en términos de variedad de acciones, activadores y objetos.
Recapitulemos...
BG 2
Dispone de MUCHOS activadores y acciones útiles.
IWD
Dispone de muchos activadores y acciones que resultan difíciles de comprender o bien no son muy útiles para los scripts.
BG
No tiene muchas acciones ni activadores, pero puedes manipularlo con facilidad.


Miscelánea
Asegúrate de echar un vistazo a Scripting Quick Reference.doc (referencia rápida de scripting) en la carpeta Script del Compilador para obtener más información sobre lo que pueden hacer las acciones y los activadores.
Si deseas más información sobre scripts o una guía como ésta (más avanzada), echa un vistazo a "Po's Advanced Scripting.doc" (scripts avanzados de Po).

#2 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 351 posts

Posteado 24 June 2006 - 09:22 PM

Pues nada me he decidido a ver si soy capaz de hacer alguna cosilla en el baldur pero las herramientas no me las puedo bajar, hay algun enlace por ahi que rule?

http://tierrasdenemar.mi-foro.es/  (abierto para test 79.109.30.79:5121 )


#3 lavafuego

lavafuego

    Ancillae

  • Miembro
  • PipPipPip
  • 351 posts

Posteado 25 June 2006 - 04:18 PM

Je je no hace ya falta ??? ahora a intentar comprender la guia

http://tierrasdenemar.mi-foro.es/  (abierto para test 79.109.30.79:5121 )




Responder



  


A Bragol. Tus amigos te echan de menos.