Code frameworks
Listas de contenido
Deja que un personaje gane contenido durante la partida: declara una lista, cámbiala con acciones y muéstrala en la hoja.
Qué es una lista
Una lista guarda contenido que un personaje gana durante la partida, como una mochila de baratijas. El contenido es otro Framework, y sus preajustes son las entradas. Una lista vive en el ledger y no es un campo del constructor. Solo las acciones la cambian.
| Opción | Significado |
|---|---|
| label | El nombre de la lista. |
| of | El id del Framework de contenido. |
| max | Cuántas entradas guarda la lista, de 1 a 128. |
| card | El Frame que dibuja una entrada como tarjeta. Debe ser un Frame del Framework de contenido. |
| summary | Hasta 4 campos de la entrada para mostrar en su fila. |
| effects, caps, distinctBy | Entradas que cambian modificadores, y sus límites. Mira Reservas y modificadores. |
Existen listas de filas, que añaden celdas a cada fila, pero aún no se cubren.
Declarar una lista
Añade la lista al Framework que la posee. El Framework de contenido guarda las entradas como preajustes. El tutorial Haz crecer Lantern construye el Framework Trinket paso a paso.
"lists": {
"pack": {
"label": "Pack",
"of": "trinket",
"max": 2,
"card": "trinket-card",
"summary": ["weight"]
}
}- Línea 45 El Framework de contenido cuyos preajustes son las entradas.
- Línea 46 La lista guarda como máximo esta cantidad de entradas.
- Línea 47 El Frame que dibuja una entrada.
- Línea 48 Campos que se muestran en la fila de una entrada. Un campo de summary necesita un dominio cerrado: opciones, un mínimo y un máximo, o verdadero y falso.
Añadir y quitar
Una lista solo cambia mediante acciones. Toma la entrada como una entrada ContentRef y llama a list.add con una oferta.
export function pack_trinket(self: ElementRef, trinket: ContentRef): void {
list.add(self, "pack", trinket, offer.where({ weight: { lte: 3 } }));
}- Línea 1 La entrada que elige el jugador.
- Línea 2 list.add comprueba primero la oferta. Esta oferta permite entradas que pesen 3 o menos.
Quita una entrada con list.remove.
export function unpack_trinket(self: ElementRef, trinket: ContentRef): void {
list.remove(self, "pack", trinket);
}- Línea 2 Quita la entrada elegida. Se rechaza si la lista no la tiene.
Cuando un jugador usa el botón, Fabled le pide que elija una de las entradas que permite la oferta. Usa list.count para detener una adición con una regla propia, como muestra la página Escribir reglas.
Ofertas
offer.where recibe condiciones sobre los campos de la entrada. Escribes las condiciones como literales, así que una oferta no puede leer el personaje. Para depender del personaje, compruébalo con if antes de list.add.
| Operador | Significado | Ejemplo |
|---|---|---|
| eq | El campo es igual al valor. | {"slot":{"eq":"Ring"}} |
| ne | El campo no es igual al valor. | {"slot":{"ne":"Ring"}} |
| gte | El número es como mínimo el valor. | {"weight":{"gte":2}} |
| lte | El número es como máximo el valor. | {"weight":{"lte":3}} |
| in | El campo es igual a uno de los valores. Hasta 64 valores. | {"slot":{"in":["Ring","Cloak"]}} |
| has | El campo es un texto separado por comas que contiene uno de los valores. | {"tags":{"has":["fire"]}} |
Todas las condiciones de una oferta deben cumplirse, y una oferta nombra como máximo 6 campos. Un campo que la entrada no tiene nunca coincide.
Mostrarla en la hoja
Un Frame que muestra una lista usa la versión 2.0. Declara una región en el dataContract y luego dibújala. Una región también puede dar a cada entrada hasta 4 botones, y cada uno ejecuta una acción sobre esa entrada.
{
"kind": "region",
"id": "pack_list",
"listBinding": "{{element.lists.pack}}",
"emptyText": "Your pack is empty.",
"itemActions": [{ "actionRef": "unpack_trinket", "label": "Unpack" }]
}- Línea 46 Se muestra mientras la lista está vacía.
- Línea 47 Un botón en cada entrada. La acción debe recibir solo la entrada.
Pruébala
Prueba cada rechazo que pueden dar la oferta y el tamaño. Los pasos de abajo añaden, rechazan de tres maneras, quitan y rechazan una eliminación.
{
"id": "pack-trinkets",
"framework": "keeper",
"parameters": {
"name": "Mira",
"max_hp": 10,
"calling": "Guard",
"lamp": "lamp"
},
"expectedValues": {
"name": "Mira",
"max_hp": 10,
"hp": 10,
"calling": "Guard",
"guard": 3
},
"expectedChildren": { "lamp": { "name": "Lantern", "oil": 5 } },
"actions": [
{
"action": "pack_trinket",
"parameters": {},
"choose": { "trinket": "rope" },
"expectedWrites": [{ "op": "list.add", "key": "pack", "value": "rope" }]
},
{
"action": "pack_trinket",
"parameters": {},
"choose": { "trinket": "rope" },
"expectedRefusal": "ALREADY_IN_LIST",
"expectedWrites": []
},
{
"action": "pack_trinket",
"parameters": {},
"choose": { "trinket": "anvil" },
"expectedRefusal": "NOT_OFFERED",
"expectedWrites": []
},
{
"action": "pack_trinket",
"parameters": {},
"choose": { "trinket": "candle" },
"expectedWrites": [
{ "op": "list.add", "key": "pack", "value": "candle" }
]
},
{
"action": "pack_trinket",
"parameters": {},
"choose": { "trinket": "bell" },
"expectedRefusal": "LIST_FULL",
"expectedWrites": []
},
{
"action": "unpack_trinket",
"parameters": {},
"choose": { "trinket": "rope" },
"expectedWrites": [
{ "op": "list.remove", "key": "pack", "value": "rope" }
]
},
{
"action": "unpack_trinket",
"parameters": {},
"choose": { "trinket": "rope" },
"expectedRefusal": "NOT_IN_LIST",
"expectedWrites": []
}
],
"expectedLists": { "pack": ["candle"] }
}- Líneas 19-24 Aceptado: se añade la cuerda.
- Líneas 25-31 Rechazado: la mochila ya tiene la cuerda.
- Líneas 32-38 Rechazado: la oferta no permite el yunque.
- Líneas 47-53 Rechazado: la mochila tiene 2 entradas, que es su máximo.
- Líneas 54-61 Quitado: la cuerda sale de la mochila.
- Líneas 62-68 Rechazado: la cuerda ya no está en la mochila.
- Línea 70 La mochila termina solo con la vela.
Un escenario también puede empezar con una lista que ya tiene entradas. Nómbralas en lists, por id de preajuste, y compruébalas con expectedLists.
{
"id": "seeded-pack",
"framework": "keeper",
"parameters": {
"name": "Mira",
"max_hp": 10,
"calling": "Guard",
"lamp": "lamp"
},
"expectedValues": {
"name": "Mira",
"max_hp": 10,
"hp": 10,
"calling": "Guard",
"guard": 3
},
"expectedChildren": { "lamp": { "name": "Lantern", "oil": 5 } },
"lists": { "pack": ["rope"] },
"expectedLists": { "pack": ["rope"] }
}- Línea 18 La lista con la que empieza el Elemento.
- Línea 19 La lista después del escenario.
SAME_NAME y LIST_CAP vienen de los límites de una lista que aplica efectos. La página Reservas y modificadores los demuestra.

