Pular para o conteúdo principal

Code frameworks

Listas de conteúdo

Deixe um personagem ganhar conteúdo durante o jogo: declare uma lista, mude-a com ações e mostre-a na ficha.

O que é uma lista

Uma lista guarda conteúdo que um personagem ganha durante o jogo, como um pacote de bugigangas. O conteúdo é outro Framework, e os presets dele são os itens. Uma lista vive no ledger e não é um campo do construtor. Só as ações a mudam.

OpçãoSignificado
labelO nome da lista.
ofO id do Framework de conteúdo.
maxQuantos itens a lista guarda, de 1 a 128.
cardO Frame que desenha um item como cartão. Deve ser um Frame do Framework de conteúdo.
summaryAté 4 campos do item para mostrar na linha dele.
effects, caps, distinctByItens que mudam modificadores, e limites para eles. Veja Pools e modificadores.

Existem listas de linhas, que adicionam células a cada linha, mas elas ainda não são cobertas.

Declare uma lista

Adicione a lista ao Framework que é dono dela. O Framework de conteúdo guarda os itens como presets. O tutorial Grow Lantern cria o Framework Trinket passo a passo.

schemas/keeper.json
  "lists": {
    "pack": {
      "label": "Pack",
      "of": "trinket",
      "max": 2,
      "card": "trinket-card",
      "summary": ["weight"]
    }
  }
  1. Linha 45 O Framework de conteúdo cujos presets são os itens.
  2. Linha 46 A lista guarda no máximo este número de itens.
  3. Linha 47 O Frame que desenha um item.
  4. Linha 48 Campos para mostrar na linha de um item. Um campo de resumo precisa de um domínio fechado: opções, um mínimo e um máximo, ou verdadeiro e falso.

Adicionar e remover

Uma lista muda apenas por ações. Receba o item como uma entrada ContentRef e chame list.add com uma 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. Linha 1 O item que o jogador escolhe.
  2. Linha 2 list.add confere a oferta primeiro. Esta oferta permite itens que pesam 3 ou menos.

Remova um item com list.remove.

rules/unpack-trinket.ts
export function unpack_trinket(self: ElementRef, trinket: ContentRef): void {
  list.remove(self, "pack", trinket);
}
  1. Linha 2 Remove o item escolhido. É recusado se a lista não o guarda.

Quando um jogador usa o botão, o Fabled pede que ele escolha um dos itens que a oferta permite. Use list.count para barrar uma adição por uma regra sua, como mostra a página Escrever regras.

Ofertas

offer.where recebe condições sobre os campos do item. Você escreve as condições como literais, então uma oferta não pode ler o personagem. Para depender do personagem, teste com if antes de list.add.

OperadorSignificadoExemplo
eqO campo é igual ao valor.{"slot":{"eq":"Ring"}}
neO campo é diferente do valor.{"slot":{"ne":"Ring"}}
gteO número é pelo menos o valor.{"weight":{"gte":2}}
lteO número é no máximo o valor.{"weight":{"lte":3}}
inO campo é igual a um dos valores. Até 64 valores.{"slot":{"in":["Ring","Cloak"]}}
hasO campo é um texto separado por vírgulas que contém um dos valores.{"tags":{"has":["fire"]}}

Toda condição de uma oferta deve valer, e uma oferta nomeia no máximo 6 campos. Um campo que o item não tem nunca combina.

Mostre na ficha

Um Frame que mostra uma lista usa a version 2.0. Declare uma região no dataContract e depois desenhe-a. Uma região também pode dar a cada item até 4 botões, e cada um executa uma ação sobre aquele item.

layouts/keeper.json
      {
        "kind": "region",
        "id": "pack_list",
        "listBinding": "{{element.lists.pack}}",
        "emptyText": "Your pack is empty.",
        "itemActions": [{ "actionRef": "unpack_trinket", "label": "Unpack" }]
      }
  1. Linha 46 Mostrada enquanto a lista está vazia.
  2. Linha 47 Um botão em cada item. A ação deve receber apenas o item.

Teste

Teste cada recusa que a oferta e o tamanho podem dar. Os passos abaixo adicionam, recusam de três formas, removem e recusam uma remoção.

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. Linhas 19-24 Aceito: a corda é adicionada.
  2. Linhas 25-31 Recusado: o pacote já guarda a corda.
  3. Linhas 32-38 Recusado: a oferta não permite a bigorna.
  4. Linhas 47-53 Recusado: o pacote guarda 2 itens, que é o máximo dele.
  5. Linhas 54-61 Removido: a corda sai do pacote.
  6. Linhas 62-68 Recusado: a corda não está mais no pacote.
  7. Linha 70 O pacote termina só com a vela.

Um cenário também pode começar com uma lista que já guarda itens. Nomeie-os em lists, pelo id do preset, e confira-os com 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. Linha 18 A lista com que o Element começa.
  2. Linha 19 A lista depois do cenário.

SAME_NAME e LIST_CAP vêm dos limites de uma lista que aplica efeitos. A página Pools e modificadores os prova.