Sindarin
De Base de datos de World of Dread
¿Qué es Sindarin?
Esta aplicación es un asistente para Ultima Online del estilo de Autopilot, pero con la peculiaridad que los script que se pueden hacer son mucho mas sofisticados o tan sencillos como lo eran en Autopilot, con características propias de otros lenguajes más grandes, pero absolutamente opcionales, es decir la usan quien quiere y quien no, no las usa. Con este asistente tendremos que tener la pantalla del uo delante ya que si utilizamos el movimiento del raton no podremos hacer mas cosas en el ordenador mientras macrea.
En la web oficial del Sindarin podrás encontrar mas cosas útiles Página Oficial de Sindarin
¿De dónde me bajo el Sindarin?
Tienes que tener Java instalado. Para ello, puedes descargarlo de esta web Java e instalarlo como un programa normal. Es probable que ya esté instalado en tu ordenador, porque es muy usado. Sindarin no dispone de instalador. Debes descargarte este archivo:
1. Sindarin
Una vez bajado debes copiar el archivo en una carpeta y ejecutar el sindarin.jar.
Interfaz Gráfica
Vamos a explicar como funciona la interfaz del sindarin.
Las opciones de la pestaña "Control", rodeada por un recuadro verde, sirven para unir a Sindarin con una ejecución de Uo, pero en WoD de momento no funciona el reconocimiento del cliente. No hace falta para la ejecución de una macro, Sindarin funcionará igual. Este programa al igual que el Autopilot funcionan con el movimiento del ratón, con lo cual se deberá dejar la ventana mostrada al ejecutar las macros.
Rodeado de un recuadro azul, están los botones típicos de Guardar, Cargar y también hay dos botones de Run(para que ponga a funcionar la macro) y un botón de Stop (para que pare la macro), que estará desactivado hasta que pulses Run. En principio un script (una macro) se puede parar por 4 motivos: que pulses el Stop, que mantengas pulsada la tecla "Pause/Break" del teclado durante un pequeño tiempo, por que se llegue al final del script (esta diferencia es importante) , ya que al contrario que otros programas del mismo estilo al llegar al final del script, Sindarin termina la ejecución o porque se encuentre el comando "exit", que termina la ejecución.
El cuadro de texto central es donde se introducen el código(algo evidente), justo debajo hay una etiqueta que en la imagen pone 3, ese es el numero de linea donde tienes el cursor del teclado. La parte gris de abajo donde pone "Print: Aquí salen los mensajes..." esa es lo que e llamado la consola de mensajes, esta parte es importante por que si nos equivocamos al escribir algún comando, el mensaje de aviso nos saldrá aquí. También saldrán los mensajes que pongas en el comando "print".
Y ahora una parte importantísima de la ventana que son las pestañas rodeadas de rojo, estas sirven para ayudarte a definir y inicializar variables, es decir que sirven para que pongas locations, macros, colores, etc... pero de una forma correcta y ayudan a averiguar por ejemplo que coordenadas tiene tal o tal punto, son las siguientes:
Location
Aquí podemos ver varios componentes, los dos primeros son iguales para todos los tipos de variables, que son:
- Botón con la flecha hacia abajo: Esto significa que la variable esta lista y quieres que se pegue en el código, al pulsarlo la variable "bajara" y se pegara al principio del código del script, si tiene algún valor este se pegara como valor inicial de la variable. No hay limite en el numero de variables que uses, puedes usar 0, 100 o 1000, lo único que limita el numero de variables es la cantidad de memoria que tenga tu ordenador.
- Nombre: este sera el nombre que tendrá la variable, es decir si por ejemplo quieres poner un location que haga click sobre tu mochila pues lo normal seria que esa location se llamase "mochila" de forma que cuando mandes a sindarin a hacer un click con el botón izquierdo sobre la mochila pondrías:
click left mochila
Sindarin solo acepta como nombres aquellos que tengan letras o números o subrayados "_", el resto de nombres dará error y los nombre nunca deben empezar por un numero, ejemplo de nombre correctos:
mochila_uno
_mochila
monton_de_regs_1
X e Y: aquí se ponen las coordenadas del punto de pantalla al que haces referencia.
- Botón "Capturar": este botón es importante, sirve para saber que coordenadas tiene un punto de pantalla, es decir el punto de la location. Al pulsarlo se quedara esperando hasta que pinches en un punto de la pantalla con el botón izquierdo del ratón, e inmediatamente en la casilla X e Y aparecerán las coordenadas de ese punto, con lo que no tienes que calcular o copiarlas, simplemente inicializas el location haciendo click en un punto y listo.
- Botón "Capturar loc y color": funciona igual que "Capturar", solo que además en la pestaña de "Color" aparecerá el color del punto en que has pinchado, es decir capturas la posición y el color de un punto de pantalla.
Color
Sirve para inicializar colores, para por ejemplo saber si un punto de pantalla a cambiado de color o no, en la foto puedes ver:
- Botón flecha hacia abajo: Funciona igual que en Location
- Nombre: Igual que en Location
- R, G, B: Es donde se ponen los valores del color que quieres inicializar, pueden ser de 0 a 255, por ejemplo si quieres el color rojo tendrías que poner: "255 0 0", aunque no es aconsejable que lo pongas a mano
- Botón "Capturar": Funciona como el capturar de Location, pero en vez de capturar la posición de pantalla sobre la que pinches capturaras el color.
- Botón "Captura desde loc": Sirve para capturar el color de un punto que hayas metido en Location.
Macrokey
Sirve para uses macros de Ultima fácilmente, es decir para que Sindarin pulse 'F1' o 'a', en la foto se puede ver:
- Botón flecha hacia abajo: Funciona igual que en Location
- Nombre: Igual que en Location
- Tecla: Si pinchas aquí y pulsas una tecla aparecera el nombre con que sindarin usa para pulsar esta tecla.
- Casillas "ALT", "CTRL" y "SHIFT": Si las marcas harás que Sindarin pulse también estas teclas junto con la que hayas escrito.
Number
Sirve para declarar e inicializar variables numéricas, solo pueden usarse números enteros y positivos, podemos ver en la foto:
- Botón flecha hacia abajo: Funciona igual que en Location
- Nombre: Igual que en Location
- Valor: Aquí puedes poner el numero que ha de valer al principio.
String
Sirve para escribir o hacer que el pj diga algo, podemos ver:
- Botón flecha hacia abajo: Funciona igual que en Location
- Nombre: Igual que en Location
- Valor: Escribes el texto que quieres que valga la variable
Sintaxis y Comandos
Sindarin consta de dos partes, definición de variables y códigos, ambas opcionales. La declaración de variables debe hacerse obligatoriamente al principio del script. La definición BNF es:
{ declaración de variables } { códigos... }
Esta parte estará compuesta por un comando seguido o no por un ";" o una lista de comandos encerrados entre corchetes "{" "}" o palabras claves "begin" "end". La definición BNF es:
comando [";"] | "{" {state [";"]} "}" | "begin" {state [";"]} "end"
Wait
Realiza una pausa en la ejecución del programa.
La sintaxis es: "wait" seguido de una expresión numérica que indica la cantidad de tiempo a pausar, seguida de la unidad de tiempo.
Las unidades de tiempo se miden en minutos "min", segundos "sec" y milisegundos "msec", en caso de no especificar ninguna se supondrá que la unidad de tiempo es el segundo.
La definición BNF es:
wait expresión_numérica ([sec] | min | milisec | MSEC)
Ejemplo:
wait 500 msec
iodelay
Las instrucciones de entrada salida(mousepress, click, pushkey...) realizan automáticamente un pausa al terminar , por defecto esta pausa es de 4 milisegundos, con este comando esta cantidad se puede variar usando este comando.
La sintaxis es: "iodelay" seguido de una expresión numérica que indica la cantidad de tiempo a pausar, seguida de la unidad de tiempo.
Las unidades de tiempo se miden en minutos "min", segundos "sec" y milisegundos "milisec" "msec", en caso de no especificar ninguna se supondrá que la unidad de tiempo es el segundo.
La definición BNF es:
iodelay expresión_numérica ([sec] | min | milisec | msec)
Ejemplo:
iodelay 1 sec
Say
Esta instrucción hace que el PJ diga algo en el juego. La sintaxis de esta instrucción es say seguido de una expresión de texto.
La definición BNF es:
say expresión_textual
Ejemplo:
say "Hola Amigos"
KeyPress
Simula la pulsación de una o varias teclas especificadas por una expresión de tipo Macrokey(macro de tecla), este comando no realiza la liberación de la tecla, es decir mientras no se llame al comando Keyrelease con la misma expresión de tecla o bien a un comando de tipo Pushkey, que realiza un pulsación y luego la liberación, sobre el mismo conjunto de teclas.
Este comando puede escribirse además de las siguientes maneras: kpress.
La definición BNF es:
keypress expresión de tipo tecla
Ejemplo:
keypress 'F1'
KeyRelease
Simula la liberación de una o varias teclas que se encuentren pulsadas por la llamada a un comando Keypress, este comando es el complementario de Keypress.
Este comando puede escribirse además de las siguientes maneras: krelease, krel.
La definición BNF es:
keyrelease expresión de tipo tecla
Ejemplo:
keyrelease 'F3'
PushKey
Simula la pulsación y posterior liberación de una o varias teclas, es como llamar consecutivamente a Keypress y luego a Keyrelease sobre el mismo conjunto de teclas.
Este comando puede escribirse además de las siguientes maneras: pkey, key.
La definición BNF es:
pushkey expresión de tipo tecla
Ejemplo:
pushkey 'F7'
Click
Realiza la simulación de un click del ratón sobre un punto especificado de la ventana, es equivalente a realizar un Mousemove, seguido de un Mousepress y un Mouserelease con el mismo botón y sobre la misma localización. La definición BNF es:
click (left | right) expresión de tipo Location(Localización de pantalla)
Ejemplo:
click left [385,590]
click right [754,390]
Dclick
Realiza la simulación de un doble click del ratón sobre un punto especificado de la ventana, es equivalente a realizar dos click consecutivos el mismo botón y sobre la misma localización.
Este comando puede escribirse además de las siguientes maneras: doubleclick.
La definición BNF es:
dclick (left | right) expresión de tipo Location(Localización de pantalla)
Ejemplo :
dclick left [385,590]
dclick right [754,390]
MouseMove
Este comando mueve el cursor del ratón desde su posición actual hasta la posición indicada a continuación.
Este comando puede escribirse además de las siguientes maneras: mmove.
La definición BNF es:
mousemove expresión de tipo localización
Ejemplo :
mousemove [456,570]
MousePress
Este comando simula la pulsación del botón colocado a continuación del comando, pero no su liberación, por lo que permanece pulsado hasta que se ejecute el comando Mouserelease sobre dicho botón o un comando de tipo click o dclick que implícitamente realizan un Mouserelease.
Este comando puede escribirse además de las siguientes maneras: mpress.
La definición BNF es:
mousepress (left | right)
Ejemplo :
mousepress left
MouseRelease
Este comando simula la liberación de un botón que a sido atrapado usando el comando mousepress, este comando es su complementario.
Este comando puede escribirse además de las siguientes maneras: mrelease, mrel.
La definición BNF es:
mouserelease (left | right)
Ejemplo :
mouserelease left
Drag
Este comando sirve para mover una cantidad de objetos desde una localización a otra. Debe ir seguido de una expresión numérica que indique el numero de objetos a mover, pudiendo ir seguido de la palabra "objets" que no cumple ninguna finalidad y es prescindible, una expresión de tipo localización que indique donde se encuentran en principio los objetos, que puede ir seguida de la palabra "from", que también es prescindible, y otra m que indique donde hay que soltarlos. Hay una opción de usar "ALL" en lugar de una cantidad a mover lo que mueve todos los objetos.
La definición BNF es:
drag expresión numérica [OBJECTS] expresión de tipo location(Localización) [FROM] expresión de tipo location(Localización)
Ejemplo : drag 15 [470,580] [147,25] drag ALL [70,680] [487,97]
If
"If" evalúa una expresión colocada inmediatamente después, si esta expresión es 0 supondrá que es falsa y no se ejecutaran las sentencias colocadas a posterioridad, si la expresión es distinta de 0 se ejecutara la/las sentencias colocadas a continuación.
La sentencia If puede ir seguida de la clausula "else", si la expresión evaluada por if es falsa entonces se ejecutara la/s sentencias colocadas a continuación de else.
Existen las variables de entorno true y false, cuyo valor es respectivamente 0 y 1, con lo cual una sentencia del tipo: "if true { comandos 1 } else { comandos 2 }" ejecutara siempre "{ comandos 2 }" mientras que la sentencia: if false { comandos 1 } else { comandos 2 }" ejecutara siempre "{ comandos 2 }".
If espera evaluar siempre una expresión numérica, por lo tanto se pueden usar cualquiera de los operadores aritméticos que se contemplan en las expresiones normales, sin embargo existen una serie de operadores especÃficos pensados para las sentencias de evaluación(aunque pueden insertarse en cualquier expresión aritméticos normal).
La definición BNF es:
if expresión booleanas ( { comandos } | begin comandos end | comando ) [ else ( { comandos } | begin comandos end | comando ) ]
Ejemplo :
if ((a >= 11) && (b >= 30)) { <instrucciones> }
While
Este comando permite ejecutar varias veces un digo colocado a continuación, la lógica de este comando es la siguiente: mientras la expresión booleana colocada a continuación sea verdadera se continuara ejecutando lo/s comandos colocados inmediatamente después. Por ejemplo seria posible construir un bucle infinito de la siguiente manera: "while true { comandos }" que significar que mientras true(verdadero) sea verdadero entonces se ejecutar "{ comandos }" puesto que true siempre es verdadero "{ comandos }" se ejecutar para siempre.
La definición BNF es:
while expresión booleana sea cierta ( { comandos } | begin comandos end | comando )
Ejemplo:
while (color [100, 100] = color1) { <instrucciones> }
Repeat
Este comando permite ejecutar varias veces un digo colocado a continuación, la lógica de este comando es la siguiente: repetir un numero finito de veces, especificado en una expresión numérica, el digo colocado a continuación.
La definición BNF es:
repeat expresión numérica [times] ( { comandos } | begin comandos end | comando )
Ejemplo:
repeat 100 { <instrucciones> }
Break
Interrumpe la ejecución de un bucle, si colocamos break dentro de un bucle y se alcanza el break, se sale del bucle.
La definición BNF es: break
Ejemplo:
while (true) { say "hola" break }
Exit
Si durante la ejecución de un código se encuentra el comando "exit" se termina la ejecución, es como si se le hubiese dado al botón de "Stop".
La definición BNF es: exit
while (true) { say "hola" exit }
Imprime en la consola de mensajes la expresión siguiente.
La definición BNF es:
print expresión
Ejemplo:
Repeat 10 { say "hola" print "esto se repite 10 veces" }
Beep
Emite un sonido de alerta.
Disponible desde la versión 0.3
La definición BNF es: beep
Ejemplo:
Repeat 10 { say "hola" print "esto se repite 10 veces" beep }
Date
Este comando carga en tres variables/parámetros pasados entre paréntesis y separados por comas, la fecha del sistema.
En el primer var/parámetro numérico de la función se mete el año del sistema, en el segundo el mes y en el tercero el día. La definición BNF es:
date "(" año "," mes "," día ")"
Time
Introduce en los tres parámetros variables siguientes la hora del sistema, estos parámetros han de estar entre paréntesis y separados por comas.
La definición BNF es:
time "(" hora "," minuto "," segundo ")"
Call
Ejecuta otro script de Sindarin, el script se define con una cadena de texto tras el comando call que contendrá el camino al fichero, el script llamador puede enviar parámetros al script llamado. Los parámetros han de pasarse entre paréntesis y separados por comas, solo es posible pasar literales, variables o parámetros, las expresiones complejas no están permitidas como parámetro. Si el parámetro pasado es una variable o un parámetro, las modificaciones que se realicen dentro del script llamado tendrán efecto en las variables del llamante.
Dentro del script se referencia los parámetros como "$" seguido de un numero, de forma que "$1" seria el primer parámetro pasado, "$2" el segundo, no existe limitación en cuanto a el número de parámetros.
Hay que tener precaución en tanto en cuanto no se hace ninguna comprobación del tipo de parámetro pasado, es decir si el script llamante pasa un numero 1 y el script llamado esperaba un texto no se emitirá error hasta el momento de usar el parámetro, pudiendo darse el caso de que no se emita error debido a que el contexto de uso permita el uso de distintos tipos de variables, aunque evidentemente funcionara mal. Tampoco se realiza una comprobación del numero de parámetros por lo que se podrá llamar a un script que esperase 3 parámetros sin ninguno, lo que emitirá un error en el script llamado.
Este comando puede escribirse además de las siguientes maneras: @
La definición BNF es:
call "camino hasta el script" ["("lista de parámetros separados por comas")"]
Ejemplo:
call "C:\magia.sdr"
Igualación
Operador de igualación, colocamos una variable de cualquier tipo seguida de símbolo "=" y de una expresión del mismo tipo que la variable/parámetro y esta toma el valor dado por la expresión.
La definición BNF es:
(variable | parámetro) = expresión
Ejemplo:
Location regs = [159, 198];
Declarar Variables
Las variables tienen un nombre y un valor, el nombre a de comenzar por "_" o letras y a de ir seguido por una o mas letras, dígitos y "_" La declaración de variables se ha de realizar obligatoriamente al principio del script. Los distintos tipos de variables son los siguientes:
- Number: son aquellas variables que pueden tomar valores numéricos de tipo entero, superiores a 0. Ejemplo:
Number a=1, b=2
Number c = a + b
- String: son variables que pueden tomar valores de tipo textual encerradas entre ". Ejemplo:
String nombre_vendedor = "marlon";
String comprar = nombre_vendedor + " buy";
- Location: son variables que toman posiciones de pantallas, representadas en dos coordenadas X e Y, encerradas entre [] y separados por comas. Ejemplo:
Location localizacion_mochila = [100, 100];
- Macrokey: son variables que pueden tomar valores entre una y cuatro teclas, donde cada una de las teclas se han de encerrar entre ' y para aumentar el numero de teclas representadas en una macrokey han de ser sumadas, un ejemplo de declaración:
Macrokey pulsar_f1_y_f2 = 'f1' + 'f2'
Puesto que salvo las teclas simples (números y letras) las demás se representan por una cadena de texto es especialmente y recomendable usar las facilidades de inicialización de Sindarin
- Color: representa un color de pantalla, el color debe especificarse en formato RGB, donde cada una de las componentes han de estar encerradas entre [] y separadas por comas. Un par ejemplos de declaración e inicialización son:
Color rojo = [255, 0, 0];
Color color_mochila = color localizacion_mochila;
La definición BNF es:
( number | string | location | macrokey | color ) nombre_var1 [ "=" expresión de inicialización ]] {"," nombre_varN [ "=" expresión de inicialización ]]} [";"]
Expresiones Aritméticas y Booleanas
- Operadores Aritméticos:
- "+": Suma dos operadores: Es posible sumar cualquier variable con cualquier variable, siempre que sean del mismo tipo, salvo las variables de tipo String que al ser sumadas con cualquier otra producen un resultado de tipo String.
Las variables de tipo Location, y color al ser sumadas se suman como si se sumaran elemento a elemento cada una de sus componente, es decir la Location [100, 100] + [50,50] crearían una Location [150,150]. Al sumar colores si el rango de cualquier suma sobrepasa el 255, que es el máximo rojo o verde o azul, es decir si sumamos [255, 255, 255] + [1 ,1 ,1], esto sobrepasarÃa el limite máximo, así que se redondea a [255, 255, 255]. Las variables tipo Macrokey generan una Macrokey tal que al pulsarla seria como pulsar las dos sumadas a la vez: ejemplo:
Macrokey a = 'a'; a = a + 'F1'; pkey a;
Esto generaría una pulsación de 'a' y 'F1' a la vez.
- "-": Resta dos operadores: También es posible restar cualquier variable con cualquier otra del mismo tipo, excepto las de tipo String, esas no es posible restarlas con nada.
Igualmente tanto Locations como Colors se restan componente a componente. Si una componente de un Color al restar llegase a un numero negativo: [0,0,0] - [1,1,1], el resultado se redondearía a [0,0,0]. Las variables de tipo Macrokey al restar una a otra genera una macrokey como el primer operador pero sin la/s teclas del segundo, en caso de que la/s teclas del segundo no existiesen en el primer operando no se hace nada:
Macrokey a = 'F1'+'F2'; Macrokey b = a -'F2'; Macrokey c = a -'F3'; key a key b key c
Al pulsar a se pulsarían simultaneamente la tecla 'F1' y 'F2', al pulsar b se pulsaría solo 'F1' y al pulsar c se pulsaría de nuevo 'F1' y 'F2'
- "*": Multiplica dos operadores, solo es posible multiplicar Números con Números.
- "%": Calcula el modulo de dos operandos, solo es posible calcular el modulo de dos números.
Es posible realizar operaciones del tipo:
Number a = 1 + 2 * 3 + 8 * (15 + 1)/2 Number b = (1 + 2) * ((a + 8) * (15 + 1)/sindarin_version) String c = "hola " + Manolito + 15 Location d = [100, 100] - [25,25] + [10,10]
Nótese que en a se calcularía 1 + (2 * 3) + (8 * (15 + 1)/2) dado que el orden de precedencia de los operadores *, / y % son los esperados. Y como podemos ver en b se pueden usar variables predefinidas en los calculos.
Expresiones para evaluación de condiciones
Operadores relacionales:
- "<" operador "menor que", devuelve true si la expresion inmediatamente anterior es menor que la siguiente a el.
- ">" operador "mayor que", devuelve true si la expresión inmediatamente anterior es mayor que la siguiente a el.
- "<=" operador "menor o igual que", devuelve true si la expresion inmediatamente anterior es menor o igual que la siguiente a el, también puede escribirse como "=<".
- ">=" operador "mayor o igual que", devuelve true si la expresión inmediatamente anterior es mayor o igual que la siguiente a el, también puede escribirse como "=>".
Estos operadores solo pueden evaluar expresiones numérica, cualquier otro tipo de expresión emitirun error.
Sin embargo existen las dos siguiente expresiones:
- "=" operador "igual que",devuelve true si la expresión colocada antes del "=" es igual a la colocada después, también puede escribirse de la siguiente manera: "==".
- "!=" operador "distinto de", devuelve true si la expresión colocada antes del "!=" es distinta a la colocada después, también puede escribirse de la siguiente manera: "<>".
Estos dos operadores pueden aplicarse a cualquier tipo de expresión.
Existen también operadores booleanos que permiten relacionar varias expresiones entre si:
- "&" operador "Y", devuelve true si las expresiones colocada a ambos lados son verdaderas(distintas de 0) y devuelve false en el caso de que alguna de las dos fuese falsa. Puede escribirse "&&" y "and"
- "|" operador "O", devuelve true si alguna de las expresiones colocada a ambos lados es verdadera(distintas de 0) y devuelve false en el caso de que ambas sean falsas. Puede escribirse "||" y "or"






