Framework in codice
Elenchi di contenuti
Lascia che un personaggio ottenga contenuti giocando: dichiara un elenco, cambialo con le azioni e mostralo sulla scheda.
Che cos'è un elenco
Un elenco contiene i contenuti che un personaggio ottiene giocando, come uno zaino di trinket. Il contenuto è un altro Framework, e i suoi preset sono le voci. Un elenco vive nel registro e non è un campo del costruttore. Solo le azioni lo cambiano.
| Opzione | Significato |
|---|---|
| label | Il nome dell'elenco. |
| of | L'id del Framework di contenuti. |
| max | Quante voci contiene l'elenco, da 1 a 128. |
| card | Il Frame che disegna una voce come carta. Deve essere un Frame del Framework di contenuti. |
| summary | Fino a 4 campi della voce da mostrare sulla sua riga. |
| effects, caps, distinctBy | Voci che cambiano i modificatori, e i limiti su di esse. Vedi Riserve e modificatori. |
Esistono anche gli elenchi a righe, che aggiungono celle a ogni riga, ma non sono ancora trattati.
Dichiara un elenco
Aggiungi l'elenco al Framework che lo possiede. Il Framework di contenuti contiene le voci come preset. Il tutorial Fai crescere Lantern costruisce il Framework Trinket passo dopo passo.
"lists": {
"pack": {
"label": "Pack",
"of": "trinket",
"max": 2,
"card": "trinket-card",
"summary": ["weight"]
}
}- Riga 45 Il Framework di contenuti i cui preset sono le voci.
- Riga 46 L'elenco contiene al massimo questo numero di voci.
- Riga 47 Il Frame che disegna una voce.
- Riga 48 Campi da mostrare sulla riga di una voce. Un campo di riepilogo ha bisogno di un dominio chiuso: opzioni, un minimo e un massimo, oppure vero e falso.
Aggiungi e rimuovi
Un elenco cambia solo tramite le azioni. Prendi la voce come input ContentRef e chiama list.add con un'offerta.
export function pack_trinket(self: ElementRef, trinket: ContentRef): void {
list.add(self, "pack", trinket, offer.where({ weight: { lte: 3 } }));
}- Riga 1 La voce che il giocatore sceglie.
- Riga 2 list.add controlla prima l'offerta. Questa offerta ammette voci che pesano 3 o meno.
Rimuovi una voce con list.remove.
export function unpack_trinket(self: ElementRef, trinket: ContentRef): void {
list.remove(self, "pack", trinket);
}- Riga 2 Rimuove la voce scelta. Viene rifiutata se l'elenco non la contiene.
Quando un giocatore usa il pulsante, Fabled gli chiede di scegliere una delle voci che l'offerta ammette. Usa list.count per fermare un'aggiunta con una regola tua, come mostra la pagina Scrivere le regole.
Offerte
offer.where accetta condizioni sui campi della voce. Scrivi le condizioni come valori letterali, quindi un'offerta non può leggere il personaggio. Per dipendere dal personaggio, controllalo con if prima di list.add.
| Operatore | Significato | Esempio |
|---|---|---|
| eq | Il campo è uguale al valore. | {"slot":{"eq":"Ring"}} |
| ne | Il campo non è uguale al valore. | {"slot":{"ne":"Ring"}} |
| gte | Il numero è almeno il valore. | {"weight":{"gte":2}} |
| lte | Il numero è al massimo il valore. | {"weight":{"lte":3}} |
| in | Il campo è uguale a uno dei valori. Fino a 64 valori. | {"slot":{"in":["Ring","Cloak"]}} |
| has | Il campo è un testo separato da virgole che contiene uno dei valori. | {"tags":{"has":["fire"]}} |
Ogni condizione di un'offerta deve valere, e un'offerta indica al massimo 6 campi. Un campo che la voce non ha non corrisponde mai.
Mostralo sulla scheda
Un Frame che mostra un elenco usa la versione 2.0. Dichiara una regione nel dataContract, poi disegnala. Una regione può anche dare a ogni voce fino a 4 pulsanti, ognuno dei quali esegue un'azione su quella voce.
{
"kind": "region",
"id": "pack_list",
"listBinding": "{{element.lists.pack}}",
"emptyText": "Your pack is empty.",
"itemActions": [{ "actionRef": "unpack_trinket", "label": "Unpack" }]
}- Riga 46 Mostrato mentre l'elenco è vuoto.
- Riga 47 Un pulsante su ogni voce. L'azione deve ricevere solo la voce.
Provalo
Prova ogni rifiuto che l'offerta e la dimensione possono dare. I passi qui sotto aggiungono, rifiutano in tre modi, rimuovono e rifiutano una rimozione.
{
"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"] }
}- Righe 19-24 Accettato: la rope viene aggiunta.
- Righe 25-31 Rifiutato: lo zaino contiene già la rope.
- Righe 32-38 Rifiutato: l'offerta non ammette la anvil.
- Righe 47-53 Rifiutato: lo zaino contiene 2 voci, che è il suo massimo.
- Righe 54-61 Rimosso: la rope esce dallo zaino.
- Righe 62-68 Rifiutato: la rope non è più nello zaino.
- Riga 70 Lo zaino finisce con la sola candle.
Uno scenario può anche partire con un elenco che contiene già delle voci. Indicale in lists, tramite l'id del preset, e controllale 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"] }
}- Riga 18 L'elenco con cui parte l'Elemento.
- Riga 19 L'elenco dopo lo scenario.
SAME_NAME e LIST_CAP vengono dai limiti di un elenco che applica effetti. La pagina Riserve e modificatori li dimostra.

