Fórmulas y funciones

El catálogo completo de funciones del motor de fórmulas, con su firma, sintaxis y ejemplos, generado del propio motor.

Todas las fórmulas de Roliando (campos derivados, límites, efectos, umbrales y bonos de una tirada, condiciones de una decisión, pasos de creación) las evalúa el mismo motor propio: un intérprete con lista blanca de funciones que no ejecuta código. Esta página es el catálogo completo, generado del propio motor, para consultarlo mientras escribes. Cómo se montan los campos y dónde se escribe cada fórmula está en Campos y fórmulas.

Dónde se usan

Una fórmula se escribe en el creador de sistemas (Funciones para ponerles nombre a las que repites), en campos derivados, en límites, en efectos y en las tiradas: el umbral, el bono, cuántos dados se tiran y la condición de una decisión posterior. Mientras escribes, el editor sugiere los campos y las funciones que casan, avisa debajo si algo no se entiende o nombra un campo que no existe y enseña el resultado con valores de muestra.

Sintaxis

  • Números y textos entre comillas: 'ligera' o "ligera".
  • Operadores: + - * / % y paréntesis.
  • Comparadores: < <= > >= == !=. Si algún lado no es un número, == y != comparan como texto.
  • Lógica: AND / OR / NOT, o &&, || y !.
  • Ternario: condición ? siVerdadero : siFalso.
  • Referencias: el nombre o la clave de cualquier campo. Un campo que no existe vale 0 y no rompe la ficha.
  • field_value: en los umbrales de una tirada, el valor del propio campo.

Funciones

Cada tabla agrupa las funciones por lo que hacen. La primera columna es la firma tal como se escribe; los argumentos entre paréntesis separados por comas.

Lógica y condiciones

FunciónQué hace
IF(condición, siVerdadero, siFalso)Devuelve un valor u otro según la condición. Ej: IF(fuerza > 50, 2, 1)
IFS(cond1, val1, cond2, val2, …, porDefecto)Varias condiciones en cadena: devuelve el primer valor cuya condición se cumple; el valor suelto final = por defecto. Ej: IFS(vida <= 0, 0, vida < 5, 1, 2)
AND(a, b, …)Verdadero si todas las condiciones se cumplen.
OR(a, b, …)Verdadero si alguna condición se cumple.
NOT(a)Invierte una condición.
XOR(a, b, …)Verdadero si se cumple exactamente UNA de las condiciones.
BETWEEN(x, min, max)Verdadero si x está entre min y max (ambos incluidos). Ej: BETWEEN(nivel, 5, 10)

Números

FunciónQué hace
MIN(a, b, …)El menor de los valores. Ej: MIN(destreza, 80)
MAX(a, b, …)El mayor de los valores. Ej: MAX(1, fuerza - 10)
FLOOR(x)Redondea hacia abajo. Ej: FLOOR(destreza / 2)
CEIL(x)Redondea hacia arriba.
ROUND(x)Redondea al entero más cercano.
ABS(x)Valor absoluto (sin signo).
CLAMP(x, min, max)Limita x entre min y max. Ej: CLAMP(pv, 0, pv_max)
SUM(a, b, …)Suma de todos los valores (también los de una lista). Ej: SUM(LOOKUP('pokedex', especie, 'moves.[].Power'))
AVG(a, b, …)Promedio de los valores (también los de una lista).
POW(base, exponente)Potencia. Ej: POW(2, nivel)
SQRT(x)Raíz cuadrada.
MROUND(x, múltiplo)Redondea al múltiplo más cercano. Ej: MROUND(peso, 5)

Listas

FunciónQué hace
COUNT(lista)Cuántos elementos tiene una lista. Ej: COUNT(LOOKUP('pokedex', especie, 'moves'))
INCLUDES(lista, valor)1 si la lista contiene ese valor (sin distinguir mayúsculas ni tildes). Ej: INCLUDES(LOOKUP('pokedex', especie, 'tipos'), 'Fuego')
INDEX(lista, n)El elemento n de una lista, empezando en 1. Ej: INDEX(tipos, 2)
JOIN(lista, separador)Une una lista en un texto. Ej: JOIN(LOOKUP('pokedex', especie, 'moves.[].Name'), ' / ')
FILTER(lista, campo, valor)Los elementos de una lista cuyo campo vale eso. Ej: COUNT(FILTER(LOOKUP('pokedex', especie, 'moves'), 'Type', 'Fuego'))

Texto

FunciónQué hace
CONCAT(a, b, …)Une textos. Ej: CONCAT(nombre, ' el ', apodo)
LEN(texto o lista)Largo de un texto, o cuántos elementos tiene una lista.
CONTAINS(texto, trozo)1 si el texto contiene ese trozo (sin distinguir mayúsculas ni tildes). Ej: CONTAINS(clase, 'mago')
UPPER(texto)En mayúsculas.
LOWER(texto)En minúsculas.
TEXT(x, decimales)Un número como texto, con esos decimales. Ej: TEXT(peso / 3, 1)
SIGNED(x)Un número con su signo: «+3», «−2», «0». Para enseñar modificadores.

Bases de datos del sistema

FunciónQué hace
LOOKUP(catálogo, nombre, campo)Valor de un campo de una entrada de un catálogo, buscándola por su nombre. Ej: LOOKUP('pokedex', especie, 'atk') → el ATK de la especie elegida. Dentro de una lista: 'moves.0.Name' (uno) o 'moves.[].Name' (todos los nombres). Con un campo de lista da la lista: SUM(LOOKUP('armas', armas, 'peso')). Un enlace a otro catálogo se sigue anidando: LOOKUP('escuelas', LOOKUP('conjuros', conjuro, 'escuela'), 'color').
CATALOG_COUNT(catálogo)Cuántas entradas tiene un catálogo. Ej: CATALOG_COUNT('pokedex').
CATALOG_SUM(catálogo, campo)Suma de un campo en TODAS las entradas de un catálogo. Ej: CATALOG_SUM('objetos', 'peso').

Perks y otros campos

FunciónQué hace
HAS_PERK('clave', …)1 si el personaje tiene alguno de esos perks (por su clave), 0 si no. Cuenta también los que da el máster y las pasivas. Ej: HAS_PERK('origen_justiciero').
COUNT_PERKS('categoría')Cuántos perks de esa categoría tiene el personaje (la categoría o las que empiezan así: 'Arte' cuenta 'Arte · básicas'…). Ej: COUNT_PERKS('Bendición') < 5
CAMPO(nombre)Valor del campo que se llama así (por su nombre visible o su clave). Ej: CAMPO(atributo) → el valor del atributo elegido en el selector. También vale con casillas y números: IF(CAMPO(maestria), 1, 0).

Ejemplos

Modificador clásico: FLOOR((vigor - 10) / 2). Vida por nivel: aguante + nivel * 2. Nunca por debajo de 0 ni por encima del máximo: CLAMP(vida, 0, vida_max). Depende de la clase: IF(clase == 'mago', 3, 1). Escalón por nivel: IFS(nivel >= 10, 4, nivel >= 5, 2, 1). Con una función propia: BONO(vigor) + 2.

Errores frecuentes

«Sale 0 y no sé por qué.» El nombre del campo no existe o está mal escrito: un campo desconocido vale 0. Mira el aviso bajo la fórmula.

«Una comparación de texto no se cumple.» Los textos van entre comillas simples o dobles; clase == mago busca un campo llamado «mago».

«LOOKUP da 0.» El sistema no tiene esa base de datos, o el nombre de la entrada no coincide con ninguna. Las bases de datos se explican en Campos y fórmulas.

Véase también

Campos y fórmulas, Tiradas, Creador de sistemas: primeros pasos, Comandos del chat y dados.

Todas las guías de Roliando