Diálogos
Cómo escribir diálogos con ramas, variables y condiciones (y exportarlos a Ink)
Los diálogos con ramas se complican cuando las opciones dependen de lo que pasó antes: ¿pidió perdón el jugador? ¿tiene la llave? ¿mintió? Este artículo muestra un ejemplo pequeño y completo, las tres cosas que suelen fallar y cómo comprobarlas antes de que el diálogo llegue al motor.
Por qué se ramifica, y por qué no todo debe ramificar
En narrativa interactiva una elección solo importa si deja huella: si lo que decide el jugador cambia lo que ocurre después o lo que los personajes piensan de él. Pero abrir una historia nueva con cada decisión es inviable, porque las ramas se multiplican con cada elección y habría que escribir (y probar) cada combinación. Por eso los diálogos con ramas suelen apoyarse en dos recursos. El primero es la estructura de ramas y cuellos de botella (branch and bottleneck): las ramas se separan durante una escena y vuelven a un punto común. El segundo es recordar en lugar de bifurcar: en vez de abrir un camino nuevo, se guarda lo ocurrido en una variable (confianza, mintio) y se consulta más tarde para cambiar las opciones disponibles o las respuestas. Eso es lo que hace el ejemplo de este artículo, y por eso las variables y las condiciones son la pieza central: permiten que una elección tenga consecuencias sin multiplicar el texto.
1. El modelo: nodos, opciones y estado
Con tres ideas basta para casi cualquier diálogo:
- Nodo: un tramo de conversación. En Ink se llama knot; en Yarn Spinner, node.
- Opción: una línea que el jugador puede elegir. Puede tener una condición (cuándo está disponible) y efectos (qué cambia al elegirla).
- Estado: variables que se mantienen entre nodos, como
confianza,tiene_llaveomintio.
Si puedes describir tu escena con esas tres piezas, puedes escribirla en cualquier herramienta.
2. Un ejemplo completo
Una escena corta, escrita como texto plano. Marta espera en un puerto; según cómo le hables, te dará o no una llave.
## Llegada
EXT. PUERTO - ANOCHECER
MARTA: Llegas tarde.
> Pedir perdón {efecto: +confianza} → [[#Charla]]
> Mentir {efecto: mintio} → [[#Charla]]
## Charla
MARTA: ¿Qué quieres?
> Pedir la llave {requiere: confianza >= 1} {efecto: tiene_llave} → [[#Final]]
> Insistir {requiere: confianza < 1} → [[#Rechazo]]
## Rechazo
MARTA: Así no.
## Final
MARTA: Toma.
Fíjate en lo que queda explícito, sin esconderlo en un diagrama: la condición de cada opción (requiere), los efectos (+confianza, mintio, tiene_llave) y los saltos (→ [[#Charla]]). Un efecto con solo el nombre de una variable (mintio) la pone a verdadero, y +confianza le suma uno.
Las variables empiezan con un valor inicial: confianza = 0, tiene_llave = false, mintio = false. En Entrelazo se escriben en el campo «Variables» del diálogo, una por línea y con ese mismo formato (confianza = 0). Si usas una variable sin declararla, Entrelazo la añade a la exportación con valor 0 (o false si solo se usa como condición), pero conviene declararla para que el valor inicial sea una decisión tuya y no un accidente.
3. La misma escena en Ink
VAR confianza = 0
VAR tiene_llave = false
VAR mintio = false
-> puerto__llegada
=== puerto__llegada ===
// EXT. PUERTO - ANOCHECER
MARTA: Llegas tarde. #speaker:marta
+ [Pedir perdón]
~ confianza = confianza + 1
-> puerto__charla
+ [Mentir]
~ mintio = true
-> puerto__charla
+ -> END
=== puerto__charla ===
MARTA: ¿Qué quieres? #speaker:marta
+ {confianza >= 1} [Pedir la llave]
~ tiene_llave = true
-> puerto__final
+ {confianza < 1} [Insistir]
-> puerto__rechazo
+ -> END
=== puerto__rechazo ===
MARTA: Así no. #speaker:marta
-> END
=== puerto__final ===
MARTA: Toma. #speaker:marta
-> END
La traducción es mecánica: cada nodo pasa a ser un === knot; una condición pasa a ser una guarda { … } delante de la opción; un efecto pasa a ser una sentencia ~; un salto pasa a ser un desvío ->. La última opción, + -> END, es una opción de reserva: Ink solo la toma si no queda ninguna otra disponible, así que la historia no se queda sin salida cuando ninguna condición se cumple.
4. Y en Yarn Spinner
Es la misma lógica con otra sintaxis. Este es el nodo charla, exportado:
title: puerto__charla
tags: puerto
---
MARTA: ¿Qué quieres?
-> Pedir la llave <<if $confianza >= 1>>
<<set $tiene_llave to true>>
<<jump puerto__final>>
-> Insistir <<if $confianza < 1>>
<<jump puerto__rechazo>>
===
La condición va en la opción con <<if>>, los efectos con <<set>> y los saltos con <<jump>>. Las variables se declaran al inicio del primer nodo con <<declare $confianza = 0>>.
5. Tres cosas que suelen fallar
- Opciones inalcanzables. Una condición que nadie puede cumplir. Por ejemplo, si en la escena anterior pidiéramos
confianza >= 2para la llave pero lo máximo que se puede ganar es 1, «Pedir la llave» no aparecería nunca. Solución: juega la escena forzando valores de variables y mira qué opciones aparecen. - Variables sin declarar o mal escritas. Un
confinzaporconfianzaes otra variable distinta. En Ink usarla sin declarar es un error de compilación (Unresolved variable), y en Yarn Spinner también (el compilador lo informa como YS0003, variable sin declarar). Ojo con las pruebas a mano: en una vista previa una variable que no existe vale 0, así que la condición falla sin avisar. Solución: declara todo en un solo sitio y comprueba dónde se usa cada nombre. - Saltos rotos entre archivos. Renombras un nodo y un desvío en otro diálogo sigue apuntando al nombre antiguo. Ink lo detecta al compilar (Divert target not found); con Yarn Spinner no lo doy por hecho. Solución: usa nombres que incluyan el diálogo (
puerto__charla) y revisa cada salto después de renombrar.
6. Compruébalo antes de que llegue al motor
No necesitas el motor para probar la lógica.

Dos hábitos baratos:
- Juega el diálogo en una vista previa donde puedas editar las variables. Si pones
confianza = 0y ves que «Pedir la llave» queda bloqueada, la condición funciona. - Compila la exportación con la herramienta oficial como parte de tu proceso de build: inklecate o inkjs para Ink,
yscpara Yarn Spinner. Así un error tipográfico falla en segundos y no en mitad de una partida.
7. Si quieres una herramienta que lo haga
Estoy construyendo Entrelazo, una herramienta gratuita en el navegador. Mantiene el diálogo como texto plano, lo muestra como grafo o como guion, te deja probarlo con variables editables en su pestaña «Probar» y lo exporta a Ink, Yarn Spinner y JSON. Los fragmentos de este artículo son su salida real. Es una demo: funciona en el navegador, no pide cuenta y tus archivos se quedan en tu equipo.
Prueba el ejemplo: abrir la demo.
Si usas otro flujo de trabajo, me encantaría saber qué te resulta más pesado: escríbeme a core@kaizenith.es.