Zum Hauptinhalt springen

Code-Frameworks

Rezept: eine Ressource ausgeben

Schreibe eine Aktion, die nichts tut, wenn die Ressource aufgebraucht ist, und teste beide Fälle.

Ziel

Lass einen Keeper drei Funken schlagen. Ein vierter tut nichts.

Die Änderung

rules/spark.ts
export function spark(self: ElementRef): void {
  const charges: number = element.var(self, "charges") as number;
  if (charges > 0) {
    ledger.add(self, "charges", -1);
  }
}
  1. Zeile 2 Lies die Ressource.
  2. Zeilen 3-5 Gib nur eine aus, solange noch etwas übrig ist. Sonst schreibt die Aktion nichts.

Deklariere die Aktion im Schema.

schemas/keeper.json
  "actions": [
    { "id": "hurt", "name": "Take damage", "source": "rules/hurt.ts" },
    { "id": "heal", "name": "Heal", "source": "rules/heal.ts" },
    { "id": "spark", "name": "Strike a spark", "source": "rules/spark.ts" }
  ],
  1. Zeile 13 Die neue Aktion.

Der Konstruktor gibt charges mit dem Startwert 3 zurück.

rules/keeper.ts
export function construct(
  name: string,
  max_hp: number,
): { name: string; max_hp: number; hp: number; charges: number } {
  return { name: name, max_hp: max_hp, hp: max_hp, charges: 3 };
}
  1. Zeilen 5-6 charges ist ein gespeichertes Feld mit dem Startwert 3.

Füge dem dataContract des Frames einen Alias für die Aktion hinzu und eine Schaltfläche, die ihn nutzt. Sonst können Spieler sie nicht vom Bogen aus nutzen.

layouts/keeper.json
      { "name": "spark", "functionRef": "spark" }
  1. Zeile 20 Der Alias für die Aktion.
layouts/keeper.json
      { "kind": "button", "label": "Strike a spark", "actionRef": "spark" }
  1. Zeile 34 Die Schaltfläche, die ihn aufruft.

Teste es

scenarios/spark.json
{
  "id": "spend-all-charges",
  "framework": "keeper",
  "parameters": { "name": "Mira", "max_hp": 10 },
  "expectedValues": { "name": "Mira", "max_hp": 10, "hp": 10, "charges": 3 },
  "actions": [
    {
      "action": "spark",
      "parameters": {},
      "expectedWrites": [
        { "op": "ledger.add", "key": "charges", "value": -1 }
      ]
    },
    {
      "action": "spark",
      "parameters": {},
      "expectedWrites": [
        { "op": "ledger.add", "key": "charges", "value": -1 }
      ]
    },
    {
      "action": "spark",
      "parameters": {},
      "expectedWrites": [
        { "op": "ledger.add", "key": "charges", "value": -1 }
      ]
    },
    { "action": "spark", "parameters": {}, "expectedWrites": [] }
  ]
}
  1. Zeilen 7-27 Drei Funken geben jeweils eine Ladung aus.
  2. Zeile 28 Der vierte findet keine charges, also erwartet er keine Schreibvorgänge.
manifest/project.json
{
  "formatVersion": "fabled.game-project/v1",
  "projectId": "game-your-game-id",
  "projectKind": "GAME",
  "compilerProfile": "native-game-v1",
  "name": "Lantern Keepers",
  "entryFramework": "keeper",
  "frameworks": ["schemas/keeper.json"],
  "scenarios": [
    "scenarios/new-keeper.json",
    "scenarios/heal.json",
    "scenarios/spark.json"
  ]
}
  1. Zeile 12 Die neue Szenario-Datei.

Liste die neue Szenario-Datei im Manifest auf. Füge charges zu den erwarteten Werten der anderen zwei Szenarien hinzu.

Weiter