コードフレームワーク
レシピ: 値を制限する
math.max と math.min で、値を範囲内に保ちます。
目標
Keeper がダメージを受けても、HP が 0 を下回らないようにします。
変更内容
現在の値を読み、上下限を適用した結果を書き込みます。
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) を書き込みます。クイックスタートの回復ルールは、max_hp でこれを行っています。上限で止まるステップをテストします。
テストする
ルールは値を設定するようになったので、期待する書き込みは ledger.add ではなく ledger.set です。0 を下回るステップを加えます。
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 を下回ります。ルールは 0 を書き込みます。
- 17-21 行目 0 から 3 回復します。

