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

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

Рецепт: ограничьте значение

Держите значение в пределах диапазона с помощью math.max и math.min.

Цель

Не давайте HP упасть ниже нуля, когда Keeper получает урон.

Что менять

Прочитайте текущее значение, затем запишите ограниченный результат.

rules/hurt.ts
export function hurt(self: ElementRef, amount: number): void {
  const hp: number = element.var(self, "hp") as number;
  ledger.set(self, "hp", math.max(0, hp - amount));
}
  1. Строка 2 Прочитайте текущее HP.
  2. Строка 3 math.max удерживает результат на уровне 0 или выше. Запишите итоговое значение с помощью ledger.set.

Используйте math.min(limit, value), чтобы держать значение на уровне лимита или ниже.

Лимитом может быть другое поле. Чтобы держать Sanity на уровне поля max_sanity или ниже, прочитайте оба поля и запишите math.min(max_sanity, sanity + amount). Правило heal в быстром старте делает так с max_hp. Проверьте шаг с ограничением.

Проверьте

Теперь правило устанавливает значение, поэтому ожидаемая запись это ledger.set вместо ledger.add. Добавьте шаг, который ушёл бы ниже нуля.

scenarios/heal.json
  "actions": [
    {
      "action": "hurt",
      "parameters": { "amount": 6 },
      "expectedWrites": [{ "op": "ledger.set", "key": "hp", "value": 4 }]
    },
    {
      "action": "hurt",
      "parameters": { "amount": 20 },
      "expectedWrites": [{ "op": "ledger.set", "key": "hp", "value": 0 }]
    },
    {
      "action": "heal",
      "parameters": { "amount": 3 },
      "expectedWrites": [{ "op": "ledger.set", "key": "hp", "value": 3 }]
    }
  ]
  1. Строки 7-11 Получите 6 урона: 10 минус 6 будет 4.
  2. Строки 12-16 Удар на 20 ушёл бы ниже нуля. Правило записывает 0.
  3. Строки 17-21 Исцелите 3 от 0.

Дальше