Frameworki kodowe
Listy treści
Pozwól postaci zdobywać treści w grze: zadeklaruj listę, zmieniaj ją akcjami i pokaż ją na karcie.
Czym jest lista
Lista przechowuje treści, które postać zdobywa w grze, na przykład plecak z drobiazgami. Treścią jest inny framework, a jego presety to wpisy. Lista żyje w ledgerze i nie jest polem konstruktora. Zmieniają ją tylko akcje.
| Opcja | Znaczenie |
|---|---|
| label | Nazwa listy. |
| of | Id frameworka treści. |
| max | Ile wpisów mieści lista, od 1 do 128. |
| card | Ramka, która rysuje wpis jako kartę. Musi to być ramka frameworka treści. |
| summary | Do 4 pól wpisu, które pokazuje jego wiersz. |
| effects, caps, distinctBy | Wpisy, które zmieniają modyfikatory, i limity na nie. Zobacz Pule i modyfikatory. |
Listy wierszy, które dodają komórki do każdego wiersza, istnieją i nie są jeszcze opisane.
Zadeklaruj listę
Dodaj listę do frameworka, który ją posiada. Framework treści przechowuje wpisy jako presety. Samouczek Grow Lantern buduje framework Trinket krok po kroku.
"lists": {
"pack": {
"label": "Pack",
"of": "trinket",
"max": 2,
"card": "trinket-card",
"summary": ["weight"]
}
}- Wiersz 45 Framework treści, którego presety są wpisami.
- Wiersz 46 Lista mieści najwyżej tyle wpisów.
- Wiersz 47 Ramka, która rysuje wpis.
- Wiersz 48 Pola do pokazania w wierszu wpisu. Pole summary potrzebuje zamkniętej dziedziny: opcji, minimum i maksimum albo prawdy i fałszu.
Dodawanie i usuwanie
Lista zmienia się tylko przez akcje. Przyjmij wpis jako dane wejściowe ContentRef i wywołaj list.add z ofertą.
export function pack_trinket(self: ElementRef, trinket: ContentRef): void {
list.add(self, "pack", trinket, offer.where({ weight: { lte: 3 } }));
}- Wiersz 1 Wpis, który wybiera gracz.
- Wiersz 2 list.add najpierw sprawdza ofertę. Ta oferta dopuszcza wpisy o wadze 3 lub mniejszej.
Usuń wpis przez list.remove.
export function unpack_trinket(self: ElementRef, trinket: ContentRef): void {
list.remove(self, "pack", trinket);
}- Wiersz 2 Usuwa wybrany wpis. Odmowa, jeśli lista go nie zawiera.
Gdy gracz użyje przycisku, Fabled prosi go o wybór jednego z wpisów, które dopuszcza oferta. Użyj list.count, aby zatrzymać dodanie własną regułą, jak pokazuje strona Pisanie reguł.
Oferty
offer.where przyjmuje warunki na polach wpisu. Warunki zapisujesz jako literały, więc oferta nie może czytać postaci. Aby zależeć od postaci, sprawdź ją przez if przed list.add.
| Operator | Znaczenie | Przykład |
|---|---|---|
| eq | Pole równa się wartości. | {"slot":{"eq":"Ring"}} |
| ne | Pole nie równa się wartości. | {"slot":{"ne":"Ring"}} |
| gte | Liczba jest równa wartości lub większa. | {"weight":{"gte":2}} |
| lte | Liczba jest równa wartości lub mniejsza. | {"weight":{"lte":3}} |
| in | Pole równa się jednej z wartości. Do 64 wartości. | {"slot":{"in":["Ring","Cloak"]}} |
| has | Pole to tekst rozdzielony przecinkami, który zawiera jedną z wartości. | {"tags":{"has":["fire"]}} |
Każdy warunek oferty musi być spełniony, a oferta wymienia najwyżej 6 pól. Pole, którego wpis nie ma, nigdy nie pasuje.
Pokaż ją na karcie
Ramka, która pokazuje listę, używa wersji 2.0. Zadeklaruj region w dataContract, a potem go narysuj. Region może też dać każdemu wpisowi do 4 przycisków, z których każdy uruchamia akcję na tym wpisie.
{
"kind": "region",
"id": "pack_list",
"listBinding": "{{element.lists.pack}}",
"emptyText": "Your pack is empty.",
"itemActions": [{ "actionRef": "unpack_trinket", "label": "Unpack" }]
}- Wiersz 46 Pokazywane, gdy lista jest pusta.
- Wiersz 47 Przycisk przy każdym wpisie. Akcja musi przyjmować tylko wpis.
Przetestuj ją
Przetestuj każdą odmowę, jaką mogą dać oferta i rozmiar. Poniższe kroki dodają, odrzucają na trzy sposoby, usuwają i odrzucają usunięcie.
{
"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"] }
}- Wiersze 19-24 Przyjęty: lina zostaje dodana.
- Wiersze 25-31 Odrzucony: plecak ma już linę.
- Wiersze 32-38 Odrzucony: oferta nie dopuszcza kowadła.
- Wiersze 47-53 Odrzucony: plecak ma 2 wpisy, czyli swoje maksimum.
- Wiersze 54-61 Usunięty: lina znika z plecaka.
- Wiersze 62-68 Odrzucony: liny nie ma już w plecaku.
- Wiersz 70 Plecak kończy ze świecą jako jedynym wpisem.
Scenariusz może też zacząć od listy, która już ma wpisy. Wymień je w lists, według id presetu, i sprawdź przez 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"] }
}- Wiersz 18 Lista, z którą startuje element.
- Wiersz 19 Lista po scenariuszu.
SAME_NAME i LIST_CAP pochodzą z limitów listy, która stosuje efekty. Strona Pule i modyfikatory je potwierdza.

