Фреймворки на коде
Рецепт: ограничьте значение
Держите значение в пределах диапазона с помощью 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));
}- Строка 2 Прочитайте текущее HP.
- Строка 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 }]
}
]- Строки 7-11 Получите 6 урона: 10 минус 6 будет 4.
- Строки 12-16 Удар на 20 ушёл бы ниже нуля. Правило записывает 0.
- Строки 17-21 Исцелите 3 от 0.

