# 罠システム設計

## 概要

本ドキュメントは、罠を仕掛けてから獲物が掛かるまでの設計をまとめたものです。罠は**時間と運を払って、
危険を払わずに獲物を得る**道で、直接戦う狩猟との非対称（7 節）が設計の芯です。

**掛かった後は狩猟と同じです。** 罠の中の獲物は普通の動物のカードで、仕留め・解体・怪我・警戒は
すべて [`HuntingSystem.md`](./HuntingSystem.md) が持ちます。どの動物がどの土地にどれだけ居るかは
[`Animals.md`](../world/Animals.md)、罠そのものの素材とレシピは
[`SurvivalItems.md`](../world/SurvivalItems.md) 1.2 節・[`Skills.md`](../world/Skills.md) の関心事です。

**罠のためのエンジン拡張はありません。** 下の表のとおり、すべて
[`GameElementDefinition.md`](./GameElementDefinition.md) の既存機能に載ります。

| 種別 | 名前 |
|---|---|
| タグ | `trap`（罠）・`plant_bait`（草の餌になる物）・`meat_bait`（肉の餌になる物） |
| スロット | `catch`（掛かったもの） |
| プロパティ | `catch_remaining`（次の判定までの残り）・`plant_bait`/`meat_bait`（仕掛けた餌。餌の側では「仕掛けると増える量」）・`herbivore_weight`/`carnivore_weight`（食性の卓の重み）・`miss_weight`（何も寄って来なかった回の重み）・`<動物>_catch`（その土地でその動物が掛かる重み） |
| 型 | `snare`（くくり罠）・`box_trap`（かご罠）・`pitfall`（落とし穴。杭を打った版は `stake` 軸の変種で、型は増えない。1.2 節）・`pen`（檻。家畜の囲いと同じ型、1.2 節） |

| 決めたいこと | 載せた既存機能 |
|---|---|
| 結果が出るまでの時間（2 節） | `range` + `add` + `on_min`（`GameElementDefinition.md` 6.3 節） |
| 待ち時間のばらつき（2.1 節） | 生成時に 1 回ロールする初期値（`GameElementDefinition.md` 6.2 節）と、当たるまでの回数 |
| 土地ごとの成否（3 節） | `base`（`GameElementDefinition.md` 6.5 節）と `pick` の `weight`（同 10.2 節） |
| 罠のサイズ（1.1 節） | 内側の `pick` に並べた候補の一覧 |
| 餌と食性（4 節） | `transfer`（`GameElementDefinition.md` 9.5 節。炉へ薪をくべるのと同じ形、[`FireSystem.md`](./FireSystem.md) 2 節）と `pick` の入れ子（`GameElementDefinition.md` 10.1 節） |
| 開けるまで分からない（5 節） | `visible_slots`（`GameElementDefinition.md` 7.11 節） |
| 掛かった獲物が暴れない（5 節） | `passives` の `child` への `modify`（`GameElementDefinition.md` 8.1 節） |
| 獲物を生かすか殺すか（5.1・5.2 節） | 罠ごとの怪我（[`InjurySystem.md`](./InjurySystem.md)）と、その `bleeding` の有無 |
| 生んだ獲物へ怪我を渡す（5.3 節） | `spawn` の `into: child`（`GameElementDefinition.md` 9.4 節） |
| 杭を打つと刺す傷が変わる（1.2 節） | `variation_axes` の変種と `become`（`GameElementDefinition.md` 3.5.1 節・9.9 節。塩漬けと同じ形） |
| 掛かり方のばらつき（5.1 節） | 生成時に 1 回ロールする初期値（`GameElementDefinition.md` 6.2 節） |

定義は `src/assets/world-codex/traps.yaml`（罠そのもの）・`farming.yaml`（檻＝家畜の囲い、1.2 節）・
`injuries.yaml`（罠が作る怪我）・`animals.yaml`（掛かる獣）・
`locations.yaml`（土地ごとのつまみ）、検証は `tests/world-codex/trapsYaml.test.ts` と
`farmingYaml.test.ts` です。

本ドキュメントは検討結果であり、確定仕様書ではありません。**くくり罠・落とし穴・檻が実装済み**で、
仕掛ける・待つ・掛かる・怪我が刺さる・死ぬか生き延びる・閉じ込めれば渇く・放置すれば壊れる、までが
動きます。**未実装なのはかご罠だけ**です。檻に大型が掛かるのはその土地が `wild_boar_catch` を宣言してからで
（3 節）、**森と密林が宣言済みです**——密林の檻はヤケイとイノシシを、森の檻はイノシシだけを捕らえ、
残りの土地では大型は掛かりません。数値はいずれも目安で、1 tick（15<!-- codex: core.yaml object_defs.world.props.minutes_per_tick.value --> 分）を前提とします。
未決事項は 8 節に整理しています。

## 1. 罠は 1 つの型で、土地に置かれている間だけ動く

**「仕掛けた罠」と「持ち歩く罠」を別の型にはしません。** 作動しているかどうかは、罠が今どのスロットに
入っているかが決めます。

```yaml codex: traps.yaml
object_defs:
  snare:
    tags: [item, trap]
    visible_slots: [catch]
    stackable: false        # 中身が個体ごとに違う（1.1節）
    slots:
      # 掛かったもの。プレイヤーは取り出せるが入れられない枠ではなく、普通のitemスロットでよい
      # ——罠へ動物を手で入れられて困ることは無い（そもそも荒ぶる動物は手に持てない、
      # HuntingSystem.md 4節）。
      catch:
        cell_count: 1
        # 生きた獲物と死体の両方が持つタグ（1.1節）。capacityは宣言しない（同）。
        cell: {accept: {tag: quarry}}
```

作動の条件は `{in_slot: items}`（`GameElementDefinition.md` 14.2 節）1 つです。土地の `items` スロットは
「地面」で（[`ExplorationSystem.md`](./ExplorationSystem.md) 1.1 節）、手持ちは `hand`、かごの中は `contents` と
名前が違うので、**地面に置いた罠だけが動く**が条件 1 つで書けます。装備の `{in_slot: equip}`
（`GameElementDefinition.md` 8.2 節）と同じ形で、罠のための新しい概念ではありません。

- **回収は普通のドラッグです。** 拾えば `in_slot` が変わって止まります。仕掛け直す専用の操作は要りません。
- **中身ごと持ち帰れます。** 掛かった獲物は罠の子なので、罠を手に取っても親は変わりません
  （5 節が拘束を保つのもこの間ずっとです）。その場で仕留めるか、罠ごと担いで帰るかが判断になります。

**掘って作る罠は動きません。** 落とし穴は `fixture` で、作動の条件は `{in_slot: fixtures}` になります。
回収できないので、仕掛けた土地がそのまま賭けになります——**持ち運べる罠は仕掛け直せる代わりに小さい、
掘る罠は大きい代わりにその土地に据え置き**、という差が、型ごとのスロット名 1 つから出ます。

### 1.1 罠のサイズは、掛かる候補の一覧が持つ

**「どこまで大きい獲物が掛かるか」は、その型の内側の `pick`（3 節）にどの動物を並べたかで決まります。**
小型の罠にイノシシの候補は書かないので、掛かりようがありません。**下限も同じ場所が持ちます**
——檻がネズミを並べないのは、丸太の隙間から出ていく大きさだからで、罠の側に「小さすぎる」を表す
量は要りません。

**`catch` スロットに `capacity`（`GameElementDefinition.md` 7.3 節）を宣言してサイズを表すことは
できません。** 上限を宣言した物を溜める入れ物と名乗った型（`storage`）には容量のバーが出る
（[`CardView.md`](../ui/CardView.md) 8 節）ためで、理由は次のとおりです。

- **バーは比例で、二値になりません**（`Slot.fillRatio` は `min(1, 中身のvolume合計 ÷ capacity)`）。
  動物の `volume` は体格そのものなので、候補が数種しかない罠では**何が掛かったかまで読めます**（5 節）。
  飽和させて二値にすることもできません——`capacity` を最大の候補より小さくすると `spawn` が弾かれ、
  獲物は起点の親＝土地へこぼれます（`GameElementDefinition.md` 9.4 節）。
- **バーが答える問いが、罠には無い。** 容量のバーは「あとどれだけ入るか」を言うものですが、罠の枠は
  1 つで、次が入らないのは `capacity` ではなく `cell_count: 1` とタイマーの停止（6 節）のためです。

枠が受けるのは `quarry`（狩りの成果として数える物）で、**生きた獲物と死体の両方が持ちます**。`animal`
で受けると、掛かった獲物がその場で死んだ瞬間に死体が枠から弾かれ、地面へ落ちます——**置き換えの配置も
枠の要件を通る**ためです（`WorldObject.attachToSlotOrRejection`）。タイマーが「何か入っているか」を問うのも同じ
タグで、`item` のような広いタグを流用せずに済みます。

**`stackable: false` を宣言します。** 中身が個体ごとに違う物は束ねない、というかご・道と同じ理由です
（[`SlotSystem.md`](./SlotSystem.md) 4 節）。束ねると、スタックは代表の状態しか映さないので、**空の罠と
獲物の入った罠が 1 枚に重なります**。

### 1.2 型は、サイズと生死の 2 軸で並ぶ

|  | 殺す（5.1 節） | 生かす（5.2 節） |
|---|---|---|
| **小型** | `snare` くくり罠（繊維だけ）**←実装済み** | `box_trap` かご罠（編み籠＋繊維） |
| **中型** | 杭を打った落とし穴（落とし穴＋長い棒）**←実装済み** | `pitfall` 落とし穴（掘削具）**←実装済み** |
| **大型** | 同上 | 同上、および `pen` 檻（木材＋縄）**←実装済み** |

- **生かす側が高くつくのは、飼い続けられる形にするときです。** 締めつけるだけの輪と、閉じ込めて
  おける箱では要る材料が違い、大型ではその差が最も開きます（檻は木材と縄、落とし穴は掘る時間）。
  **手懐けたいなら高いほうを払う**が、材料表だけで成立します。
- **穴を掘る手間は、檻を組む手間と同じだけ置いてあります**（`traps.yaml` の `dug` と `farming.yaml`
  の `fenced`）。**開いている差は材料だけ**で、穴は太い枝 1 本、檻は丸太と縄です。**ただしこの 2 つは
  どちらも生かす側**——落ちた大型は杭のあるなしにかかわらず生きて拘束される（下）ので、ここに出て
  いる差は「もがかれて 2.7 日<!-- stats: durations.yaml durations object=pitfall property=durability shortest_days -->で破られる穴に留め置く」（6.1 節）と「渇き（5.4 節）だけを罰に飼い続
  ける」の差です。**大型で殺す側に付く上乗せは、長い棒 1 本と打つ手間だけ**（`drive_stake`）で、
  檻の材料には届きません。
- **「殺す」欄が掛かったその場で殺すのは、今はネズミだけです。** くくり罠の傷で血が尽きるのは
  6 mL<!-- codex: animals.yaml object_defs.rat.props.blood.value --> のネズミで、ヤケイ（80 mL<!-- codex: animals.yaml object_defs.junglefowl.props.blood.value -->）はその場では死にません（5.1 節）。**杭の刺し傷もイノシシの
  4,600 mL<!-- codex: animals.yaml object_defs.wild_boar.props.blood.value --> に届きません**（8 節）。**落ちた大型は、杭のあるなしにかかわらず生きて拘束されます**
  ——`stake` 軸が入れ替えるのは刺す怪我だけで、掛かる候補も 5 節の拘束の 1 ブロックも同じものです
  （`traps.yaml`）。
- **2 軸を分けているのは、開いた傷を残すかどうかです。** 殺す側の裂傷も刺し傷も `open_wound` を名乗るので、
  血が固まった後は膿み続け、宿主を敗血症まで押します（5.1 節）。生かす側の打ち身は名乗らないので膿みません。
  **血の量と体格の比が分けるのは掛かった瞬間だけで、そこから先を分けているのはこちらです**——手元へ置いた
  個体の生死を決めるのは体格ではなく傷の残る長さなので、**殺す罠で獲った相手には、閉じ込めた獣なら
  どれにも要る飲み水（5.4 節）の上へ、傷を洗う水が乗ります**（5.2 節）。

#### 檻と家畜の囲いは 1 つの型

**檻は「捕らえる罠」で家畜の囲いは「置いておく設備」ですが、型は分けません。** 分けるとしたら差は
中身の入り方・中身への `modify`・消耗品ですが、**どれも分ける理由になりません**。

| 差だと思われたもの | 実際は |
|---|---|
| 中身の入り方（タイマーが生む／プレイヤーが入れる） | **両方が同じ型に載ります。** 2 節のタイマーは 6 節の条件「中に獲物が居ないこと」で止まるので、獣を 1 頭入れた瞬間に罠であることをやめます |
| 中身への `modify`（`vulnerability` を押し上げるか） | **押し上げるのが正しい。** 囲いは家畜を締める場所でもあるので、拘束した相手を仕留めやすくする 5 節の 1 ブロックがそのまま要ります |
| 消耗品（餌／飼葉） | **同じ 1 つの量です。** 草食の獣が寄ってくる量と、草食の獣が食べる量はどちらも「草の食べ物としてどれだけあるか」（4.1 節）。寄せるのを読むのは囲い、食べて減らすのは中の獣（`Animals.md` 3.1 節） |

**残る差はすべて、型ごとのパラメータだと本書が既に決めている場所にあります**——据え置きかどうかは
`fixture`（1 節）、どこまで大きい獲物が掛かるかは候補の一覧（1.1 節）、殺すか生かすかは刺す怪我
（5.1 節）、何頭置けるかは `cell_count`。**檻のために新しく足した仕組みは 1 つもありません。**

**この 1 つの型が、生かす罠から飼いならしへの道（5.2 節）を継ぎ目なしにします。** 掛かった獣は
拘束されたまま警戒を引き切り（5 節）、そのとき既に囲いの中に居ます——**檻から囲いへ移し替える操作は
要りません**。「生け捕りにして待つ」と「家畜を飼う」が、同じ枠の中の時間の経過だけで繋がります。
- **落とし穴は 1 つの型を杭で分岐させます。** 掘った穴に長い棒を立てれば殺す罠になる、という
  ドラッグ型の操作 1 つで、中型と大型の両方の「殺す」欄が埋まります。**杭が変えるのは、掛かった相手へ
  刺さる怪我だけです**（5.1 節）——穴も、掛かる候補も、タイマーもそのままです。杭を打った版は
  `stake` 軸の変種（[`GameElementDefinition.md`](./GameElementDefinition.md) 3.5.1 節）で、**同じ個体の
  まま型が変わる**ので（`become`、同 9.9 節）掘り直しにはなりません。
- **今この島で穴に落ちるのはイノシシだけです。** 掛かる候補の一覧が罠のサイズを持つ（1.1 節）ので、
  上は穴から出られない大きさまで、下は穴から出ていく大きさ（ヤケイは羽ばたいて出る）で切れます。
  中型のシカ・オオトカゲはまだ島に居らず、サルは罠を学習して避ける
  （[`Animals.md`](../world/Animals.md) 4 節・10 節）ので、中型の欄は相手が増えたときに埋まります。
- **殺す・生かすの差は、材料ではなく怪我が持ちます。** 同じ落とし穴が、杭の有無で刺す傷を変えるだけで
  両方の欄に立ちます。**型を増やさずに軸を 1 本足せる**のは、生死が罠の構造ではなく怪我の中身に
  宿っているからです。

## 2. 見えないタイマーは、尽きたら周期を置き直して回り続ける

**罠は仕掛けた時刻からの残り時間を 1 つ持ち、0 に達した瞬間に 1 回抽選して、周期を置き直します。**

```yaml codex: traps.yaml object_defs.snare
props:
  catch_remaining:
    # 生成時に1回ロールされる位相（2.1節）。以後この幅は使われない。
    value:
      min: 1
      max: 16
    range:
      min: 0
      max: 16
    passives:
      - conditions:
          - {in_slot: items}                  # 地面に置かれている間だけ（1節）
          # 空いている間だけ（6節）。獲物も死体もquarryなので、両方をこれ1つで拾う。
          - not: {slot: catch, matches: {tag: quarry}}
        add: {self: {catch_remaining: -1}}
    on_min:
      # 外側は食性の卓を選び（餌が決める、4節）、内側はその卓で掛かるかどうかと種を選ぶ
      # （土地が決める、3節）。
      add: {self: {catch_remaining: 16}}
      pick:
        # 何も寄って来なかった回。先頭に置く（3節）。
        - weight: {prop: miss_weight}
        - weight: {prop: herbivore_weight}
          pick:
            # 寄ってはきたが掛からなかった回。その食性の相手が居ない土地では必ずここになる。
            - weight: 8
            # 掛かった候補は、獲物とその罠の怪我を順に生む（5.1節）。
            - weight: {prop: junglefowl_catch}
              spawn:
                - {object: junglefowl, into: self}
                - {object: snare_laceration, into: child}
            - weight: {prop: rat_catch}
              spawn:
                - {object: rat, into: self}
                - {object: snare_laceration, into: child}
        - weight: {prop: carnivore_weight}
          pick:
            - weight: 8
            # ネズミは雑食なので、両方の卓に同じつまみで載る（4.1節）。
            - weight: {prop: rat_catch}
              spawn:
                - {object: rat, into: self}
                - {object: snare_laceration, into: child}
```

- **周期の置き直しは、どの候補が選ばれても起こるので、`pick` の外へ1つだけ置きます**
  （`GameElementDefinition.md` 9.7 節）。
  探索の進捗 +1 が `explore` で同じ形になっている（`ExplorationSystem.md` 2 節）のと揃えています。
- **`set` ではなく `add` で戻します**（`GameElementDefinition.md` 6.3 節）。1 tick で複数回分飛び越えた
  場合でも超過分を失いません。
- **`spawn` の `into: self` は罠の `catch` 枠へ入ります**（`GameElementDefinition.md` 9.4 節。スロットは
  1 つしか無いので、著者はスロット名を書きません）。枠が埋まっていれば土地へこぼれてしまいますが、
  埋まっている間はそもそもタイマーが減りません（6 節）。
- **バーには出ません。** カードの状態バーは名前で決まった量だけを映す（[`CardView.md`](../ui/CardView.md)
  8 節）ので、`catch_remaining` を隠すための仕掛けは要りません。罠のカードに出るのは耐久度だけです。

### 2.1 ランダムにするのは待ち時間ではなく、位相と回数

**「いつ結果が出るか分からない」は、タイマーの初期値を毎回振り直すのではなく、当たるまでの回数が
決まっていないことが作ります。**

抽選は 16 tick<!-- codex: traps.yaml object_defs.snare.props.catch_remaining.on_min.add.self.catch_remaining --><!-- codex: traps.yaml object_defs.pitfall.props.catch_remaining.on_min.add.self.catch_remaining --><!-- codex: farming.yaml object_defs.pen.props.catch_remaining.on_min.add.self.catch_remaining -->ごとに回り、1 回あたりの成功率は 3 節が決めます。仮に 3 割なら、掛かるまでの
待ち時間は幾何分布になり——数時間で掛かることも、丸一日空振りが続くこともあります。**乱数を 1 つも
足さずに、狩猟には無い「待たされる」が出ます。**

そのうえで初期値だけは `{min: 1, max: 16}`<!-- codex: traps.yaml object_defs.snare.props.catch_remaining.value.max --><!-- codex: traps.yaml object_defs.pitfall.props.catch_remaining.value.max --><!-- codex: farming.yaml object_defs.pen.props.catch_remaining.value.max --> の範囲でロールします（`GameElementDefinition.md` 6.2 節）。
これは待ち時間の幅ではなく**位相**で、複数の罠が同じ tick に一斉に判定するのを防ぐためだけのものです。

**周期そのものを毎回振り直す形は採りません。** `set`/`add` の値はリテラルだけで
（`GameElementDefinition.md` 9.2 節）、範囲ロールが効くのは生成時だけなので、周期を毎回振るには罠が自分を
`destroy` して同じ型を `spawn` し直すことになります。生まれ直した罠は耐久も餌も引き継がない
（同 9.4 節）ので、**待ち時間をばらけさせるためだけに罠の状態が消えます**。

## 3. 何が掛かるかは、土地が宣言した量を罠が継承して決める

**その土地に何がどれだけ居るかは土地の `props` が持ち、罠は `base` でそれを自分の重みの土台に
します**（`GameElementDefinition.md` 6.5 節）。

```yaml codex: locations.yaml object_defs
# locations.yaml — 草原
grassland:
  props:
    rat_catch: {value: 6}
    junglefowl_catch: {value: 10}
```

```yaml codex: traps.yaml object_defs.snare
# traps.yaml — くくり罠
props:
  # 素の値は0で、祖先（＝置かれている土地）が宣言していれば、その実効値が土台になる。
  rat_catch: {base: {subject: ancestor}, value: 0}
  junglefowl_catch: {base: {subject: ancestor}, value: 0}
  miss_weight:
    value: 40
    # 餌のmodifyが押し下げても0にはしない（4節）。上限は素の値。
    range:
      min: 5
      max: 40
```

- **宣言していない土地では、その候補が抽選から外れます。** 寄与が 0 なら重みが 0 になり、`pick` は
  重みを 0 でクランプして候補ごと落とします（`HuntingSystem.md` 5.3 節）。**罠の側は 1 行も書き換えずに、
  土地の `props` の有無だけで「岩礁海岸にヤケイは掛からない」が決まります。**
- **全候補が 0 になっても先頭が選ばれるため**（同 5.3 節）、空振り候補はどちらの階層でも先頭に置くことを
  規約にします。動物の 1 手で攻撃を先頭に置くのと同じ理由です。**内側の空振りが要るのはこのためだけ
  ではありません**——その食性の相手が 1 種も居ない土地では、内側は必ずそこへ落ちます。
- **餌が土地に居ない動物を呼ぶことはできません。** 餌は内側の卓を選ぶ確率だけを動かし（4 節）、
  `<動物>_catch` そのものには触れません。触れる形にすると、宣言していない土地でも重みが立ってしまい、
  そうさせない条件は自分の実効値を見ることになって循環します（`GameElementDefinition.md` 14.1 節）。
- **土地を経由するので、罠を別の土地へ移すだけで確率が入れ替わります。** `base` の `ancestor` は親が変われば
  解決し直され、どこに仕掛けるかがそのまま判断になります。

**動物ごとに別のプロパティを持たせ、1 つの生息数へまとめないのは、罠が何を捕るかを土地が選ぶ
ためです。** 1 つの量にすると、掛かる確率は土地で変えられても、掛かるものは罠が決めることになります。

**探索の `<動物>_find`（`ExplorationSystem.md` 2 節）とは別のつまみです。** 見つけて追う相手と罠に
掛かる相手は同じではなく（シカは探索では出るが罠には掛からない）、1 つのつまみに兼ねさせると、
どちらかの調整がもう一方を巻き込みます。土地の亜種が両方を上書きできる点は同じです
（`Animals.md` 8 節）。

**別のつまみである以上、重みの大小では比べられません。** 卓が違えば合計も違うので、同じ重みが土地
ごとに別の頻度になります。突き合わせるのは重みではなく 1 日あたりの頭数のほうで、
[`stats/balance.yaml`](../../stats/balance.yaml) の `devices` が罠と囲いの側を、同じファイルの
`supply` が探索 1 回あたりの期待値を出します。

**そして大型の重みを上げない理由は、掛かりにくさではなく腐敗です。** イノシシ 1 頭から出る生肉を
島に居る全員で食べ切るには、生肉が腐るまでより長くかかります（`raw_meat` の `spoils_fast`、
[`DurabilitySystem.md`](./DurabilitySystem.md) 3 節）。**掛かる頻度を上げても増えるのは腐る量だけ**
なので、そこを動かすのは重みではなく保存（`salt.yaml`・`smoking.yaml`・`drying.yaml`）の側です
——**大型では、罠の値より先に保存の有無が上限を握ります。**

## 4. 餌は食性までを決め、種は決めない

**餌は 2 種類あり、どちらを仕掛けたかが、外側の `pick` でどちらの卓を引くかを動かします。** 掛かる確率が
上がるのと、掛かる相手が食性で寄るのは、この 1 つの動きの両面です。

```yaml codex: traps.yaml object_defs.snare
# 罠の側が宣言する。草の餌と肉の餌で1つずつ。
interactions:
  add_plant_bait:
    trigger: {drag: {tag: plant_bait}}
    conditions:
      - {reason: trap_baited, prop: plant_bait, lt: 24}
    transfer:
      {from: instrument, from_prop: plant_bait, to_prop: plant_bait, allow_overflow: true, amount: 999}
    destroy: instrument
  add_meat_bait:
    trigger: {drag: {tag: meat_bait}}
    conditions:
      - {reason: trap_baited, prop: meat_bait, lt: 24}
    transfer:
      {from: instrument, from_prop: meat_bait, to_prop: meat_bait, allow_overflow: true, amount: 999}
    destroy: instrument
```

**入り切らない端数は切り捨てます**（`GameElementDefinition.md` 9.5.1 節で確定した規則。名乗り方は
同 9.5.2 節。炉へ薪をくべるのと同じ形で、`FireSystem.md` 2 節）。捨てるのは高々 1 つぶんで、それは
**1 つも入らない罠では操作が成立しない**という規則（`GameElementDefinition.md` 12.4 節）が保証します。

```yaml codex: animals.yaml object_defs
# 餌の側が宣言する。タグとプロパティの名前で、どちらの餌かが決まる。
raw_meat:
  tags: [item, food, meat_bait]
  props:
    meat_bait: {value: 12}
```

`transfer` を使うのは、`add` だと罠の種類 × 餌の種類の数だけ固定値を書くことになるためです。移る量は
餌の側が 1 箇所で持ちます（`FireSystem.md` 2 節の燃料と同じ形）。

```yaml codex: traps.yaml object_defs.snare
# 罠の側の効かせ方
props:
  herbivore_weight:
    value: 10
    range:
      min: 0
      max: 35
  carnivore_weight:
    value: 10
    range:
      min: 0
      max: 35
  plant_bait:
    value: 0
    range:
      min: 0
      max: 24
    passives:
      - conditions: [{in_slot: items}]
        add: {self: {plant_bait: -1}}
  meat_bait:
    value: 0
    range:
      min: 0
      max: 24
    passives:
      - conditions: [{in_slot: items}]
        add: {self: {meat_bait: -1}}
passives:
  - conditions: [{prop: plant_bait, gte: 1}]
    modify:
      self:
        herbivore_weight: 25
        miss_weight: -25
  - conditions: [{prop: meat_bait, gte: 1}]
    modify:
      self:
        carnivore_weight: 25
        miss_weight: -25
```

- **1 つのブロックが 2 つのことを同時に言います。** その食性の卓が引かれやすくなり、何も寄って来ない回
  （`miss_weight`）が減ります。**餌を置くほど当たり、かつ食性が寄る**が、加算式を 1 つも書かずに出ます。
- **`miss_weight` の `range.min` が 5<!-- codex: traps.yaml object_defs.snare.props.miss_weight.range.min --><!-- codex: traps.yaml object_defs.pitfall.props.miss_weight.range.min --><!-- codex: farming.yaml object_defs.pen.props.miss_weight.range.min --> で止めるので、餌を積んでも必中にはなりません**
  （`GameElementDefinition.md` 8.3 節。合成結果の下限はプロパティ側の `range` が持ちます）。両方の餌を
  仕掛ければ両方の卓が上がりますが、そのぶん食料を 2 種類ぶん賭けることになります。
- **餌は仕掛けている間だけ減ります**——上限の 24<!-- codex: traps.yaml object_defs.snare.props.plant_bait.range.max --> から `-1/tick`<!-- codex: traps.yaml object_defs.snare.props.plant_bait.passives.0.add.self.plant_bait --> で減って切れます。**罠を放置しても餌は待っていてくれない**ので、
  「餌を仕掛けて見に行く」が 1 往復の単位になります。
- **時間で減るのは、持ち歩ける罠だけです。** 据え置きの檻（1.2 節）の飼葉は時間では傷みません
  ——持ち歩ける罠が見回りの速さを代償にしているのに対し、据え置きの罠が払うのは材料だからです
  （1 節）。**減らすのは中に居る獣自身**で、頭数がそのまま減りの速さになります
  （[`Animals.md`](../world/Animals.md) 3.1 節）。
- **これが罠の代償です。** 罠自体は繊維から作れて安全ですが、餌は**自分が食べられる食料を先に賭ける**
  ことです。序盤ほど重く、蓄えができるほど軽くなる——罠を回し始める時期が、餌を出せるようになった
  時期と一致します。肉の餌はさらに重く、**肉食獣を狙うには先に肉を得ていなければなりません**。

### 4.1 食性は餌が持ち、罠の型は持たない

**草食用の罠・肉食用の罠は作りません。** 同じ輪も同じ穴も、置いた餌が違えば違う相手が掛かる、が現実に
近く、**罠の型はサイズと生死（1.2 節）の 2 軸だけで済みます**。型で分けると、サイズ 3 × 生死 2 × 食性 2 の
12 型を作って餌を無くすことになります。

- **雑食は両方の卓に載ります。** ネズミ・サル・イノシシは、同じ `<動物>_catch` を草食の卓と肉食の卓の
  両方から読むだけです。3 つ目の食性を作る必要はありません（2 節の例のネズミがこれです）。
- **合わない餌は損になります。** 草食の居ない土地で草の餌を焚くと、卓を引く確率だけが上がって内側の
  空振りへ落ちます（3 節）。**罠は土地に合わせて餌を選ぶもの**で、その判断が成立するのは、餌が確率を
  上げるだけでなく**振り分けている**からです。
- **食性そのものはどこにも宣言しません。** 「ヤケイは草食」という事実は、罠の草食の卓にヤケイの候補が
  並んでいることが言います。動物の側にタグやプロパティを足すと、**候補の一覧と動物の宣言という
  2 箇所が暗黙に一致すべき規約**になります。

## 5. 掛かった獲物は、スロットの中で拘束される

**罠は自分の子の `wariness` を打ち消し、`vulnerability` を押し上げます。**

```yaml codex: farming.yaml object_defs.pen
passives:
  - modify:
      child:
        wariness: -100  # <!-- codex: traps.yaml object_defs.snare.passives.0.modify.child.wariness --><!-- codex: traps.yaml object_defs.pitfall.passives.0.modify.child.wariness --><!-- codex: farming.yaml object_defs.pen.passives.0.modify.child.wariness -->
        vulnerability: 200  # <!-- codex: traps.yaml object_defs.snare.passives.0.modify.child.vulnerability --><!-- codex: traps.yaml object_defs.pitfall.passives.0.modify.child.vulnerability --><!-- codex: farming.yaml object_defs.pen.passives.0.modify.child.vulnerability -->
```

これは気を失った動物に対する宣言（`animals.yaml` の `consciousness` の `unconscious` 段）とまったく
同じ内容で、**罠は「もがけない状態」を外から与える 2 つ目の道**になります。`HuntingSystem.md` 1.4 節が
「同じ量へ後から『罠にかかっている』『拘束されている』も流せます」と予告していた接続がこれです。

**この 1 ブロックが、次のことを同時に決めます。**

| | |
|---|---|
| 掛かった獲物が飛び出さない | `resists` は実効値を読む（`GameElementDefinition.md` 14.1 節）ので成立せず、`HuntingSystem.md` 4.1 節の「入れ物の中で成立したらこぼれ出る」が起きない |
| その場で仕留められる | 仕留めの候補の重みが `vulnerability` そのもの（同 1.4 節）なので、罠に掛かった相手はほぼ一撃で決まる |
| 取り出せば暴れる | 罠から出れば寄与が消えて元の警戒へ戻る。`resists` が成立し、手には持てず地面へ落ちる |

**ただし戻るのは、実体値が残っている間だけです。** 警戒は罠の中でも `-1/tick` で引き続けるので
（`animals.yaml` の `wariness`）、**長く閉じ込めた個体は出しても暴れません**。掛かってすぐなら暴れ、
半日置けば落ち着く——これが罠から飼いならしへ続く道（5.2 節）になります。**枠の名前はどの型も `catch` な
ので、この道は生かす罠に限りません**（1.2 節）。**深く掛かって気を失った個体も暴れません**——`unconscious`
の段が同じ 2 つを掛け続けるからで（5.1 節）、罠が与える状態と区別が付きません。

**専用の「拘束」という概念を作りません。** 罠が捕らえるという出来事は、既にある 2 つの量を外から
動かすことに尽きます。

**何が掛かったかは、カードを押すまで分かりません。** `visible_slots: [catch]` を名乗るので、罠のカードを
押せば中身が並びます（`GameElementDefinition.md` 7.11 節）。レーンの上では罠は罠のままで、空の罠と
獲物の入った罠は見分けが付きません——**開けてみるまで分からない**が、隠すための処理を 1 つも書かずに
成立します。

**作動したことも告げません。** 出入りを伴わない出来事は、起こした側が `signal`
（`GameElementDefinition.md` 9.8 節）で告げなければ誰にも届きません。罠はその沈黙のほうを使います
——**掛かったかどうかは見回って初めて分かる**が罠の本体で、告げる経路を 1 つでも開けると、罠は待つ物
ではなく報せる物になります。

### 5.1 罠は掛けた瞬間に、その罠の怪我を 1 つ刺す

**殺す罠と生かす罠の差は、獲物と一緒に生む怪我の中身だけです。** 罠は死を書かず、削りもしません
——刺すだけです。

```yaml codex: traps.yaml object_defs.snare.props.catch_remaining.on_min.pick.1.pick
# 掛かった候補（2節）が、獲物と怪我を順に生む。
- weight: {prop: junglefowl_catch}
  spawn:
    - {object: junglefowl, into: self}
    - {object: snare_laceration, into: child}   # 直前に生んだ獲物のinjuriesスロットへ
```

`spawn` は配列を順に 1 つずつ生んで配置する（`GameElementDefinition.md` 9.4 節）ので、**獲物を生んでから、
その中へ怪我を生みます**。
`into: child` が指す先と、それが直前に生んだ 1 つに決まる理由は 5.3 節です。

**怪我は罠の型ごとに 1 つで、重さは個体ごとにばらつきます。** 生成時に 1 回ロールする初期値
（`GameElementDefinition.md` 6.2 節）が
「浅く掛かったか、深く食い込んだか」をそのまま表します。

```yaml codex: injuries.yaml object_defs
# くくり罠の怪我。縄が食い込んで裂ける傷で、laceration（injuries.yaml）より浅い。
snare_laceration:
  traits: [injury, treatable]
  props:
    severity:
      value:
        min: 240
        max: 480
      range:
        min: 0
        max: 480
      passives: [{add: {self: {severity: -1}}}]
      on_min: {destroy: self}
    # 掛かり方の深さ。深く掛かるほど固まるまでが長く、そのぶん多く奪う。
    bleeding:
      value:
        min: 40
        max: 100
      range:
        min: 0
        max: 100
      passives: [{add: {self: {bleeding: -25}}}]
  passives:
    - modify: {parent: {pain: 50}}
    - conditions:
        - {prop: bleeding, gte: 1}
        - not: {slot: treatment, matches: {tag: hemostatic}}
      add: {parent: {blood: -15}}
```

**掛かった tick に死ぬかどうかは、怪我が奪う量と獲物の体格の比が決めます。** `blood` の `range.max` は体格そのもの
（サル 5 kg で 400 mL<!-- codex: animals.yaml object_defs.monkey.props.blood.value -->）なので、同じ 1 枚の傷が体格で意味を変えます。

| 獲物 | 血の量 | 奪われる量は | 血が固まるまでの結果 |
|---|---|---|---|
| ネズミ（80 g<!-- codex: animals.yaml object_defs.rat.props.weight.value -->） | 6<!-- codex: animals.yaml object_defs.rat.props.blood.value --> | 全部 | **必ず死ぬ** |
| ヤケイ（1 kg） | 80<!-- codex: animals.yaml object_defs.junglefowl.props.blood.value --> | 大きな割合 | 血は尽きない |
| サル（5 kg） | 400<!-- codex: animals.yaml object_defs.monkey.props.blood.value --> | 小さな割合 | 血は尽きない |
| イノシシ（60 kg） | 4,600<!-- codex: animals.yaml object_defs.wild_boar.props.blood.value --> | ごくわずか | 応えない |

**この表が答えるのは「その場で血が尽きるか」だけです。** 血が止まった後も傷は残り、そこから先は体格を
見ません（下の「血が止まっても、傷は膿み続けます」）。

- **「ある体格から下は 1 枚で死ぬ」が、レートを分けずに出ます。** その線がどこに引かれるかを誰も
  書いていないのは、怪我の側が奪う量を宣言し、体格の側が持ちこたえる量を宣言しているからです。
- **同じ罠でも、奪う量は同じになりません。** 掛かりの深さのロール（`bleeding` の `{min: 40, max: 100}`<!-- codex: injuries.yaml object_defs.snare_laceration.props.bleeding.value.max -->）が
  罠の運の 2 つ目です（1 つ目は 2.1 節の「いつ掛かるか」）。**ただし今の顔ぶれで、このロールが生死を
  分けることはありません**——分かれ目になるのは、奪われる量の幅の中に血の量が収まる獣
  だけで、ネズミは必ず死に、ヤケイ以上は血が尽きません。**分かれるのはヤケイがどこまで落ちるかです**——
  最も深く掛かった個体は `exsanguinated`（32 mL<!-- codex: animals.yaml object_defs.junglefowl.props.blood.stages.1.min --> 未満。失血で助からない
  域、`VitalsSystem.md` 3 節）へ入って意識を失います。
- **見回りが早ければ、落ちる先が変わります。** 出血は掛かりの深さに応じて数 tick で固まり、その間に
  止血の治療具を当てれば `add` のゲートが閉じます（`InjurySystem.md` 3.1 節）。ヤケイが失う量は止まる
  までの tick 数だけ増え、**早く止まれば意識が残り、もう少し流れると傷の痛み
  （`pain: 50`<!-- codex: injuries.yaml object_defs.snare_laceration.passives.0.modify.parent.pain --> が意識を -20<!-- codex: animals.yaml traits.beast.props.pain.stages.2.passives.0.modify.self.consciousness -->）と合わさって気を失い、最後まで流れれば `exsanguinated` に入ります**。
  ネズミは掛かった tick のうちに死ぬので間に合いません——**掛かった直後について罠を見に行く速さが
  買えるのは、生死ではなくこの差です。**
- **杭を打った落とし穴は、槍と同じ刺し傷を刺します**（`puncture_wound`）。落ちて貫かれるのも突かれるのも
  深部の血管を開いたまま残す傷なので、罠のためだけの型は作りません（`InjurySystem.md` 4.2 節
  「武器の性格は、傷の枚数ではなく傷の中身で表す」と同じ形）。**サイズの差は罠の側ではなく、刺す怪我の
  中身が持ちます**——刺し傷の流れ（`-250/tick`<!-- codex: injuries.yaml object_defs.puncture_wound.passives.1.add.parent.blood -->）はくくり罠の傷（`-15/tick`<!-- codex: injuries.yaml object_defs.snare_laceration.passives.1.add.parent.blood -->）より桁で大きく、
  穴に落ちる唯一の相手であるイノシシ（4,600 mL<!-- codex: animals.yaml object_defs.wild_boar.props.blood.value -->、1.2 節）も大きく削ります。
  ただし**その場では 60 kg は死にません**。杭が変えるのは「深手を負って血を流している」ところまでで、
  回収に戻った時点で仕留めるのは拘束された相手への一撃（5 節）になります。**穴の中で死ぬのを待つことも
  できません**——待てる長さより先に罠が破られ、獲物ごと失います（すぐ下の箇条書き）。1 枚で殺し切る
  傷を用意するかは 8 節の未決事項です。
- **血が止まっても、傷は膿み続けます。** 殺す罠の裂傷も刺し傷も `open_wound` を名乗る（`injuries.yaml`）ので、
  固まった後は `infection` が上がります（[`InjurySystem.md`](./InjurySystem.md) 6 節）。獣の免疫は生活で
  上下しない固定値（`animals.yaml`）なので上がる速さも一定で、傷を負ってから日の単位で `septic` へ
  入り、そこから宿主の `pathogen` を押し上げて `septicemic`、以後は体格によらず同じ速さで
  血を失います。**体格が変えるのは死ぬかどうかではなく、そこから何 tick 保つかだけです**——小さい相手ほど
  早く血が尽きます。**くくり罠の傷は、ここでも掛かりの深さで
  分かれます**——`severity` の初期値が高い個体（ロールの幅 240<!-- codex: injuries.yaml object_defs.snare_laceration.props.severity.value.min -->〜480<!-- codex: injuries.yaml object_defs.snare_laceration.props.severity.value.max --> の上のほう）だけが敗血症へ届き、
  それより浅い個体は膿み切る前に傷のほうが消えます。**杭の刺し傷は 720<!-- codex: injuries.yaml object_defs.puncture_wound.props.severity.value --> で固定なので、必ず届きます。**
- **放置した罠でも、傷は最後まで行きます。** 獲物が入っている間、罠は速く傷んで破られ（6.1 節）、
  こぼれた獲物はその土地に立ちます。**立ち去りの時計は深手のあいだ止まる**
  （[`HuntingSystem.md`](./HuntingSystem.md) 5.6 節）ので、こぼれても数え始めません——**罠を失った後も、
  傷が決着するまでその獲物はそこに居ます。** 決着の仕方は上の箇条書きと同じで、掛かりの深さで分かれます。
  - **敗血症へ届く個体は、野ざらしのまま倒れます。** くくり罠で深く掛かった個体（`severity` の初期値が
    高いもの）と、杭の刺し傷（720<!-- codex: injuries.yaml object_defs.puncture_wound.props.severity.value --> で固定）のすべてです。**死体はその土地に残る**ので、遅れて戻った側が
    拾えるのは獲物ではなく死体で、そこからは腐敗の時計が別に走ります（[`HuntingSystem.md`](./HuntingSystem.md) 1.5 節）。
  - **届かない個体は、傷が癒えてから 96 tick<!-- codex: animals.yaml traits.beast.props.stay_remaining.value --> で立ち去ります。** くくり罠に浅く掛かった個体がこれで、
    **罠を失った後にもう一度だけ狩り直す猶予**が残ります。
- **死体は罠の中に残ります。** 枠が `quarry` で受ける（1.1 節）ので、`same_slot` の置き換えがそのまま
  通ります。タイマーのゲートも同じタグを問う（2 節）ので、**死体が入ったままでも次の抽選は回りません**。
- **最も小さい相手は、掛かった tick のうちに死にます。** 傷は最初の 1 tick で血を奪い切るので、
  6 mL<!-- codex: animals.yaml object_defs.rat.props.blood.value --> のネズミは生きた姿で 1 度も画面に出ません。
- **掛かっていることは漏れません。** 出血の印（`CardView.md` 9.0 節）が上がるのは怪我を負った本人まで
  で、UI が見るのは直下の子だけです。罠の直下に居るのは動物で、動物自身は `bleeding` を持たないため、
  そこで止まります。

### 5.2 出血しない怪我は殺さない

**生かす罠が刺すのは、血を奪わない怪我です。** 檻でも落とし穴でも打ち身（`bruise`）で、`bleeding` を
持たないので `severity` と `pain` だけが動きます。

**骨折は刺しません。** 骨折が奪う動きを駆動するのは宿主の `load` で、`load` を持つのはキャラクタだけ
（[`ContainerSystem.md`](./ContainerSystem.md) 2 節）——罠に掛かるのは獣なので、刺しても痛みしか
動きません（[`InjurySystem.md`](./InjurySystem.md) 5 節）。**杭を打てば刺し傷に替わります**——罠が
刺すのは 1 つだけ（5.1 節）なので、杭は「落ちて打ちつける」を「落ちて貫かれる」に置き換えます。
生かす側は血を奪わず、殺す側だけが血を奪う、という 1.2 節の 2 軸が、刺す傷の差だけで保たれます
——**開いたままになるのは血を奪う傷だけ**（`open_wound` を配るのは `bleeding` を持つ傷だけ、
[`InjurySystem.md`](./InjurySystem.md) 6 節）なので、**膿んで敗血症まで行くかどうかも、同じ 1 つの差から
出ます**（5.1 節）。

```yaml codex: injuries.yaml object_defs
# 生かす罠の打ち身（injuries.yaml）。閉じ込められた獣が丸太へ、落ちた獣が穴の底へ体を打ちつけて負う。
bruise:
  traits: [injury, treatable]
  props:
    severity:
      gauge: {min: good, max: bad}
      value:  # ぶつかり方の激しさを生成時に1回ロールする（GameElementDefinition.md 6.2節）
        min: 120
        max: 240
      range:
        min: 0
        max: 240
      passives: [{add: {self: {severity: -1}}}]
      on_min: {destroy: self}
  passives:
    - modify: {parent: {pain: 30}}
```

**体格で意味が変わりません。** 5.1 節の表は「同じ 1 枚の傷が体格で意味を変える」ことを、傷が奪う
`blood` と体格の比で書いています。血を奪わない傷にはその比が無いので、**1 kg のヤケイも 60 kg の
イノシシも、痛みを抱えたまま生きて残ります**——生かす罠が体格によらず生かせるのは、`bleeding` を
書かなかったこと 1 つで出ます。

**出血しない怪我で死ぬ道は要りません。** 死に方は [`VitalsSystem.md`](./VitalsSystem.md) 8 節が
挙げるものだけで、新しい死因は既存の死に方へ流す、が全体の方針です。**出血しない怪我は、
殺さないための道具です**——生かす罠の性格そのものが、その空白でできています。

**無傷では捕らえません。** 罠は落ちるか締まるかで捕らえるので、何も起きずに閉じ込められることは
ありません。生かす罠が与えるのは「治る傷」で、5 節の `modify` が警戒を打ち消している間、
`resists`（`HuntingSystem.md` 4 節）は成立しないままです。

飼いならしは「`wariness` が 0 になれば台車・かごへ入る」ことで表される（同 4 節）ので、**生かす罠の
中身は、その条件を満たしたまま待っていられます**。危険な相手を無傷で確保しておける、という檻の
価値がそのまま出ます。**檻はそのまま家畜の囲いなので、待ち終えた個体を移し替える操作もありません**
（1.2 節）。

- **檻が高いのはこのためです**（1.2 節）。木材と縄を払う相手は、殺すには惜しい相手だけです。
- **殺す罠に掛かった相手も飼いならせますが、放っておくと連れ帰った先で死にます。** 警戒を引き切る
  ところまでは同じで、ヤケイも杭を打った穴に落ちたイノシシも生きて拘束されたまま待ちます。
  **分かれるのはその後です**——殺す罠の傷は開いたままなので、台車・かごへ移した個体も膿み続け、
  敗血症まで届いた個体は死にます（5.1 節。杭の刺し傷はどの個体も届き、くくり罠は
  深く掛かった個体だけが届きます）。**手元へ置いたかどうかは、届くかどうかを変えません**
  ——野ざらしでも立ち去りは深手のあいだ止まる（同 5.6 節）ので、連れ帰ることで買えるのは
  「傷を洗う手が届くこと」だけです。**生かしておくには、飼うのに要る飲み水（5.4 節）とは別に、傷を洗う
  水が要ります**（開いた傷 1 つにつき 1 日 1 杯、[`InjurySystem.md`](./InjurySystem.md) 6.2 節）
  ——**どの個体が届くかは掛かり方のロールなので、見ただけでは分かりません。** 生かす罠の打ち身は
  膿まないので、この上乗せがありません——**これが檻に払う木材と縄が買っているものです。**
- **見回りを速くしても、この差は埋まりません。** 早く戻れば `exsanguinated` まで落ちた個体を連れ帰らずに
  済みますが（5.1 節）、それは掛かった直後の話で、傷が開いていることは変わりません。**生かす罠を建てるか、
  傷へ水を注ぎ続けるか**が、殺す罠で獲った相手を飼うときの取り引きです。
- **治りを待つ必要はあります。** 打ち身を負った個体は `severity` が引くまで傷を負ったままで、
  飼いならしの完了条件（`HuntingSystem.md` 8 節）がそれをどう見るかはまだ決まっていません。

### 5.3 生んだ獲物へ怪我を渡すのは、`spawn` の `into: child`

**`into: child` は起点を自分の子に取ります。** 子を順に走査して、**最初に受け取れた子のスロットへ**
配置します（`GameElementDefinition.md` 9.4 節）。走査の決め方はスロットに対するものと同じで、
**著者はスロット名も、どの子かも書きません**——怪我を受け取れるスロットを持つ子は 1 つしか居ません。

- **罠が自分の生んだ獲物へ届く経路は、これだけです。** `into` に何を書けるかは宣言の置き場所が
  決めます（`GameElementDefinition.md` 9.4 節。役の一覧は同 11.5 節「役を書ける場所」の表）——罠の抽選が
  乗る `catch_remaining` の `on_min` には、操作の役が 1 つも居ません。**罠には手番を持つ実行者が
  居ない**からです。`into: self` は罠自身の `catch` 枠（2 節）へ入るだけで、生まれたばかりの獲物を
  名指せるものは他にありません。
- **一意性は罠が保証します。** くくり罠の `catch` は `cell_count: 1` なので子は 1 つで、枠が 4 つある
  檻でも、空でなければタイマーが減らない（6 節）ので生んだ瞬間の子は 1 つです。一般には「最初に
  受け取れた子」で決まり、`into` が既にスロットに対して行っている決め方と同じです。
- **順序は `spawn` の配列が持ちます**（`GameElementDefinition.md` 9.4 節）。獲物より前に怪我を書くと、
  受け取る子がまだ居ません。
- **型の差し替え（`snared_junglefowl`）は採りません。** `HuntingSystem.md` 4 節が飼いならしについて
  述べているのと同じ理由で、獲物の型が 2 つに割れると `resists`・解体・警戒がすべて二重になります。

### 5.4 閉じ込めた獣だけが渇く【確定】

**獣も `hydration` と `body_fat` を持ちますが、減るのは `catch` の枠の中に居る間だけです。**
野生の個体では減りません。

- **島中の獣が数日で死ぬことはありません。** 獣が自分で水を飲む仕組みは無いままなので、無条件に
  減らせば全滅します。**ゲート 1 つで「飲めない状況に置いたのは誰か」を言い分けられます**——閉じ込め
  たのはプレイヤーなので、そこだけ責任が生じます。
- **ゲートは罠の型を問いません。** くくり罠・かご罠・落とし穴・檻・家畜の囲いのどれも枠の名前は
  `catch` で、囲いは檻と同じ 1 つの型です（1.2 節）。**閉じ込めている側は 1 行も宣言しません**
  ——渇くのは獣自身のことなので、宣言は獣の側だけに置きます。
- **飲ませ方は飼葉と同じ形です。** 囲いが飲み水を 1 つの量として持ち、中の獣が `transfer` で自分の
  `hydration` へ移します。飼葉を減らすのが獣自身である（[`Animals.md`](../world/Animals.md) 3.1 節）
  のと揃うので、**頭数がそのまま減りの速さ**になります。飼うことに「水をやる」という操作が要るように
  なるのは、この 1 対の宣言からです。
- **死に方は増えません。** 尽きたときに名乗るのは人と同じ `dehydrated`・`starved` です
  （[`VitalsSystem.md`](./VitalsSystem.md) 6 節）。
- **これが檻を放置した罰です。** くくり罠はもがかれて壊れます（6.1 節）が、丸太を組んだ檻に
  耐久はありません。渇きがその空白を埋め、**掛けたまま忘れれば、生かして獲った
  意味が消えます**。飢えは罠の時間の桁から外れているので、罰として働くのは渇きだけです。
- **人の側にも 1 つ返ります。** 渇きと飢えが人と獣の両方に在ることで、血が戻るのに「水と食べ物が
  足りていること」を**同じ形のまま両方へ配れます**（[`VitalsSystem.md`](./VitalsSystem.md) 3.1 節）。
  野生の個体では値が減らないので、条件は常に満たされます。

**出どころ**: [#656](https://github.com/gooyyu1/UnmappedIsland/issues/656)（閉じ込めた獣だけが渇く）

### 5.5 渇きの宣言と、罰として効く長さ

5.4節のゲートを宣言と数へ落としたもので、覆すのに人間の判断は要りません。

```yaml codex: animals.yaml traits.beast.props
# 獣の側（animals.yaml）が1箇所だけ宣言する。
hydration:
  passives:
    - conditions: [{in_slot: catch}]
      add: {self: {hydration: -1}}
  on_min:
    destroy: {subject: self, reason: dehydrated}
```

くくり罠がもがかれて壊れるまでは 0.91 日<!-- stats: durations.yaml durations object=snare property=durability shortest_days -->（6.1 節）、閉じ込めた獣が渇いて死ぬまでは満水から 3.5 日<!-- stats: durations.yaml durations object=junglefowl property=hydration days -->、
飢えて死ぬまでは 67 日<!-- stats: durations.yaml durations object=junglefowl property=body_fat days -->です。**飢えだけが罠の時間の桁から外れている**ので、5.4節の「罰として働くのは
渇きだけ」がここで出ます。

## 6. 回収するまで、次は掛からない

**タイマーが減る条件には「`catch` が空であること」が入っています**（2 節の
`not: {slot: catch, matches: {tag: quarry}}`）。掛かった瞬間に時間は止まり、獲物か死体を出すまで次の抽選は回りません。

- **見に行く理由が値だけで立ち上がります。** 放置した罠は 1 匹目で止まるので、罠を増やしても
  見回らなければ増えません。「仕掛けて忘れる」が最適にならない、という制約を条件 1 つで書けます。
- **罠は餌を食い続けません**（4 節の餌も同じ `in_slot` のゲートで減りますが、こちらは獲物が
  入っていても減り続けます——掛かった獲物の周りで餌が傷むのは止められません）。
- **枠が埋まったまま抽選が回る状態を作らないので、2 節の `spawn` が土地へこぼれることもありません。**
- **この 1 つの条件が、檻を家畜の囲いに変えます**（1.2 節）。獣を 1 頭入れれば抽選は止まり、以後は
  置いておくだけの設備になります。**罠であることをやめる操作は要りません。**

罠の耐久（`durability`、[`DurabilitySystem.md`](./DurabilitySystem.md)）は仕掛けている間ずっと減り、
獲物が掛かった回にまとめて減ります（もがかれて傷む）。**罠は永久機関にならず、繊維を編み直す仕事が
定期的に戻ってきます。**

### 6.1 放置された罠は破られ、獲物も失われる

**獲物が入っている間、耐久は速く減ります。** もがかれ続ける罠は、空のまま風雨に晒される罠より
桁違いに早く傷みます。

```yaml codex: traps.yaml object_defs.snare
props:
  durability:
    value: 960
    range:
      min: 0
      max: 960
    passives:
      - conditions: [{in_slot: items}]
        # 屋外での劣化
        add: {self: {durability: -1}}
      - conditions: [{slot: catch, matches: {tag: quarry}}]
        # もがかれている間（屋外より桁違いに速い、下の箇条）
        add: {self: {durability: -10}}
    on_min:
      destroy: self
```

**壊れた罠の中身は、道連れにならず土地へこぼれます**（`GameElementDefinition.md` 9.3 節）。

- **罰は罠と獲物の両方を失うことです。** 罠が破られるまでの 0.91 日<!-- stats: durations.yaml durations object=snare property=durability shortest_days -->で
  警戒は引き切っている（5 節）ので、こぼれた獲物は暴れも逃げもせず、その土地に立っています。
  **そのまま放っておけば、立ち去りまでの残りが尽きて獲物も消えます**
  （[`HuntingSystem.md`](./HuntingSystem.md) 5.6 節）——地面に立っている間だけ減る値なので、
  こぼれるまでは 1 も減っていません。**死体に立ち去りはありませんが、代わりに腐って消えます**
  （同 1.5 節）——**掛かったのが生きているか死んでいるかによらず、待たせすぎれば獲物は残りません。**
  - **殺す罠でこぼれた獲物は、傷が癒えるまで動き出しません。** 深手を負っている間は立ち去りが止まる
    （同 5.6 節）ので、こぼれた直後の獲物はまだ数えられていません（くくり罠の裂傷も杭の刺し傷も
    `hurting` に届きます）。**生かす罠の打ち身だけは届かない**ので、素の穴からこぼれた獲物は
    こぼれたその時から数え始めます。**先に失うのは罠のほうで、獲物はそこから
    数日ぶん遅れて消えます**——傷が深ければ、癒えるより先に膿んで倒れ、死体として残ります。
    **取りに戻る側から見れば、罠を失った後にもう一度だけ猶予がある**ということです。
- **死なせずに罰するので、生かす罠の値打ち（5.2 節）は損なわれません。** 罠は壊れ、獲物は立ち去る
  だけで、どちらも死ではありません。見回らなければ増えない（6 節）だけでなく、待たせすぎれば失います。
- **獲物ごとに何も分けません。** 速い減りが掛かるのは枠に `quarry` が居る間だけで、**掛かったのが何で、
  生きているか死んでいるかも問いません**——死体も同じタグを名乗る（5.1 節）ので、ネズミが死んでも
  減りは止まりません。**罠が保つかどうかを決めるのは、見回りに戻るまでの時間だけです。**
- **耐久が持つのは、壊れる罠の罰だけです。** 丸太を組んだ檻には耐久が無いので、そちらは渇きが罰に
  なります（5.4 節）。**どちらも「待たせすぎれば失う」で**、罠の側まで失うかどうかだけが違います。

## 7. 狩猟との非対称

| | 狩猟（`HuntingSystem.md`） | 罠（本書） |
|---|---|---|
| **危険** | 反撃を受ける。深手は数日残り、手当ての間も殴られる | 無い。掛かった相手は拘束されている（5 節） |
| **拘束** | tick が動物の手番なので、対峙している間は他のことができない | 仕掛けたら別の土地へ行ける。ただし回収に戻る（6 節） |
| **時間** | 15 分<!-- codex: animals.yaml traits.beast.interactions.strike.duration -->の一撃を重ねる。決着はその場 | 16 tick<!-- codex: traps.yaml object_defs.snare.props.catch_remaining.on_min.add.self.catch_remaining --> ごとに 1 回抽選。掛かるまで何度でも回る（2 節） |
| **前払い** | 武器（作る手間と、賭ける耐久） | 罠（サイズと生死で変わる、1.2 節）と餌（**食べられる食料**、4 節） |
| **獲物** | 大型まで。1 頭で数日分の肉 | 罠の型が並べた候補まで（1.1 節）。小型の罠なら 1 匹の肉は少ない |
| **運** | 当たり所と、負う怪我の抽選 | **いつ・何が掛かるかの抽選**（2.1 節・3 節） |
| **土地の効き方** | 遭遇するかどうか（探索・移動） | 成功率そのもの（3 節） |
| **腕前の効き方** | 出くわす機会が増え、当たり所も太る（[`../world/Skills.md`](../world/Skills.md) 5 節） | **映らない。** 留守のあいだ働くので、掛かる瞬間に腕の持ち主が居ない（8 節） |
| **生かして獲る** | できない（気絶させても運ぶ間に目覚める） | **罠だけができる**（5.2 節）。飼いならしの唯一の入口で、傷を洗う水の上乗せが要らないのは生かす罠で獲った相手（1.2 節。飲み水はどちらも要る、5.4 節） |

**罠は狩猟の下位互換ではなく、賭けるものが違います。** 狩猟が賭けるのは身体と武器で、罠が賭けるのは
時間と食料です。序盤は食料が出せないので罠が回らず、武器を作れば大型が獲れるようになるので罠は
上位に置き換わりません——**両方が同時に成り立つのは、片方が危険を、もう片方が時間を課しているから**です。

**大型ほど、この差が開きます。** ネズミに選択はありません——載るのはくくり罠の卓だけで（檻は丸太の
隙間から出ていく大きさを並べない、1.1 節）、掛かれば血 6 mL<!-- codex: animals.yaml object_defs.rat.props.blood.value --> を失って必ず死にます（5.1 節）。
**ヤケイはくくり罠にも檻にも載り、どちらでも生きて手に入りますが、傷の手当てなしに飼えるのは檻の側
だけです**——くくり罠の傷は 80 mL<!-- codex: animals.yaml object_defs.junglefowl.props.blood.value --> を空にできない（同節）ので回収の時点ではどちらも生きて
いますが、くくり罠の傷は開いたままなので、飼うなら傷へ水を注ぎ続けることになります（5.2 節）。
分かれるのは費用と、**見回りが遅れたときに `exsanguinated` まで落ちるかどうか**と、**連れ帰った先で
傷を洗う水が上乗せで要るかどうか**です。
大型はそのくくり罠に載らないので、**穴を掘るか、檻を建てるか**という別の仕事から
始まります——**どちらでも生きて拘束される**（1.2 節）ので、分かれるのは払う物（掘る時間か、木材と縄か）
と、杭を打つかどうかです。**杭は肉を獲るためのもので、飼うつもりなら打ちません**——刺し傷は必ず
敗血症へ届く（5.1 節）ので、打った穴で獲った個体は洗い続けない限り死にます。**罠の中の差が、獲物が
大きくなるほど狩猟との差より大きくなります。**

## 8. 未決事項・今後の検討課題

- **檻に肉の卓を持たせるか。** 今の檻は草の餌だけを受けます（4.1 節の 2 つの卓のうち片方）。掛かる
  大型のイノシシは雑食なので（同節）、卓 1 つと `meat_bait` を足せば肉でも寄せられますが、**同じ
  相手を 2 通りの餌で呼べるようにする値打ちがあるか**が先の問いです。肉でしか寄らない相手が出れば
  問いは消えます
- **閉じ込めた獣の渇きの速さ**（5.5 節）。人と同じ「満水から 3.5 日<!-- stats: durations.yaml durations object=junglefowl property=hydration days -->」を獣にも配るのか、体格で変えるのかは、
  囲いに飲み水を置く操作の手間と一緒に決める
- **同じ土地に罠を何個も置いた場合。** 現状は個数に比例して収穫が増えます。掛かった瞬間に土地の
  `<動物>_catch` を `add` で減らす（獲り尽くすと居なくなる）形は書けますが、**回復の仕組み**を
  同時に決める必要があります
- **仕掛けるのに時間を課すか。** 今は地面へ置くだけで作動します（1 節）。枠の `put_in`
  （`GameElementDefinition.md` 7.10 節）は土地の `items` 全体に効いてしまうので使えず、罠の側の
  メニュー型の操作で課すと「置いただけの罠」と「仕掛けた罠」を区別する状態が 1 つ増えます
- **餌の量が効く形にするか。** 今は `gte: 1` の有無だけで、1 つ仕掛けても満杯でも同じです。段を刻めば
  量が効きますが、段の数だけ `modify` のブロックが要ります
- **草食・肉食の 2 つで足りるか。** 果実と穀物、魚と獣肉のように、餌をさらに分けたくなった場合、
  卓が増えるだけで形は変わりません。増やすほど「土地に合わせて餌を選ぶ」判断は細かくなりますが、
  合わない餌を焚く空振り（4.1 節）も増えます
- **仕掛けた罠が画面のどこにも出ないこと。** 5 節のとおり罠は何も告げないので、遠くの土地に置いた
  罠は、そこへ戻るまでプレイヤーの視界から完全に消えます。仕掛けた場所を忘れる負担が実際に重いなら、
  罠の作動ではなく**どこに何個仕掛けたか**を出す形（一覧・地図側）で埋めることになります
- **狩猟スキル**（[`SkillSystem.md`](./SkillSystem.md)）を罠へ効かせるか。**今は効きません。**
  `miss_weight` を押し下げる `modify` が素直ですが、スキルは罠ではなくプレイヤーが持つため、罠から
  見て `ancestor` に居ません（仕掛けた罠の祖先は土地です）。**掛かる抽選は誰も操作していない場面で
  走るので、`subject: agent` も書けません**（`catch_remaining` の `on_min`。2 節）。腕は代わりに、
  探索で獣に出くわす重みと、打ちかかった一撃の当たり所へ上乗せとして効いています
  （[`../world/Skills.md`](../world/Skills.md) 5 節）。どちらも腕の持ち主が操作している場面です
  ——**留守のあいだ働く罠は腕を映さない**が、7 節の非対称に「腕前の効き方」の行として加わりました。
  効かせるなら、腕の持ち主が居る場面（餌を仕掛ける、4 節）に何かを残させることになります
- **落とし穴の掘削具。** **掘り棒にする太い枝を 1 本折り込む形で置いてあります**
  ——畑（`farming.yaml`）が掘削具の代わりに太い枝を折り込んでいるのと同じ仮置きで、掘削具が島に
  入れば、そちらへ移します。**杭のほうは仮置きではありません**——立てるのは長い棒
  （[`SurvivalItems.md`](../world/SurvivalItems.md) 3 節）で、獣の落ちる深さを貫くだけの長さが
  要ります。**そのぶん、生かす罠を殺す罠へ変える手だけが刃物と若木を要求します**
- **杭を打った落とし穴が大型を殺し切るか。** 今刺さるのは槍と同じ刺し傷（5.1 節）で、固まるまでに
  奪う量はイノシシの 4,600 mL<!-- codex: animals.yaml object_defs.wild_boar.props.blood.value --> を削り切りません。1 枚で殺し切る傷を別に用意するか、深手を負わせて
  仕留めさせるところまでで足りるかは、**穴に中型が落ちるようになってから**でないと見えません
- **筌**（魚・`Animals.md` 9 節）。本書の形をそのまま使えますが、水面の土地がまだ無く、掛かる相手が
  土地の別のつまみになります
- **罠が効かない動物の表し方**（`Animals.md` 10 節）。サルは学習し、シカは速い、という「その土地には
  居るのに罠には掛からない」を、土地が `<動物>_catch` を宣言しないことで表すのか、別の量で表すのか
- **用意する怪我の一覧と、その配分。** 罠が刺すのは 1 つ（5.1 節）なので、型ごとにどれを刺すかが
  要ります——**怪我の数は型の数とは一致しません**。檻と落とし穴は同じ打ち身を刺すので、殺す・生かすの
  差（1.2 節）が同じ 1 枚でまかなえる型は共有します。くくり罠の裂傷・檻と落とし穴の打ち身（5.2 節）・
  杭を打った落とし穴の刺し傷（5.1 節）は決まり、残るのはかご罠です。
  重さ・痛み・出血の割り振りは `InjurySystem.md` 未決事項節と同じ問いです
- **同じ罠から複数の種類の怪我を出すか。** 「首に掛かったか、脚に掛かったか」は `pick` をもう 1 段
  入れれば書けます（食性 → 種 → 怪我の 3 段）が、候補が種の数だけ複製されます。今は 1 種類と
  生成時のロール（5.1 節）で、ばらつきは足りているはずです
- **怪我にできない削られ方が要るか。** 締めつけによる窒息のように、**手当てできず 1 つずつ数えられない**
  ものは怪我にしない、という線が既にあります（`InjurySystem.md` 4 節）。今の罠はすべて刺す傷で
  表せていますが、そこへ収まらない罠が出たら、罠の `passives` が `child` の `blood` を直接削る形に
  なります——`add` の対象に `child` は既にあるので、そのときも新しい文法は要りません
