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ção | Significado |
|---|---|
| label | O nome da lista. |
| of | O id do Framework de conteúdo. |
| max | Quantos itens a lista guarda, de 1 a 128. |
| card | O Frame que desenha um item como cartão. Deve ser um Frame do Framework de conteúdo. |
| summary | Até 4 campos do item para mostrar na linha dele. |
| effects, caps, distinctBy | Itens 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.
"lists": {
"pack": {
"label": "Pack",
"of": "trinket",
"max": 2,
"card": "trinket-card",
"summary": ["weight"]
}
}- Linha 45 O Framework de conteúdo cujos presets são os itens.
- Linha 46 A lista guarda no máximo este número de itens.
- Linha 47 O Frame que desenha um item.
- 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.
export function pack_trinket(self: ElementRef, trinket: ContentRef): void {
list.add(self, "pack", trinket, offer.where({ weight: { lte: 3 } }));
}- Linha 1 O item que o jogador escolhe.
- Linha 2 list.add confere a oferta primeiro. Esta oferta permite itens que pesam 3 ou menos.
Remova um item com list.remove.
export function unpack_trinket(self: ElementRef, trinket: ContentRef): void {
list.remove(self, "pack", trinket);
}- 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.
| Operador | Significado | Exemplo |
|---|---|---|
| eq | O campo é igual ao valor. | {"slot":{"eq":"Ring"}} |
| ne | O campo é diferente do valor. | {"slot":{"ne":"Ring"}} |
| gte | O número é pelo menos o valor. | {"weight":{"gte":2}} |
| lte | O número é no máximo o valor. | {"weight":{"lte":3}} |
| in | O campo é igual a um dos valores. Até 64 valores. | {"slot":{"in":["Ring","Cloak"]}} |
| has | O 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.
{
"kind": "region",
"id": "pack_list",
"listBinding": "{{element.lists.pack}}",
"emptyText": "Your pack is empty.",
"itemActions": [{ "actionRef": "unpack_trinket", "label": "Unpack" }]
}- Linha 46 Mostrada enquanto a lista está vazia.
- 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.
{
"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"] }
}- Linhas 19-24 Aceito: a corda é adicionada.
- Linhas 25-31 Recusado: o pacote já guarda a corda.
- Linhas 32-38 Recusado: a oferta não permite a bigorna.
- Linhas 47-53 Recusado: o pacote guarda 2 itens, que é o máximo dele.
- Linhas 54-61 Removido: a corda sai do pacote.
- Linhas 62-68 Recusado: a corda não está mais no pacote.
- 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.
{
"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"] }
}- Linha 18 A lista com que o Element começa.
- 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.

