メインコンテンツへスキップ

コードフレームワーク

レシピ: 値を制限する

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));
}
  1. 2 行目 現在の HP を読みます。
  2. 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 }]
    }
  ]
  1. 7-11 行目 6 ダメージを受けます。10 引く 6 は 4 です。
  2. 12-16 行目 20 の攻撃では 0 を下回ります。ルールは 0 を書き込みます。
  3. 17-21 行目 0 から 3 回復します。

次へ