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ón | Qué 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ón | Qué 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ón | Qué 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ón | Qué 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ón | Qué 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ón | Qué 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.