生命と意識のシステム設計

概要

何が意識を奪い、何が命を奪うか——気絶する・死ぬをどう表すかと、新しい死因が現れたときにそれを どこへ流すか(8 節)を決めるドキュメントです。怪我という オブジェクトそのものの構造は InjurySystem.md、動物と対峙する局面は HuntingSystem.md、飢え・渇きの値の刻み方は Characters.md、ステータスの見せ方は StatusArea.md が 扱います。本書が決めるのは、それらが合流する先であるプロパティと、その底に着いたときに何が 起きるかだけです。

新設する文法は destroy の reason(消し方に名前を添える、 GameElementDefinition.md 9.3 節)の1つだけです。 死因を名乗るのに要ります (6 節)。導入する語彙は次のプロパティと段の名前、それに死因の名前 (dehydrated・starved・exsanguinated・frozen)で、残りは既存の仕組み——stages の中の passives (段ごとの寄与)・modify(可逆な寄与)・add(不可逆な削り)・on_min(下限へ達した瞬間の効果) ——にそのまま載ります。

語彙 何を表すか
consciousness(意識) 起きていて動けるか。押し下げられる実効値(2 節)
shock(衝撃) 殴られた揺れ。即座に上がり、自分で引いていく(2.1 節)
blood(血液量、mL) 体に残っている血。失われる実体値(3 節)
bleeding(出血) 傷が持つ、今流れている勢い。固まれば止まる(4 節)
warmth(熱、kcal) 体に残っている熱。寒さが削り、火と衣服が守る実体値(8.3 節)
段 unconscious ここに落ちたら手番が回らない。名前を固定する(6 節)
段 exsanguinated 失血で助からない域
段 frozen 熱を失い切った域。exsanguinated と並んで、本書が fatal を置く段

定義の置き場所は src/assets/world-codex/animals.yaml(動物)と characters/player_character.yaml (キャラクタ共通の props)、削る側は src/assets/world-codex/injuries.yaml の各傷、読む側は カードの状態バー(PlayScreenView)と、気絶した間の手番を飛ばす側です。

本ドキュメントは検討結果であり、確定仕様書ではありません。キャラクタの死(6 節・8 節)は実装済み ——渇き・飢え・失血・凍えで死に、死ねばセーブデータごと消えます。2 節から 6 節までは動物で 実装済みです(検証は tests/world-codex/animalsYaml.test.ts)——体格に見合う武器で殴れば気を失い、 裂けた傷から血が流れ、放っておけば固まって止まり、失いすぎれば目を覚まさず、尽きれば死体になります。キャラクタが持つのは blood と warmth までで(検証は tests/world-codex/charactersYaml.test.ts)、shock と consciousness はまだ配っていません(7 節)。血が戻る条件(3.1 節)は人にも獣にも配り終えています (検証は tests/world-codex/charactersYaml.test.ts と animalsYaml.test.ts)。8 節が挙げる新しい死因を 既存の死に方へ流す道のうち、食の偏りは実装済み(DigestionSystem.md 7 節)で、 感染も 8.1 節の 2 経路が入っています(全身の菌 pathogen の段が持ち、膿んだ傷はそこへ流し込む側。 膿む速さも押し上げる量も仮決めで、InjurySystem.md 6 節)。寒さを防ぐ側は、火と洞窟に加えて 衣服と寝床が入りました——衣服は身につけている間、寝床は寝ている間、chill_point を押し下げます (深さは衣服が素材ごと、寝床が段ごとで、SurvivalItems.md 5.1 節と Bedding.md 4.2 節)。未決事項は末尾に整理しています。

1. 意識と血は分ける

気絶するかを決める値と、死ぬかを決める値は、別のプロパティにします。

決め手は痛みです。痛みは意識を奪いますが、血は減らしません。 1本の値に統一すると、激痛で意識を落とす 経路がそのまま命を削ることになり、「傷は浅いが激痛で倒れた」が書けなくなります。分けておけば、原因ごとに 宛先を選べます——痛みと衝撃は意識へ、出血は血へ、殴打はその両方へ。

分かれ目はエンジンの機構そのものでもあります。これらは別の仕組みに載ります。

consciousness(意識) blood(血液量)
値の性質 実効値(自分では動かない。pain・load の仲間) 実体値(削られて残る。severity の仲間)
動かすもの 痛み・失血・衝撃の段が modify で押し下げる 出血する傷が add で削る
元に戻るか 原因が消えれば自動で戻る(気絶からの回復に後始末が要らない) 自分で戻るが、削られる速さとは桁が違う
底に着いたら 段 unconscious を読む側が手番を飛ばす(6 節) on_min が 死を起こす(3 節)

統一が成り立たないのはここです。 on_max/on_min は実体値の書き込みでしか発火しません (PropertyValue.add が checkRangeEvents を呼ぶ経路だけ)。意識のように modify だけで決まる値は、 いくら0になっても range イベントを起こせないため、統一値にすると死を起こす主体が世界の側に居なくなり、 毎 tick 見張る側が要ります。逆に実体値1本へ統一すると、今度は気絶からの復帰を誰かが書き戻すことになり、 HuntingSystem.md 6 節が「値は効果の入力であって通知路ではない」として避けた形に 戻ります。

2. 意識は押し下げられる実効値

consciousness は自分では動きません。 初期値は満たした状態(100)で、痛み・失血・衝撃が modify で押し下げます。原因が消えれば寄与も消えるので、気絶から覚めるのに回復処理は要りません。

# 獣(animals.yaml の beast trait)。段ごとの寄与と絵の差し替えは省いている
consciousness:
  gauge: {min: bad, max: good}
  value: 100
  range:
    min: 0
    max: 100
  stages:
    - {name: unconscious, alert: danger}
    - {name: dazed, alert: caution, min: 25}
    - {name: foggy, alert: watch, min: 60}
    - {name: clear, min: 80}

押し下げるのは、押し下げる側の段です。 寄与は stages の中の passives に書きます (GameElementDefinition.md 6.4節)。時刻(hour)の段が明るさ (ambient_brightness)へ寄与しているのと同じ形で、しきい値と寄与量が同じ1箇所に並びます。

# 獣(animals.yaml の beast trait)。flee は逃げの重み
pain:
  stages:
    - {name: painless}
    - name: sore
      min: 25
      alert: watch
      passives:
        - modify: {self: {flee: 25}}
    - name: hurting
      min: 50
      alert: caution
      passives:
        - modify:
            self:
              consciousness: -20
              flee: 60
    - name: unbearable
      min: 83
      alert: danger
      passives:
        - modify:
            self:
              consciousness: -45
              flee: 120

段は排他なので(同じ値が2つの段に該当することはない)、階段がそのまま並びます。効き方は連続では なく階段でよい——段はまさにその単純化のための仕組みで、刻みの細かさは段の数で決めます。

寄与元はいずれもこの1つの形で書きます。

寄与元 何を表すか 意識が戻るきっかけ
pain の段 痛みで朦朧とする 傷が治る・手当てで痛みが引く
blood の段 血を失って意識が遠のく 傷を塞ぐ。血は自分で戻るが、桁違いに遅い(3 節)
shock の段 殴られた衝撃(2.1 節) 自分で引く

痛みだけでは気絶させません。 痛みが最も深い段でも意識は朦朧(dazed)に留め、そこへ失血か 衝撃が重なって初めて落ちる、という配分にします。痛みで気絶できてしまうと、手当てを怠っただけで 行動不能になり、2 節の「意識は原因が消えれば戻る」が「痛みが引くまで何もできない」に変わります。

押し下げている当人へは、意識から押し返せません。「意識が薄いほど痛みを感じない」は、pain の modify のゲートが consciousness を読み、その consciousness が pain から決まる循環になり、実行時に 例外が飛びます(同 14.1節)。押し下げていない値へなら書けます——獣の1手の重み配分がそれで、濁った 意識が様子見の重みを太らせています(HuntingSystem.md 5.5 節)。

2.1 衝撃は、自分で引いていく量

殴られて意識が飛ぶのは、傷ではなく打たれたことの結果です。 傷(severity)の段にぶら下げると 時間の尺度が合いません——深い傷は日の単位で治り、気絶から覚めるのは時間の単位だからです。同じ量の段で 桁違いの時間は表せないので、衝撃を1つの量として持ちます。

# サル(animals.yaml の monkey)
shock:
  value: 0
  range:  # maxが体格(体重の1/50)。イノシシは1200<!-- codex: animals.yaml object_defs.wild_boar.props.shock.range.max -->
    min: 0
    max: 100
  passives:
    # max ÷ 25(下の箇条)
    - add: {self: {shock: -4}}
  stages:
    - {name: steady}
    - name: rattled
      min: 30
      passives:
        - modify: {self: {consciousness: -30}}
    - name: reeling
      min: 70
      passives:
        - modify: {self: {consciousness: -80}}

与えるのは攻撃の側で、add は実体値への即時の書き込みなので殴った瞬間に効きます。

- weight: {subject: instrument, prop: heavy_blow}
  add:
    self:
      wariness: 25
      shock: 250
    instrument: {durability: -20}
  spawn: {object: laceration, into: self}
  signal: hit

3. 血は失われ、尽きれば死ぬ

blood(血液量、mL)は失われたら戻りにくい実体値で、0 に達した瞬間に死にます。on_min で 自分を消す形は怪我の severity と同じ(InjurySystem.md 1 節)です。消す宣言が 死因の名前を添える(reason: exsanguinated)ので、消えたあとでも死に方を読めます(6 節)。

# キャラクタ(characters/player_character.yaml)
blood:
  tags: [status, health]
  # 体重のおよそ1/13。maxがそのまま体格
  value: 5000
  range:
    min: 0
    max: 5000
  stages:
    - {name: exsanguinated, alert: fatal}             # 6割を失えば助からない
    - {name: hemorrhaging, alert: danger, min: 2000}
    - {name: bled, alert: caution, min: 3000}
    - {name: low, alert: watch, min: 3500}
    - {name: replete, min: 4000}
  on_min:
    destroy: {subject: self, reason: exsanguinated}   # 消す宣言が死因を名乗る(6 節)
  passives:
    # 血は自分で作り直される。戻る条件は 3.1 節
    - conditions:
        - {prop: hydration, in_stage_or_above: hydrated}
        - {prop: body_fat, in_stage_or_above: gaunt}
      add: {self: {blood: 2}}

獣の段は、同じしきい値の比率で意識を押し下げます(人の段はまだ寄与を持ちません。7 節)。

# サル(animals.yaml の monkey)
stages:
  - name: exsanguinated
    alert: fatal
    passives:
      - modify: {self: {consciousness: -100}}
  - name: hemorrhaging
    min: 160
    alert: danger
    passives:
      - modify: {self: {consciousness: -70}}
  - name: bled
    min: 240
    alert: caution
    passives:
      - modify: {self: {consciousness: -30}}
  - {name: low, alert: watch, min: 280}
  - {name: replete, min: 320}

3.1 血が戻るのは、水と食べ物が足りている間だけ【確定】

blood の戻りに、水分と体脂肪のゲートを付けます。 どちらかが安全域を外れている間、血は 戻りません。

3.2 ゲートを、条件の文法へどう写すか

3.1 節のゲートを今の文法へ写したもので、覆すのに人間の判断は要りません。

判定は段の名前で行います(in_stage_or_above)。conditions から域(alert)そのものを読む術が 無いので、安全域の下端の段を名指します(GameElementDefinition.md 14.1 節・17 節)。閾値を条件の側へ書き写すより、名前で見るほうがずれません(同じ理由で移動可否も too_heavy という名前で見ています、ContainerSystem.md 5 節)。

3.3 戻る速さは、罠が次の獲物を返すまでに深手 1 つを埋める

+2/tick(3 節)のままとします。 人が一度に失う量と、狩りの間隔の両方が出たので比べられます。 戻るのは 1 日 192mL です。

戻らなくなる境目(3.1 節)も、このままとします。 ゲートが見る水と体脂肪は、島の暮らしを 1 日ぶん 賄う献立に丸ごと入っています——その献立が要求するのは 1 日 549 分(満腹とビタミンも含めた 全部の合計。うち 360 分は睡眠で、段が余計に削るぶんは入っていない下限。 DigestionSystem.md 9 節)で、渡り歩ける島には賄えない値がありません。 ゲートが閉じるのは暮らしが崩れているときだけで、深手を負ったこと自体では閉じません。

4. 出血は、血を失う速さ

出血する傷とは「宿主の blood を毎 tick 削る傷」のことで、勢いの違いはレートの違いとして表れます。 そして血は固まります——傷の側が bleeding(今流れている勢い)を持ち、それが尽きた時点で止まります。

laceration:
  props:
    # 傷の重さとは別の時間で動く。満ちた勢いが毎 tick 引いて、尽きれば固まる。
    bleeding:
      value: 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}}

5. 決着は死ではなく気絶で付く

狩りの決着は、相手が倒れた時点で付きます。 気絶すれば手番が回らず、反撃も逃走もありません(6 節)。 意識は modify で押し下げられる実効値なので、衝撃を与えた瞬間に効きます(2.1 節)——石斧の一撃で 猿が崩れ落ちる、が遅れずに起きます。

だから血の減少は遅れてかまいません。 出血で blood が尽きるのは何 tick も先(4 節)ですが、 その間に相手が反撃してくることはないので、待つか、止めを刺すか、生け捕りにするか(7 節)を選ぶ時間が 残ります。実体値を即座に動かす専用の入口は要りません——衝撃は実効値の側で即座に効き、遅れてよい ものだけが実体値に載っています。

決着が付いた後に仕留めるのは、別の一手です。 気を失った相手へもう一度武器を重ねると、無防備さが 押し上げた重みで一撃が急所へ入ります(HuntingSystem.md 1.4 節)。命を削り切る のを待つのではなく、待つか・仕留めるか・生かして運ぶかを選べるのは、決着と死が別の出来事だから です。

体格の差は、shock と blood の max に出ます(2.1 節・3 節)。同じ強打でも、サルは一撃で沈み、 イノシシは4撃を要します。武器の差は当たり所と同じく pick の重み配分が持つので (HuntingSystem.md 1.2 節)、どの一撃を引くかとして現れます——衝撃を与えて その場で沈める武器(石斧)と、深手を負わせて血で決着する武器(槍)が、同じ1つの strike から出ます。

6. 倒れたことを読む場所

起きること 誰が起こす・読むか
死 世界の側(命を絶つ値の destroy)。プレイヤーが死んだことは「もうどこにも居ない」ことがそのまま表す(Ending.kind が death)ので、死んだという旗はどこにも持たない。どう死んだかだけは、消した宣言が名乗る(reason)
気絶 画面(操作を受け付けず時間だけ進める)と、動物の1手を与える側(HuntingSystem.md 5.2節)が、段 unconscious を読んで手番を飛ばす

死因を名乗るのはワールドの側です。 命を絶つ destroy が名前を添え(reason、 GameElementDefinition.md 9.3節)、その名前が消された側に残ります (WorldObject.destroyedReason)。Ending.causeOfDeath はそれを読むだけで、 命を絶つ値の on_min が名乗る名前が、そのまま死に方の名前です。画面は名前から文言を引くだけで (Localization.destroyReason、Localization.md destroy_reason_texts節)、しきい値も 死因の言い方も知りません。死に方が増えても、名前を1つ添えるだけで画面に出ます。

死因の名前は、段の名前とは別の名前空間です。 今の名前はたまたま命を絶つ値の最後の段と同じ綴りですが、 揃っている必要はありません——段を通らない即死(interactions の destroy)には対応する段が無いので、 揃える規約は最初から成り立ちません。

残った数値から推測しません。 「on_min を宣言していて下限以下の値」を探す読み方は、次を 同時に取りこぼします——上限に達して消える死に方(判定が下限側しか見ていない)、段を通らない即死 (尽きた値がそもそも無い)、致死でない消滅(獣が立ち去る stay_remaining の on_min は、渇きで 死ぬのと残った値の形が同じ)。どれも「推測している」ことの帰結なので、個別に塞いでも次が出ます。 名前を書かない destroy は何も名乗らないので、立ち去りが死因として読まれることはありません。

画面は死んだ瞬間の並びのまま止めます。 死んだキャラクタはもうどの土地にも居ないので、そこから 世界を映し直すと現在地も足元の物も別のものに入れ替わってしまいます。時間の経過も見せません—— 見せる相手が世界から出ています。

出すのはポートレイト・生存日数・死因だけのダイアログで、閉じるとセーブデータごと消えて セーブ選択画面へ戻ります。このゲームにはハードコアモードしかありません (SaveDataManagement.md)。

個々のアクションに conditions を撒きません。 「意識が無いと何もできない」は操作ごとの条件ではなく、 手番が回るかどうかの1つの判断だからです。撒けば、アクションを足すたびに書き忘れが増えます。

読む側が知るのは段の名前だけです。荷重の too_heavy を道の travel が読み、水分の full を飲用が 読むのと同じ分担で(Characters.md 値の刻み方節)、しきい値を宣言しているのは ワールドの側だけになります。だから unconscious は名前を固定します。

6.1 死因を名乗れるのは destroy だけ【確定】

死は、そのインスタンスが世界から出ることであって、姿が変わることではありません。 become(GameElementDefinition.md 9.9節)はインスタンスがそのまま続く ので、最初から死に方ではありません。だから become は死因を持ちません——他の終わり方へ名前を配れる ようにしておく必要もありません。

出どころ: #656(become は死に方ではない)

7. 体の値は、人にも獣にも配る

pain・shock・consciousness・blood は、キャラクタと動物の両方が持ちます。同じ傷が両方に刺さる (HuntingSystem.md 3 節)以上、傷の側が押し下げる先は両方に在る必要があり、 片方にしか無ければ傷の定義を2通り書くことになります。

配り終えているのは pain と blood です。 blood は形も回復の速さも人と獣で同じで、違うのは max (体格)と、それに比例する回復の量だけです。shock と consciousness は動物にしかありません ——手番を飛ばす側は入りました(6 節)が、画面の側——操作を受け付けず時間だけ進める——がまだ ありません。 飛ばす判断は意識を持つ物すべてに掛かるので、今のまま人へ配ると、倒れた人は限界の休息 (Characters.md 限界節。どれも時間が起こす操作)まで止まり、押せる手も、 勝手に進む時間も無い画面が残ります。そのため人の blood は、段からの意識への寄与も持ちません。

渇きと飢え(hydration・body_fat)も両方が持ちます。 減るのは罠・囲いの中に居る間だけで、 野生の個体では減りません(TrapSystem.md 5.4 節)——閉じ込めた獣にだけ水と餌が 要るが、値を配る先を人と獣で分けずに書けます。尽きたときに名乗る死因も人と同じ(dehydrated・ starved)なので、死に方は増えません。熱(warmth、8.3 節)は人だけです——毛皮の獣が同じ寒さで 凍えることにはならず、島の獣に着せるものもありません。

これは狩りの側に副産物を1つ生んでいます。気絶した獣は抵抗しません——resists(同 4 節)が読むのは 警戒(wariness が 1 以上)だけですが、unconscious の段が wariness を −100 する (animals.yaml)ので、意識の段を足さなくても実効値が 0 以下へ落ちて条件が成り立ちません。殴って 気絶させた個体は、そのままかごや台車へ入ります。 生け捕りは、飼いならしとは別の入口として既に 成立しています。

8. 新しい死因は、既存の死に方へ流す

致死性プロパティは「死に方」の数だけ持ち、「死因」の数だけ持ちません。 死に方は 渇き(hydration)・飢え(body_fat)・失血(blood)・凍え(warmth、8.3 節)で、どれも 実装済みです(検証は tests/world-codex/charactersYaml.test.ts)。感染・発熱・下痢・毒・食の偏り (DigestionSystem.md 7 節)はいずれも死に方ではなく、そこへ至る道です。 新しい原因を足すたびにプレイヤーが見張るバーが増えるのでは、原因を見抜く判断は生まれず、ただ計器盤を 眺めることになります。

全身の菌(pathogen、DigestionSystem.md 6 節)がその道です。 上の 2 段が 削るのは hydration と blood で、8.1 節の 2 経路をここが持ちます。新しい原因は、この 1 本へ合流 させます——口から入った菌(生肉)も、膿んだ傷から回った菌(InjurySystem.md 6.3 節)も、押し上げる先は同じ値です。行が増えるのは発症している間だけです——潜伏期のうちは alert が safe で、安全域の行はステータスエリアに出ません (StatusArea.md 2 節)。

飢えの道は既に通っています——食べた物は胃と腸を経て body_fat へ積み上がり、基礎代謝で減ります (DigestionSystem.md)。

どれも現実の量そのものである点は偶然ではありません。水・脂肪・血・熱はいずれも体から出入りする物で、 「減れば死ぬ」は抽象化ではなく事実です。残り物のような抽象量(生命力・HP)を1つ置いて、行き場のない 効果をそこへ流し込む、という逃げ道を作らないための線引きでもあります。

道として書けば、GameConcept.md が掲げる連鎖——「怪我を放置すると細菌感染が 進み、感染は発熱や下痢につながり、下痢は脱水を招き、最終的には死に至る」——がそのまま立ち上がります。 水がいつもより速く減っていく → なぜか → 熱がある → なぜか → 傷が膿んでいる、と遡れるのは、 感染が自分専用のバーを持たず既存の量を動かしているからです。

8.1 対症療法で買えるのは時間だけ

同じ原因が、対症療法の効く道と効かない道の両方へ同時に効くようにします。 全身の菌を例に取ると、 次の経路を並べます。

経路 削るもの 対症療法
発熱・下痢 hydration・satiety を余計に食う 効く。水をがぶ飲みすれば延命できる
敗血症 blood を直接削る 効かない。菌を入れている側を断つ以外に止まらない

書くのは、その菌を抱えている体の側です——pathogen を持つのがキャラクタと動物なので、そこから 先の 2 経路も同じ段(characters/player_character.yaml・animals.yaml)が持ちます。傷は局所の 膿み具合しか持たず、水も血も削りません——膿んだ傷がするのは pathogen を押し上げることだけで (InjurySystem.md 6.3 節)、そこから先に何が起きるかを知りません。

pathogen:
  stages:
    - {name: sterile}
    - {name: latent, min: 0.1}
    # 熱で水が余計に要る。飲めば追いつくので、ここだけなら水で凌げる。
    - name: feverish
      min: 5
      alert: caution
      passives:
        - add: {self: {hydration: -1}}
    # 菌が血へ回れば血漿が循環の外へ漏れ出す。飲んでも循環へは戻らない。
    - name: septicemic
      min: 7
      alert: danger
      passives:
        - add:
            self:
              hydration: -2
              blood: -40

hydration は素で -1/tick 減る(Characters.md)ので、段の削りがそこへ 足されて、feverish より septicemic のほうが水の保ちを大きく縮めます。

敗血症が血を削るのは、辻褄合わせではありません。 敗血症性ショックでは血管が漏れ、血漿が循環の外へ 抜けます。傷口から流れ出るのと、体内で循環から失われるのは同じこと(4 節)なので、外傷と同じ量へ そのまま載ります。そして飲んだ水は漏れを塞がない——渇きは戻るのに血は戻らない、という非対称が そのまま「対症療法では買えないもの」になります。

血が戻る速さは、漏れ出る速さとは桁が違うので(3 節)、重体になってからの対症療法は時間しか 買えず、傷を洗うなり膿を出すなりして原因を断たなければ死ぬ、が値の動きだけで成立します。症状に対処 しても根本解決にならない、というコンセプトはここに宿ります。

なお敗血症は失血の延長なので、新しい死に方ではありません——奪う口が傷口の外か循環の内かの 違いだけで、尽きたときに起きることは同じです。感染は両側に見えます ——膿んでいる場所が傷カードの infection、回った先がステータスエリアの pathogen で、断てるのは 前者だけです(InjurySystem.md 4.1 節)。

8.2 死に方を増やしてよいのは、終わり方と対策の両方が独自のとき

新しい致死性プロパティが正当なのは、独自の終わり方と独自の対策を同時に持ち込むときだけです。 低体温症(熱という別の量、火と衣類という別の対策、凍死という別の終わり)や溺死がそれにあたります。 感染にはどちらも無く、既存の終わり方へ流し込めます。食の偏りも同じで、終わり方は脱水と餓死のまま です(DigestionSystem.md 7 節)——「肉ばかり食べていると死ぬ」に独自の 終わり方は要らず、なぜ水が速く減るのかを遡れるほうが本書の狙いに合います。

「増えて100%で死ぬ」形自体はエンジンで書けます(range.max と on_max に destroy: self)。 避けるのは表現力の問題ではなく、閾値イベントで死ぬこと——加減算の積分で駆動するという全体の原則 (GameElementDefinition.md 2 節)から、そこだけが外れるためです。

8.3 凍死は、4 本目の死に方【確定】

体に残っている熱を warmth として持ち、尽きたら凍死します。 8.2 節の基準を満たす最初の例で、 独自の終わり方(凍死)と独自の対策(火・住まい・衣服)を同時に持ち込みます。水を飲んでも食べても 凌げないので、既存の道へ流し込めません。

出どころ: #656(凍死を足す)

8.4 熱の量と、削り戻しの速さ

8.3節の凍死を数へ落としたもので、覆すのに人間の判断は要りません。

max は 700——深部体温 37℃ から心臓が止まる 25℃ までに失える熱(70kg × 0.83 kcal/kg℃ × 12℃)です。 段の下限は次のとおりで、境目が max の 80%(560)と臨床の入口で一致します。34.6℃ は軽度低体温症の 境目(35℃)とほぼ重なるので、Characters.md の「安全域を外れるのは max の 80%」をそのまま使えます。blood の 20%(3 節)と同じく、臨床の刻みと画面の規約が偶然そこで 一致します。

段 下限 域 深部体温
frozen 0 致命的 25℃。ここで死ぬ
hypothermic 175 危険 28℃。意識が落ちる域
shivering 350 要注意 31℃
chilled 560 留意 34.6℃
warm 700 安全 37℃

比べる相手は、居る場所の ambient_temperature と、自分の chill_point(素は 16℃)で、守る側はそれを modify で下げます(衣服は equipment スロットに入っている間、寝床は nap/sleep が時間を進めている 間)。どちらも同じ境目への寄与なので、着たまま寝れば加算で重なります。

押し下げる深さは、気温の刻みへ端を合わせます。 空の気温は平年の 20℃ に日射と季節が重なるだけなので (ClimateSystem.md 1 節、core.yaml)、空だけで素の 16℃ を下回るのは 涼しい季節の夜と、その薄明・雨天の昼です。その間を割るのは、 土地が持つ海抜ぶんの差(同 1.1 節)で、守る側の 1 段ごとに、ちょうど釣り合う土地があります。 最も深い衣服が海沿いの最も寒い夜とちょうど釣り合うのは、炉の暖(+8)が空の最も寒い夜をちょうど平年へ 戻すのと同じ置き方です(FireSystem.md 9.2 節)——釣り合うだけなので、衣服だけでは山の夜に 届きません(ClimateSystem.md 1.1 節)。そこから上へ伸ばすのは、寝ている間だけ 重なる寝床の分です(Bedding.md 4.2 節)。深さそのものは、衣服が SurvivalItems.md 5.1 節、寝床が Bedding.md 4.2 節です。

削る速さは -2/tick、雨に打たれている間は -6/tick、境目より上に居る間の戻りは +8/tick です。 濡れた一晩で失った熱は、火のそばに居れば時間をかけて戻ります。

9. 画面に出すのは、意識のバーと出血の印

動物のカードに出すバーは意識1本だけです。 意識は痛み・失血・衝撃の合流点(2 節)なので、そのまま 「あと何手か」の統合指標になります。血のバーを並べると、2本のバーが同じ問いに別々の答えを返し、 どちらを見ればよいか分からなくなります。色は段(alert)から引き、しきい値を持つのはワールド側だけ、 という分担を保ちます(CardView.md 8 節)。

出血は量ではなく印で出します(同 9 節の、絵文字ひとつを絵の左下へ重ねる仕組み)。行動を変えるのは 「手当てが要るか」だけで、どれだけ失ったかではありません。量が知りたくなればカードを開けば傷が並びます。

印は血が流れている傷(bleeding が 1 以上)と、それを負っている本人の両方に出ます (CardView.md 9.0 節)。傷のカードは開かないと見えないので、そこだけに出して いると流し見のあいだに失血が進みます。手当て済みの印より優先します——当ててあってもまだ流れて いるなら、伝えるべきは「当ててある」ではなく「止まっていない」のほうです。

プレイヤー自身には新しい見せ方を作りません。 blood も warmth も status タグを付けただけで、 ステータスエリアの既存の規約に乗り、安全域を外れたときだけ行が現れます (StatusArea.md)。健康な間は本数が増えないので、致死性の値が並んでいることが そのまま画面の複雑さにはなりません。死に方を足しても、並ぶ棒が常時 1 本増えるわけではないのは この規約の帰結で、増えるのは「凍えている間だけ現れる 1 行」です。食の偏り(8 節)に至っては、既存の 水と蓄えを速く削るだけなので、新しい行を 1 つも作りません。

動物のカードには既に、警戒(wariness)が安全域を外れている間の輪郭の赤い明滅があります (HuntingSystem.md 3.1 節)。役割は重なりません——明滅が言うのは「気が立っている =放っておくな」、意識のバーが言うのは「弱っている=あと何手か」です。どちらも1手へ効きますが、 反撃してくるかを決めるのは警戒で、意識が決めるのは手を出すか立ち尽くすか(同 5.5 節)—— バーが下がっても、落ち着いていない相手は手を出してきます。

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