Saltar al contenido principal

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ónSignificado
labelEl nombre de la lista.
ofEl id del Framework de contenido.
maxCuántas entradas guarda la lista, de 1 a 128.
cardEl Frame que dibuja una entrada como tarjeta. Debe ser un Frame del Framework de contenido.
summaryHasta 4 campos de la entrada para mostrar en su fila.
effects, caps, distinctByEntradas 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.

schemas/keeper.json
  "lists": {
    "pack": {
      "label": "Pack",
      "of": "trinket",
      "max": 2,
      "card": "trinket-card",
      "summary": ["weight"]
    }
  }
  1. Línea 45 El Framework de contenido cuyos preajustes son las entradas.
  2. Línea 46 La lista guarda como máximo esta cantidad de entradas.
  3. Línea 47 El Frame que dibuja una entrada.
  4. 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.

rules/pack-trinket.ts
export function pack_trinket(self: ElementRef, trinket: ContentRef): void {
  list.add(self, "pack", trinket, offer.where({ weight: { lte: 3 } }));
}
  1. Línea 1 La entrada que elige el jugador.
  2. Línea 2 list.add comprueba primero la oferta. Esta oferta permite entradas que pesen 3 o menos.

Quita una entrada con list.remove.

rules/unpack-trinket.ts
export function unpack_trinket(self: ElementRef, trinket: ContentRef): void {
  list.remove(self, "pack", trinket);
}
  1. 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.

OperadorSignificadoEjemplo
eqEl campo es igual al valor.{"slot":{"eq":"Ring"}}
neEl campo no es igual al valor.{"slot":{"ne":"Ring"}}
gteEl número es como mínimo el valor.{"weight":{"gte":2}}
lteEl número es como máximo el valor.{"weight":{"lte":3}}
inEl campo es igual a uno de los valores. Hasta 64 valores.{"slot":{"in":["Ring","Cloak"]}}
hasEl 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.

layouts/keeper.json
      {
        "kind": "region",
        "id": "pack_list",
        "listBinding": "{{element.lists.pack}}",
        "emptyText": "Your pack is empty.",
        "itemActions": [{ "actionRef": "unpack_trinket", "label": "Unpack" }]
      }
  1. Línea 46 Se muestra mientras la lista está vacía.
  2. 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.

scenarios/pack.json
{
  "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"] }
}
  1. Líneas 19-24 Aceptado: se añade la cuerda.
  2. Líneas 25-31 Rechazado: la mochila ya tiene la cuerda.
  3. Líneas 32-38 Rechazado: la oferta no permite el yunque.
  4. Líneas 47-53 Rechazado: la mochila tiene 2 entradas, que es su máximo.
  5. Líneas 54-61 Quitado: la cuerda sale de la mochila.
  6. Líneas 62-68 Rechazado: la cuerda ya no está en la mochila.
  7. 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.

scenarios/seeded.json
{
  "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"] }
}
  1. Línea 18 La lista con la que empieza el Elemento.
  2. 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.