Brico-rol – Tutorial de Roll20 para programar macros como un profesional

Bienvenidos a Diario Silvano, el blog de rol. Al habla Angelo. Hoy es el último viernes del mes junio, por lo que toca bricolaje (digital) rolero. Este va a ser el último tutorial que vamos a dedicar a Roll20 y tratará la parte más compleja del mismo: la programación de macros. Pero no os preocupéis, con esta guía serán menos difíciles.

Éste no va a ser un tutorial desde cero de Roll20, sino que vamos a explorar varias recetas para usar el mismo. Por tanto sería recomendable que ya tuvieras cierta experiencia en su uso o, al menos, que hubieras visto su funcionamiento. Hay muchos tutoriales que ver en Youtube (como éste de Víctor Romero), pero un buen lugar para empezar sería la misma wiki oficial (en inglés).

Soy consciente de que me he vuelto a plagiar a mi mismo en este fragmento. Pero… Es perfecto para empezar. Si quieres ver el resto de tutoriales sobre Roll20, tienes los enlaces recopilados al final de esta entrada.

El tema de hoy está bastante bien documentado en inglés en la wiki oficial. En caso de duda siempre puedes consultar o para ampliar conocimientos. El enfoque de este tutorial es enseñar su funcionamiento de forma básica y luego mostrar algunas avanzadas con ejemplos que podemos usar en nuestras partidas.

Herramientas disponibles

Antes de entrar en el tutorial propiamente dicho, vamos a explorar las herramientas que podemos utilizar en Roll20 sin cuenta de pago.

Macros

Como el propio título de la entrada indica, era de extrañar que no hablemos de ello. Más adelante entraremos en los detalles, pero aquí vamos a ver su posicionamiento en la plataforma y algunos conceptos básicos. Las macros se encuentran en el apartado «Collections» y podemos habilitar que estas se muestren como acceso rápido en la parte inferior de la pantalla.
Click para ampliar

¿Pero que es una macro exactamente? En el contexto de Roll20 es una funcionalidad que manda un mensaje al chat con un texto predefinido por nosotros a través de un lenguaje propio. Uno de los usos que podemos hacer de ello es resolver una tirada, aunque podemos usarlo con distintas finalidades como mandar mensajes a los miembros del grupo o mostrar textos predefinidos.

Lo mínimos elementos que componen a una macro son su nombre (que no puede tener espacios) y las instrucciones que debe ejecutar. Además, podemos habilitar la macro para que se muestre como una de las acciones génericas de todos los personajes. Para acabar, podemos dar permiso individualizado a los jugadores para que puedan utilizar estas macros.

Click para ampliar

Hay que señalar que el lenguaje utilizado tiene una serie de limitaciones. La primera es que no permite operaciones complejas, es decir, podemos usar fórmulas matemáticas pero no tiene soporte para condiciones de forma nativa. Una de las razones por lo que esto es así es debido a que la opción de pago de crear fichas permite realizar operaciones mucho más complejas. La segunda, debido a limitación poco amigable con el usuario, para realizar macros más complejas vamos a tener que sustituir algunos caracteres (ej. «}») por su referencia en html (ej. «}» sería «}»). Ello supone que incremente considerablemente la posibilidad de cometer errores no facilmente detectables y dificultar la legibilidad del código.

De esto hablaremos con ejemplos concretos más adelante.

Se utiliza una macro con el siguiente formato: #Macro.

Characters

Dentro del apartado Journal, ya hablamos anteriormente sobre los personajes en cómo documentar como un profesional. Como hemos adelantado en el apartado anterior, aquí nos centraremos en aquello de utilidad para la automatización: «attributes» y «abilities».

Los atributos, como su propio nombre indica, son estadísticas del personaje. Puede contener tanto números como letras. Nosotros podemos crear tantos atributos como queramos o pueden generarse automáticamente al utilizar una ficha de juego. Podemos utilizarlos en las macros tanto para indicar su valor en un texto como dentro de una operación matemática o tiradas.

Las habilidades son un subtipo de macro con algunas particularidades. La primera es que están contenidas dentro de un personaje, por lo que solo pueden ser usadas por usuarios que tengan permiso para su control (dato muy importante como ya veremos). La segunda es que una habilidad puede ser llamada por otra habilidad independientemente de que sea de otro personaje (otro dato importante), aunque una macro no puede llamar a una habilidad.

Los tres principios básicos

Estos son el sota, caballo y rey de las macros. Sabiendo esto bien ya tenemos una buena base para programar.

Todo lo que podemos escribir en el chat es una macro

Es exactamente lo que dice el título. La macro es una orden para escribir algo preestablecido en el chat. Ello nos permite escribir texto directamente, usar la funcionalidad de los susurros o utilizar el título para describir acciones. Eso sin contar del simple comando «roll».

De hecho, los siguientes principios básicos también funcionan si los escribimos en el chat (aunque sea complicarnos algo la existencia). Sin embargo, los hemos separado para clarificar su aprendizaje.

Lo que va entre doble corchete aplica matemáticas o tiradas

El primer efecto visible de utilizar el doble corchete es que lo interior queda enmarcado en un cuadrito. El segundo, es que podemos insertar resultados dentro de un texto sin utilizar el comando «roll». Incluso si ponemos el cursor encima podemos ver las operaciones que se han realizado.

Click para ampliar

Además de tiradas podemos realizar diversas operaciones matemáticas como vemos a continuación.

Click para ampliar


Como es lógico, también podemos emplear los paréntesis. La peculiaridad en las macros es que también de esta forma podemos expresar de esta forma el número de dados y el tipo de dado.

Click para ampliar

Más útil cuando usamos variables y no valores fijos, pero esto ya lo veremos.

Los corchetes también pueden ser utilizados como paréntesis, pero estos van a enmascarar las operaciones hechas. Puede ser útil para acumular en un solo número diversos modificadores o para enmascarar la tirada hecha.

Click para ampliar

Un símbolo y dos llaves indican una función especial

Cuando leemos una llave sabemos que hay un elemento especial. Estos tienen diferentes significados y usos como veremos a continuación.

Podemos utilizar el atributo de un personaje en una macro o en una habilidad con el siguiente formato: @{Personaje|Atributo}.

Igualmente, podemos usar la habilidad de un personaje en otra habilidad con el siguiente formato: %{Personaje|Habilidad}.

Podemos ordenar la información utilizando una plantilla, que en esencia es una tabla. El formato sería: &{template:default} {{name=Título}} {{Fila 1=[[1d20]]}} {{Fila 2=Resultado}}.

Click para ampliar

Una macro también puede solicitar al usuario una variable para aplicar a una fórmula o al texto que deba publicar. Existirían dos tipos de consultas (query): introducir texto y un menú desplegable.

La fórmula de la petición de un texto sería: ?{Título|Valor Base}. En un ejemplo práctico: [[?{Num dados|1}d6]].

Click para ampliar

La fórmula de la petición de menú desplegable tendría dos versiones. La primera sería: ?{Título|Opción1|Opción2|Opción3|Opción4|Opción5}. La segunda que separa opción y valor sería: ?{Título|Opción1, Valor1|Opción2, Valor2|Opción3, Valor3|Opción4, Valor4|Opción5, Valor5}. Esta forma solo permite introducir como máximo cinco opciones.

Click para ampliar

Para acabar este apartado, también tenemos una función para contar resultados. Es decir, en una serie de N números nos dice cuantos serán igual a un valor determinado. El formato sería: {{serie de números}=valor}. En un ejemplo: [[{{2, 1, 2, 0}=0}]]. Además del símbolo igual podemos usar el «>» y el «<».

Click para ampliar

Funciones avanzadas

Con los tres principios básicos anteriores ya podemos hacer bastantes cosas con nuestras macros. Ahora vamos a ver explorar fórmulas más complejas.

Anidar

Se define en informática anidar cuando una función llama a otra función. Anteriormente, por ejemplo, con los resultados entre corchetes hemos visto la anidación con la utilidad de enmascarar resultados (ej. [[[[1d4]]+[[1d3]]]]). Con las funciones que usan llaves también también podemos insertar en su interior otras funciones con llaves, pero vamos a tener que diferenciar dos tipos: las consultas y todo lo demás.

Por como están programadas las consultas, muy mal, cuando detecta la llave de cerrar corta directamente la función dando un error. Por ejemplo, si una de las opciones del menú desplegable contiene una tabla cortará la macro justo cuando acabe ésta. Para evitar esto, como comentamos más arriba, la solución que nos da oficialmente es reemplazar algunos caracteres («&», «|», «,» y «}») como elementos html («&amp;», «&#124;», «&#44;» y «&#125;»). En el siguiente ejemplo vamos a mostrar como una consulta con menú desplegable puede contener entre sus opciones otra consulta: [[1d20+?{Modificador|Menor, 2|Mayor, 5|Personalizado, ?{Modificador &#124;0&#125;}]].

Hay que advertir que en el caso de de usar de los atributos y las habilidades NO hace falta reemplazar los caracteres. Por ello sería válido: [[1d20+?{Modificador|Puntuación, @{Personaje|Atributo}|Personalizado, ?{Modificador &#124;0&#125;}]].

El resto de funcionalidades que usan corchetes pueden contener el resto con normalidad. Incluso los mismos atributos, habilidades y macros. Éstas lo que hacen es insertar la cadena de texto que contienen en el lugar que se utilizan. Por ejemplo, una habilidad puede tener una consulta que derive a dos tablas distintas según la opción elegida. Las dos particularidades que debemos tener en cuenta son las siguientes: las funciones con elemento html solo funcionan cuando están anidadas (nunca una llamada directa) y las macros transforman automáticamente los elementos html en caracteres (por lo que no pueden ser usados para anidar).

Una de los beneficios de anidar utilizando llamadas a atributos, habilidades y macros es la legibilidad de la macro. En lugar de escribir una línea horrible de código difícil de leer e incluso con referencias html, separas en pequeños fragmentos más manejables. Otro de los beneficios es reutilizar fragmentos de código en diferentes macros, facilitando la homogeneidad. Para acabar, vinculado con lo anterior, si quieres cambiar algo solo debes hacerlo una vez y no múltiples veces. A continuación podemos ver un ejemplo con una consulta que te permite elegir entre la tabla de tirada de ataque cuerpo a cuerpo o a distancia.

Click para ampliar

Singleton

En jerga de programación, un singleton es una pieza de código única a la que otras funciones van a hacer referencia. De forma metafórica, es el encargado de algo que todos los trabajadores de la compañía van a pedirle directamente sin restricciones. Obviando el debate de si es recomendable o no en programación… aquí podemos utilizar esta técnica para facilitarnos la existencia.

Cualquier personaje puede utilizar los atributos y las habilidades de otro personaje en sus propias habilidades. La única limitación es que el usuario que use la habilidad tenga permiso para controlar a ambos personajes o de lo contrario no funcionará.

Es un error que es bastante sigiloso.

Puede ocurrir que haya habilidades génericas que nos interese almacenar en ese personaje «singleton» para tener un solo punto de modificación gracias a la capacidad de anidar. Un ejemplo sería un cuestionario para seleccionar el daño como el mostrador en la imagen de la sección anterior.

También podemos utilizar el personaje «singleton» para tener atributos controlados por el director de juego. Un ejemplo de este uso sería determinar la clase de dificultad y que luego quedara reflejada en las tiradas. Un ejemplo de código podría ser: &{template:default} {{name=Tirada de Fuerza}} {{Dificultad=[[@{Singleton|Dificultad}]]}} {{Resultado=[[1d20+@{Personaje|Competencia}+@{Personaje|ModFuerza}]]}}.

Dado que podemos vincular un personaje a un token y a su vez una de las barras a un atributo, podemos modificar al vuelo las dificultades aplicables en las tiradas. Sirva de ejemplo la imagen de abajo, donde el token con el dibujo de un carrete tiene asignada las dificultades del minijuego de pesca.

Click para ampliar

Fachada

No es exactamente el término usado en informática, pero su nombre es bastante ilustrativo para lo que vamos a usar aquí. En lugar de utilizar directamente el atributo de otro personaje (típicamente el singleton anterior) podemos poner entre medias una macro. Es decir: una macro usa el atributo de un personaje y la habilidad de otro personaje usa esa macro. Un detalle a tener en cuenta es que tanto el personaje del atributo como la macro puedan ser usadas por el jugador.

En principio podría parecer que es añadir una capa de complejidad gratuita, pero tiene sus beneficios. Por ejemplo, pasamos de esto «@{Singleton|Dificultad» a esto «#CD». Al reducir el número de caracteres, reducimos las probabilidades de cometer un error. Además, acortamos el tamaño del código (cosa agradecida en algunas macros). Para acabar, si queremos realizar algún cambio (como el nombre del atributo o cambiar la fórmula) solo tendrémos que realizarlo una vez dentro de la macro.

Condiciones matemáticas

Al principio comentamos que el lenguaje básico de las macros no disponía de condiciones nativas. Sin embargo, podemos emularlo con el contador de resultados. Vamos a tener un valor entre de 0 o 1 en función de si no se cumple la condición o se cumple. Este valor puede servirnos para multiplicar otro valor (ej. Modificador) que será el condicionado. Si multiplica por cero no se aplica y si es por uno se aplica.

Para ello en la lista de números debemos poner uno que no sabemos si se va a cumplir (un atributo o una tirada) y otro que nunca se va a cumplir. Como la función cuenta los números que cumplen la condición y de los dos sabemos que uno nunca lo va a cumplir, de ahí formamos un sistema binario. Para una condición que se activa la mitad de las veces multiplicando por 2, un ejemplo de código podría ser: [[{{1d2, 0}=2}*2]].

Obviamente, esto es una forma muy limitada de condición. Si quieres una condición que refleje entre dos opciones vas a tener que introducir mucho más código de forma poco eficiente. Por ejemplo, para activar la mitad de las veces una tirada de 1d20 y la otra mitad un bonificador de +5 vas a tener que armar lo siguiente: [[{{1d2, 0}=2}*1d20+{{1d2, 0}=1}*5]].

Un uso más intensivo de esta funcionalidad podría ser la de crear modificadores en función del estado de un factor. Cada estado tendría asignado un número y a la vez activaría la condición de un modificador. Por ejemplo, en tiradas de viaje con modificadores para distintos terrenos el 0 sería llanura, 2 colinas, 3 montañas y así sucesivamente. Cuando el atributo que controla el tipo de terreno fuese 2, colinas, permitiría aplicar el modificador de colinas. El ejemplo de la tirada con un modificador de colinas sería [[1d20+{{#terreno, 0}>2}*@{Personaje|ModColinas}]].

El resto de terrenos serían sumandos con un código similar.

En el caso de que quisieramos aplicar una condición negativa (cuando no se produzca), simplemente hay que introducir el resultado de la condición en un binomio que reste a un 1. Ejemplo: [[(1-#esColina)*2+1d20]].

Como podéis ver, se puede hacer pero resulta bastante complejo.

Conclusión

Este brico-rol ha sido intenso. Escribir código siempre puede ser complejo y mucho más si la misma plataforma te aporta unas herramientas con diversos problemas. La automatización ayuda en mesa, agiliza las sesiones y permite registrar todo en el chat. A pesar de todo, es un esfuerzo extra que puede llegar a merecer realmente la pena. Aplicando algunas de las técnicas vistas arriba, espero que la experiencia sea mucho más llevadera.

Con esta entrada ya hemos acabado los contenidos planificados de Brico-rol. Por tanto, en principio, ya hemos explorado todos temas de Roll20. Con esta plataforma hemos tocado diversos aspectos que nos permitirán crear sesiones con mayor profundidad usando únicamente la parte gratuita (y legal). A partir de ahora quiero dedicar tiempo a Astral VTT (reseña en este blog), aunque esto supondrá que necesitaré un tiempo de reflexión y experimentación. Dentro de lo posible y cuando no tenga material de Astral, procuraré intercalar otros tutoriales más genéricos para cualquier plataforma. Espero que los tutoriales de Astral os fascine a vosotros igual que me ha fascinado a mí dicha plataforma.

Más Brico-rol sobre Roll20

    • Tutorial de Roll20 para montar mapas como un profesional.

    • Cómo documentar partidas en Roll20 como un profesional.

    • Añadir trucos audiovisuales en Roll20 como un profesional.

COMPARTIR
Icono Facebook. Compartir entrada en Facebook Icono Twitter. Compartir entrada en Twitter. Icono Whatsapp. Compartir entrada en Whatsapp

0 respuestas:

Publicar un comentario