Перейти к основному содержимому

Фреймворки на коде

Рецепт: потратьте ресурс

Напишите действие, которое ничего не делает, когда ресурс закончился, и проверьте оба случая.

Цель

Пусть Keeper выпускает три искры. Четвёртая ничего не делает.

Что менять

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. Строка 2 Прочитайте ресурс.
  2. Строки 3-5 Тратьте один, только пока он есть. Иначе действие ничего не записывает.

Объявите действие в схеме.

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. Строка 13 Новое действие.

Конструктор возвращает charges с начальным значением 3.

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. Строки 5-6 charges это хранимое поле с начальным значением 3.

Добавьте псевдоним действия в dataContract Frame и кнопку, которая его использует, иначе игроки не смогут вызвать его с листа.

layouts/keeper.json
      { "name": "spark", "functionRef": "spark" }
  1. Строка 20 Псевдоним действия.
layouts/keeper.json
      { "kind": "button", "label": "Strike a spark", "actionRef": "spark" }
  1. Строка 34 Кнопка, которая его вызывает.

Проверьте

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. Строки 7-27 Три искры тратят по одному заряду.
  2. Строка 28 Четвёртая не находит зарядов, поэтому ожидает отсутствие записей.
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. Строка 12 Новый файл сценария.

Перечислите новый файл сценария в манифесте. Добавьте charges в ожидаемые значения двух других сценариев.

Дальше