¡¡¡ESPERA!!! ¡¡No te hablaré en Chino!! Al menos lee esto:
A causa de la falta de tutoriales para aprender Jass, hago este, explicando de una forma legible (no te enseñaré binario) como crear un detonador en Jass. Si eres de los que se asustan del Jass, al menos intenta lo que te enseño aquí, que no es tan difícil como parece
no juzgues algo sin intentarlo antes. Antes que nada....
Si te animaste a aprender, Jass, lo primero que harás será conseguir el NewGen, que es un editor de mapas para Warcraft III con muchas más funciones, además de facilitar crear detonadores en Jass y sus variantes. Puedes conseguirlo
aquí.
IntroducciónHola gente! En este tutorial
trataré les enseñaré
Jass en general, es decir, desde lo más básico hasta lo más difícil, osea, no les lanzaré toda la info de golpe, no quiero ser la causa de colapsos cerebrales masivos

Este tutorial está destinado a los principiantes, GUI'seros y a los que piensan que solo mentes superdotadas pueden entender el Jass. La idea es demostrar que es más fácil de lo que parece, y animarlos a aprenderlo, ya que tiene varias ventajas a comparación del GUI.
- ¿Qué es Jass?:
"Sigla en inglés para "solo otra sintaxis de escritura" (Just Another Scripting Syntax), es el lenguaje nativo de warcraft y es escrito, a diferencia del GUI es mucho más eficiente, más liviano y mucho más práctico."~
FuenteBásicamente, JASS es el
lenguaje de programación que usa Warcraft III. Los detonadores que todos conocemos

(GUI) son transformados en JASS al ejecutar el mapa, pero genera código "basura" o innecesario que ralentiza la partida, puede generar
fugas de memoria, y, en casos extremos, bugs que pueden dañar el desarrollo de la partida.
Lógicamente, escribiendo tú mismo tus detonadores en Jass, tu mapa se vuelve mas liviano, más rápido, con menos problemas, etc, además de poder crear acciones

que no podrías crear en GUI.
- ¿Y vJass?:
vJass es una extensión del Jass. No entraré en detalles, solo diré que le añade muchas nuevas funciones, facilidades y comodidades. Para escribir en vJass es necesario usar el NewGen Editor.
FuncionesUna
función es un conjunto de "acciones" que se ejecutarán en orden

¿más despacio? bueno, compara cada función con el conjunto de acciones de un detonador en GUI:
[gui]Acciones
-------- deto en GUI --------
Partida - Display to (All players) the text: Hola !!
Wait 2.00 seconds
Partida - Display to (All players) the text: Bienvenido...
[/gui]
Como ya sabrás, todas esas acciones se ejecutarán en orden, lo mismo pasa con las funciones en Jass.
Vamos al grano. ¿Como creo una función? Así:
[jass]function [nombre de la función] takes [parametros que toma] returns [parametros que devuelve]
//acciones de la función
endfunction
[/jass]
~ Lo de los parámetros por ahora no los tomes en cuenta, en su lugar escribe
nothing
~ El nombre de la función puede ser cualquiera, pero
ojo, no pueden haber dos funciones con el mismo nombre.
~ Cuando escribas
//, todo lo que siga a su derecha se transformará en un comentario, lo cual al detonador no le sirve para nada,
PERO a nosotros si, acostúmbrate a usar los comentarios para mantener tu código ordenado
~ No olvides "terminar" la función con
endfunction.
Hagamos un ejemplo:
[jass]
function MiFuncion takes nothing returns nothing
call BJDebugMsg("Hola gente!!!")
endfunction[/jass]
~ En este caso, la función se llama
MiFuncion.
~ Como dije antes, las funciones son como un conjunto de acciones, y antes de ejecutar cada acción, hay que escribir la palabra
call 
Si nos olvidamos del
call, nos aparecerá un error... En el ejemplo anterior, estamos ejecutando la acción
BJDebugMsg, la cual muestra un texto en la pantalla a todos los jugadores, en este caso, es el texto que va en los paréntesis
("Hola gente!!!")
VariablesLas variables son como "almacenes" en donde guardamos cosas para usarlas más adelante

existen dos tipos de variables:
locales y
globales.
La diferencia?? Las
globales pueden usarse en cualquier detonador y en el lugar donde quieras, similar a las variables creadas en el
editor de variables 
y las
locales SOLO pueden ser usadas dentro de la función donde se crean.
Calma, vamos por parte. Primero, como creamos una variable global?? Al principio de todo el código de tu detonador, así:
[jass]
globals
[tipo de variable] [nombre de la variable] = [valor de la variable]
endglobals [/jass]
~ Dentro de
globals y
endglobals puedes crear todas las variables que quieras
~ Los nombres de las variables
no se pueden repetir
~ el valor de la variable, osea, la parte de
= [valor de la variable] es opcional, ya que si lo deseas puedes darle a tu variable un valor más adelante

Ya, pero... que es el tipo de variable??
Recuerdas que las variables son como almacenes?? Pues el tipo de variable indica que tipo de cosas habrá dentro del almacén

puede ser un número, un texto, una unidad, una región, etc.
Tipos de variables más comunes ~
unit = La variable almacena una unidad
~
integer = Almacena un numero cualquiera, pero sin decimales.
Ejemplos: 1, -10, 2000, 34234... ~
real = Almacena un número cualquiera
con decimales.
~
string = Almacena texto. Recuerda que los "textos" o "cadenas" deben ir entre comillas ""
~
boolean = Solo almacena un valor de Verdadero o falso.
true o
false.
~
trigger = Almacena un detonador
~
timer = Almacena un reloj..
~
location = Almacena un punto en el mapa
~
sound = Almacena un sonido
Vale, así que las globales pueden usarse en cualquier parte... Mmm.. y las locales??
Las locales solo se usan dentro de la función donde se crean. Si creamos una variable local en la función
A, no podremos usarla en la función
B, en cambio, una global podría usarse tanto en
A como en
B
Ya, y como creo una local? Al principio de una función, las variables locales se crean así:
[jass]
local [tipo de variable] [nombre de la variable] = [valor de la variable][/jass]
~ Igualmente, el valor es opcional y el nombre no debe repetirse. No pueden haber dos variables locales con el mismo nombre dentro de la misma función.
Hagamos un ejemplo. ¿Recuerdas la función que creamos al principio? usemos variables en ella

[jass]
function MiFuncion takes nothing returns nothing
local string texto1 = "Hola "
local string texto2
set texto2 = "gente!!!"
call BJDebugMsg(texto1 + texto2)
endfunction[/jass]
Creamos dos variables del tipo
string (texto):
texto1 y
texto2. A texto1 le asignamos un valor al principio, pero a texto2 no. ¿Cómo le damos valor? Así:
[jass]set [variable] = [valor][/jass]
De la misma forma, podemos cambiarle el valor a una variable
Como ya vimos antes,
BJDebugMsg mostraba un mensaje en el mapa, pero en este caso, el mensaje será la "suma" de las variables texto1 y texto2, es decir, "Hola " + "gente!!!" = "Hola gente!!!"

Se entiende?
Creando un detonadorSip, para que esa función funcione, debemos crear un detonador que la ejecute, igual que en GUI.
¿Cómo lo hago en JASS? creamos otra función como esta:
[jass]
function Creando takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterTimerEventSingle (t, 3.0)
call TriggerAddAction (t, function MiFuncion)
endfunction[/jass]
Calma, calma, explico:
La función se llama
CreandoPrimero creamos una variable local de tipo trigger (detonador) llamada t, a la cual le asignamos el valor "CreateTrigger()". Con esto, creamos un detonador
call TriggerRegisterTimerEventSingle (t, 3.0) es el acontecimiento

que tendrá que ocurrir para que se ejecute el detonador.
TriggerRegisterTimerEventSingle es el equivalente a:
[gui]Acontecimientos
Tiempo - Elapsed game time is 3.00 seconds
[/gui]
¿Qué es esa "t" dentro de los parentesis? es el detonador al cual le estamos asignando el acontecimiento, recuerdas cuando creamos la variable local trigger t? Esa es

Ya.. y el "3.0"? Es el tiempo que tendrá que pasar para que se ejecute el acontecimiento n.n similar al ejemplo en GUI que dí antes (3 segundos).
"TriggerAddAction" es la acción que añade las acciones al detonador. La "t" de los parentesis? es el detonador al cual le asignamos las acciones. "function MiFuncion"?? Es la funcion en donde están las acciones del detonador

!!
Al final, nuestro ejemplo quedaría algo así:
[jass]
function MiFuncion takes nothing returns nothing
local string texto1 = "Hola "
local string texto2
set texto2 = "gente!!!"
call BJDebugMsg(texto1 + texto2)
endfunction
//=============================================================
function Creando takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterTimerEventSingle (t, 3.0)
call TriggerAddAction (t, function MiFuncion)
endfunction[/jass]
Ya está!! Detonador creado!!
Scope & initializer¿Que pasa? Detonador creado, con acontecimiento y todo, pero no pasa nada... Por que es???
Tranqui, no es error tuyo, ni mio, lo que pasa es que aun no ejecutamos la función que crea el detonador, es decir, la funcion "Creando".

Tedioso? Naa, en la práctica es más simple de lo que parece. Para esto, encapsularemos nuestro detonador en un
scope.
Como creo un scope? Así:
[jass]
scope [nombre del scope] initializer [funcion que se inicia primero]
//...
endscope
[/jass]
En la función que se inicia primero ponemos la que crea nuestro detonador, en mi caso, "Creando". Quedaría entonces así:
[jass]
scope MiScope initializer Creando
function MiFuncion takes nothing returns nothing
local string texto1 = "Hola "
local string texto2
set texto2 = "gente!!!"
call BJDebugMsg(texto1 + texto2)
endfunction
//=============================================================
function Creando takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterTimerEventSingle (t, 3.0)
call TriggerAddAction (t, function MiFuncion)
endfunction
endscope[/jass]
Prueba el mapa y... ¡¡¡Funciona!!!

~ El nombre de los scopes no debe repetirse
~ "initializer [funcion que se inicia primero] es opcional, pero en este ejemplo usamos el scope solo para esto
~ Recuerda terminarlo con "endscope".
FIN
Ya se que el tutorial salió algo largo, pero en la práctica, cuando aprendas, esto se hace en menos de 5 minutos
Esta es una manera de crear un detonador en (v)Jass, mi objetivo era animarlos a aprender, a enseñarles a manejar los conceptos básicos (variables, funcion, etc..), así como mostrar un uso de encapsular con scopes

Espero que alguien lo lea..
Críticas(constructivas) son aceptadas, cualquier error u otro dato que me salté o para agregar, házmelo saber

Cualquier duda, pregunta !! La idea es que aprendas.. Si no entiendes algo (por no decir todo

) trataré de explicarlo más simple
Saludos!!!