miércoles, 27 de agosto de 2008

Explicación exhaustiva...

Finalmente el ultimo texto rescatado del baúl de los recuerdos:

Sintaxis de Sindarin en formato BNF y explicación exhaustiva de los comandos (revisado).

También puede interesarte:



  1. El comienzo...
  2. Códigos...
  3. Lista de todos los comandos
  4. wait
  5. iodelay
  6. say
  7. keypress
  8. keyrelease
  9. pushkey
  10. click
  11. dclick
  12. mousemove
  13. mousepress
  14. mouserelease
  15. drag
  16. if
  17. while
  18. repeat
  19. break
  20. exit
  21. print
  22. beep
  23. date
  24. time
  25. call
  26. igualación
  27. declaración de variables
  28. Expresiones aritméticas y booleanas
  29. Miscelánea


  1. El comienzo...

    Un programa 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... }
  2. 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"
  3. Lista de todos los comandos

    Más abajo se detallan pormenorizadamente cada uno de los comandos aquí una enumeración de todos los comandos:


    • wait: Ejecuta una pausa en la ejecución.
    • iodelay: Modifica la pausa automática que se realiza tras cada comando de entrada/salida de teclado o ratón.
    • say: El pj dice algo.
    • keypress: pulsa una macro y la mantiene pulsada.
    • keyrelease: libera la pulsación de una macro.
    • pushkey: pulsa una macro y la suelta, equivalente a click para el teclado.
    • click: Simula un click en un punto de pantalla.
    • dclick: Simula un doble click en un punto de pantalla.
    • mousemove: mueve el cursor del ratón a una posición de pantalla.
    • mousepress: un botón del ratón y lo mantiene pulsado.
    • mouserelease: libera la pulsación de un botón del ratón.
    • drag: mueve una cantidad de objetos desde una localización a otra.
    • if: hace un comprobación y ejecuta un código si esta es cierta o no sino lo es.
    • while: repite el/los códigos que están a continuación mientras se cumpla una condición.
    • repeat: repite el comando o los comandos encerrados entre "{","}" o "begin", "end" tantas veces como indique la expresión numérica puesta a continuación.
    • break: Sale de un bucle repeat o while en caso de encontrarse dentro de uno.
    • exit: Termina el programa.
    • print: Imprime en la consola de mensajes la expresión puesta a continuación.
    • beep: Emite un sonido de alerta.
    • date: Introduce en las variables colocadas a continuación el día, mes y año actual, según la fecha del equipo.
    • time: Introduce en las variables colocadas a continuación la hora, minutos y segundos de la hora del sistema.
    • call: Ejecuta otro script Sindarin.
    • Aunque no es un comando propiamente dicho si se coloca una variable seguida de "=" se introduce en ella el valor de la expresión siguiente.
  4. wait (esperar...)

    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 "milisec" "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)
  5. iodelay (retrazo de entrada salida)

    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)
  6. say (decir)

    Esta instrucción hace que el PJ diga algo en el Ultima Online. La sintaxis de esta instrucción es say seguido de una expresión de texto.

    La definición BNF es:

    say expresión_textual
  7. keypress (Presiona tecla)

    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
  8. keyrelease (Libera tecla)

    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
  9. pushkey (pulsar tecla)

    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
  10. click

    Realiza la simulación de un click del ratón sobre un punto especifico 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)
  11. dclick

    Realiza la simulación de un doble click del ratón sobre un punto especifico 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)
  12. mousemove (mover ratón)

    Este comando mueve el cursor del ratón desde su posición actual hasta la posición indicada a continuación.

    Toda la familia de comandos Mouse...(Mousemove, Mousepress y Mouserelease) tienen problemas en modo nativo,
    si se usan con la ventana de Ultima maximizadas. Para evitar estos problemas lo mejor es minimizar la ventana de Ultima o bien
    desactivar el modo nativo.

    Este comando puede escribirse además de las siguientes maneras: mmove.

    La definición BNF es:

    mousemove expresión de tipo localización
  13. mousepress (presiona ratón)

    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.

    Toda la familia de comandos Mouse...(Mousemove, Mousepress y Mouserelease) tienen problemas en modo nativo,
    si se usan con la ventana de Ultima maximizadas. Para evitar estos problemas lo mejor es minimizar la ventana de Ultima o bien
    desactivar el modo nativo.

    Este comando puede escribirse además de las siguientes maneras: mpress.

    La definición BNF es:

    mousepress (left | right)
  14. mouserelease (Libera ratón)

    Este comando simula la liberación de un botón que a sido atrapado usando el comando mousepress, este comando es su complementario.

    Toda la familia de comandos Mouse...(Mousemove, Mousepress y Mouserelease) tienen problemas en modo nativo,
    si se usan con la ventana de Ultima maximizadas. Para evitar estos problemas lo mejor es minimizar la ventana de Ultima o bien
    desactivar el modo nativo.

    Este comando puede escribirse además de las siguientes maneras: mrelease, mrel.

    La definición BNF es:

    mouserelease (left | right)
  15. 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.

    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)

    Desde la versión 0.3, se ha añdido la 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| ALL ] [OBJECTS] expresión de tipo location(Localización) [from] expresión de tipo location(Localización)
  16. 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 ) ]
  17. while (mientras)

    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. Así 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.

    Otro ejemplo de construcción valida seria:

    while (color [100, 100] = color1)
    say "hola"
    

    lo que obligar al jugador a decir "hola" mientras el color de la Location [100, 100] fuese distinto de la variable color1.

    La definición BNF es:

    while expresión booleana sea cierta ( { comandos } | begin comandos end | comando )
  18. repeat (repetir)

    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.

    Un ejemplo de construcción valida seria:

    Number a = 50;
    repeat (a/2) times
    say "hola"
    
    lo que obligar al jugador a decir "hola" 25 veces.

    Otro ejemplo de construcción valida seria:

    repeat 100
    begin
    drag 1 object [100,100] from [200,200]
    end
    
    Que obligar a mover un objeto desde la posición [100,100] hasta la [200,200] cien veces consecutivas.

    Otro ejemplo de uso seria:

    repeat 10
    {
    pushkey 'F1'
    wait 1 min
    }
    
    Que obligar a pulsar 'F1' 10 veces con un retraso de un minuto entre pulsación y pulsación.

    La definición BNF es:

    repeat expresión numérica [times] ( { comandos } | begin comandos end | comando )
  19. break (Romper)

    Interrumpe la ejecución de un bucle, si colocamos break dentro de un bucle y se alcanza el break, se sale del bucle.

    Un ejemplo de utilización seria:

    while (true) {
    say "hola"
    break
    }
    
    El "hola" solo se ver una vez ya que al llegar al break se terminar el bucle infinito.

    Otro ejemplo de uso seria:

    Location nightshade = [100, 100]
    Color verde = [0, 255, 0]
    repeat 10000
    {
    pushkey 'a'
    wait 1
    if (verde != color nightshade)
    break
    }
    Este bucle pulsar diez mil veces la tecla 'a', a menos que la Location "nightshade" no tuviera el color "verde".

    La definición BNF es:

    break
  20. exit (salir)

    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
  21. print

    Imprime en la consola de mensajes la expresión siguiente.

    La definición BNF es:

    print expresión
  22. beep

    Emite un sonido de alerta.

    Disponible desde la versión 0.3

    La definición BNF es:

    beep
  23. date (fecha)

    Este comando carga en tres variables/parametros pasados entre parentesis y separados por comas, la fecha del sistema.

    En el primer var/parametro 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 ")"
  24. time (hora)

    Introduce en los tres parametros variables siguientes la hora del sistema, estos parametros han de estar entre parentesis y separados por comas.

    La definición BNF es:

    time "(" hora "," minuto "," segundo ")"
  25. 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árentesis 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 parametros separados por comas")"]
  26. 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/parametro y esta toma el valor dado por la expresión.

    La definición BNF es:

    (variable | parametro) = expresión
  27. declaración de 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 ]]} [";"]
  28. Expresiones aritméticas y booleanas

    Sumas, restas...
    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 generaria 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 cálculos.

    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 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 emitirán 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"

  29. Miscelánea


    • Comentarios: los comentarios han de comenzar por el carácter #, el resto de la linea sera ignorado por Sindarin
    • isnativemode: Puede usarse dentro de una expresión, devuelve true si esta funcionando correctamente el modo nativo, ejemplo:
      if (isnativemode == false) print "A ocurrido algún error con la ventana de Ultima". También puede escribirse isnatmode.
    • Color: Además de usarse para definir el tipo Color también sirve para saber que color una localización precisa, ejemplo:

      if (color loc1 != [1,1,1]) say "a cambiado el color"

      Con la ventana minimizada no funciona, ni siquiera
      en modo nativo,es necesario que el punto a evaluar
      este en primer plano.
    • Component: se usa para poder diferenciar cada uno de los componentes básicos de colores o localizaciones, ejemplo:

      Location barra_vida = [358, 325];
      Color c = Color barra_vida;
      Number verde = component 2 c
      
      while (verde < 125) {
      c = Color barra_vida
      verde = component 2 c
      print "No estamos muy verdes"
      }
      print "SuperVerdes"

    • true: es una variable predefinida con el valor 1, para facilitar el uso en comandos de evaluación, ejemplo:
      while (true) say "Siempre se ejecuta..."
    • false: es una variable predefinida con el valor 0, para facilitar el uso en comandos de evaluación, ejemplo:
      if (false) print "nunca llega" 
    • sindarin_version: variable predefinida de tipo Number, que contiene el numero de la versión de Sindarin corriendo en el momento, ejemplo:
    • if sindarin_version < 1 print "Esta version no es definitiva"
    • sindarin_revision: variable predefinida con la revisión del sindarin en que esta corriendo, ejemplo:
      if (sindarin_revision != 0) say "Usando una versión beta de Sindarin"
    Las variables predefinidas no pueden ser modificas, 
    ante cualquier intento se emitirá un error

9 comentarios:

  1. Hola, me parece un post muy interesante y bonito. Yo personalmente prefiero el libro, pero tu comentario sobre la película Sindarin me ha parecido muy tierno y acertado.

    Un saludo
    Ender ;)

    ResponderEliminar
  2. Ender, no te metas con mi niño! Deja que se exprese y cuente sus hazañas. Aaaay criaturita.

    Ciao.

    ResponderEliminar
  3. CALLAOS LOS 2 HIPOGLUSIDOS!!!

    Si a ninguno de los 2 le interesa este programa, aquí quien tiene que dejar comentarios son los que Juegan a UO y especialmente los que usan o han usado Sindarin alguna vez.

    ResponderEliminar
  4. Hipoglúcidos?? Pero si resulta que Lhrod en realidad en Homer Simpson :o

    Yo, supongo que de la misma manera que Ender, opinamos para darle un toque de realismo a este post. ¿qué coño es el UO? ¿cuánta gente sabe qué es el UO?

    Aún así te felicito por tu programa porque parece que resulta muy útil para un juego y te felicito más aún por haberlo hecho libre y multiplataforma (aunque tengas esos problemas de funcinamiento fuera de windows).

    Ya puestos, hago una petición. El próximo post que sea menos friki y con más carne :$

    ResponderEliminar
  5. Hola a todos los cinéfilos del anphora de lhrod!.

    Es increible lo mucho que se aprende aqui de cine, me anoto las valiosas referencias que han hecho al musical "Windows". Al melodrama fanstastico "UO"... ¿UO?, bueno. Y al largometraje de animación de los Simpson.

    Yo para no ser menos y contribuir al magnífico trabajo de lhrod incluyo mi recomendación cinéfila de hoy: Batman, el caballero oscuro. Peliculón.!

    Animo! a seguir así! Sindarin still live!!
    Ender

    ResponderEliminar
  6. Yo soy un jugador del UO, mas concretamente de World of Darkness (perdon por la publicidad :P) y cuando descubri este programa para macrear... deje de usar los otros que habia, por lo fantastico que es el Sindarin, las posibilidades que te brinda este programa son infinitas y personalmente, para mi, yo que llevo 5 años jugando al UO, es el mejor programa con diferencia que he usado para facilitarme el macreo en el UO.

    Para aquellos que dicen que esto es una "frikada"... no sabeis el pedazo de curro que lleva esta "frikada" ^^

    Mis mas sinceras felicitaciones (y alabanzas :P) para ti por este pedazo de programon Lhrod.


    Un Saludo

    ResponderEliminar
  7. ^^ No pasa naa, x la publicidad, al final si miras la captura de pantalla de esta entrada: http://anphoralhrod.blogspot.com/2008/08/sobre-la-ventana-de-sindarin.html
    se ve el Wod tmb :P

    ResponderEliminar
  8. Llego un poco tarde, pero mas vale tarde que nunca, es para hacer una petición, para un cambio en la aplicación, solo un cambio pequeño.
    Ahora en el servidor de WoD la ventana del juego no empieza con el titulo Ultima Online, por lo que el sindarin no detecta la ventana, el cambio que me gustaría es que se pudiese meter a mano el titulo de la ventana del juego.
    Yo lo intentaría hacer yo, pero mis niveles de Java están entre 0 y ninguno ;)
    Muchísimas gracias por esta pedazo de aplicación

    ResponderEliminar
  9. Bueno cmo no es 1 cambio muy importante, vere que se puede hacer.

    ResponderEliminar