罠システム設計

概要

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

掛かった後は狩猟と同じです。 罠の中の獲物は普通の動物のカードで、仕留め・解体・怪我・警戒は すべて HuntingSystem.md が持ちます。どの動物がどの土地にどれだけ居るかは Animals.md、罠そのものの素材とレシピは SurvivalItems.md 1.2 節・Skills.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 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)と、その 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 分)を前提とします。 未決事項は 8 節に整理しています。

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

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

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 1.1 節)、手持ちは hand、かごの中は contents と 名前が違うので、地面に置いた罠だけが動くが条件 1 つで書けます。装備の {in_slot: equip} (GameElementDefinition.md 8.2 節)と同じ形で、罠のための新しい概念ではありません。

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

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

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

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

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

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

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

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

檻と家畜の囲いは 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 節)、そのとき既に囲いの中に居ます——檻から囲いへ移し替える操作は 要りません。「生け捕りにして待つ」と「家畜を飼う」が、同じ枠の中の時間の経過だけで繋がります。

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

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

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}

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

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

抽選は 16 tickごとに回り、1 回あたりの成功率は 3 節が決めます。仮に 3 割なら、掛かるまでの 待ち時間は幾何分布になり——数時間で掛かることも、丸一日空振りが続くこともあります。乱数を 1 つも 足さずに、狩猟には無い「待たされる」が出ます。

そのうえで初期値だけは {min: 1, max: 16} の範囲でロールします(GameElementDefinition.md 6.2 節)。 これは待ち時間の幅ではなく位相で、複数の罠が同じ tick に一斉に判定するのを防ぐためだけのものです。

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

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

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

# locations.yaml — 草原
grassland:
  props:
    rat_catch: {value: 6}
    junglefowl_catch: {value: 10}
# 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

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

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

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

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

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

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

# 罠の側が宣言する。草の餌と肉の餌で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 節)が保証します。

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

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

# 罠の側の効かせ方
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

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

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

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

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

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 つ刺す

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

# 掛かった候補(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 節)が 「浅く掛かったか、深く食い込んだか」をそのまま表します。

# くくり罠の怪我。縄が食い込んで裂ける傷で、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)なので、同じ 1 枚の傷が体格で意味を変えます。

獲物 血の量 奪われる量は 血が固まるまでの結果
ネズミ(80 g) 6 全部 必ず死ぬ
ヤケイ(1 kg) 80 大きな割合 血は尽きない
サル(5 kg) 400 小さな割合 血は尽きない
イノシシ(60 kg) 4,600 ごくわずか 応えない

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

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

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

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

# 生かす罠の打ち身(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 8 節が 挙げるものだけで、新しい死因は既存の死に方へ流す、が全体の方針です。出血しない怪我は、 殺さないための道具です——生かす罠の性格そのものが、その空白でできています。

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

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

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

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

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

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

出どころ: #656(閉じ込めた獣だけが渇く)

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

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

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

くくり罠がもがかれて壊れるまでは 0.91 日(6.1 節)、閉じ込めた獣が渇いて死ぬまでは満水から 3.5 日、 飢えて死ぬまでは 67 日です。飢えだけが罠の時間の桁から外れているので、5.4節の「罰として働くのは 渇きだけ」がここで出ます。

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

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

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

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

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

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 節)。

7. 狩猟との非対称

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

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

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

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