生命と意識のシステム設計
概要
何が意識を奪い、何が命を奪うか——気絶する・死ぬをどう表すかと、新しい死因が現れたときにそれを
どこへ流すか(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}
- 段の刻みは
Characters.mdの規約に従い、安全域を外れるのはmaxの80%。 - 致命的域(
fatal)は持ちません。 気絶それ自体は死に至らず、死に至らせるのは血を失わせている側です。 本書が致命的域を置くのは、命を絶つ値であるbloodのexsanguinated(3 節)とwarmthのfrozen(8.3 節)だけです。 painと同じく個体差を持たせません(獣にはbeasttrait が配る。人へ配るときもplayer_charactertrait が配る、7 節)。押し下げる量は傷の側が 宣言するので、同じ傷が誰に刺さっても同じ意味を持つ必要があります。
押し下げるのは、押し下げる側の段です。 寄与は 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
- どれだけ与えるかは武器の性格が決めます。 量そのものは候補が持ち、武器はどの候補を引くかの重みだけを
宣言します(
HuntingSystem.md1.2 節)。5kgのサルは石斧の強打(250)なら一撃、 尖った石の浅打(30)なら何撃も要ります - 階段状に覚めます。
maxを越えた分は捨てられるので、上の例のサルは100から-4/tickで引き、70を 割ればrattled(-30)、30を割れば戻り切ります。当たり所が頭でなくても同じように効きます - 引く速さも
maxに比例させます(max ÷ 25)。しないと、大きい相手ほど殴った端から溜まっていき、 弱い武器でも殴り続ければ倒せることになります。比例させれば、体格に見合わない武器の衝撃は 次の一撃までに引いてしまい、上位の武器が要る理由がそのまま出ます shockはaddだけを受け、consciousnessはmodifyだけを受けます。 1つの量に 両方を掛けると、どちらが今の値を決めているのか読めなくなります- 画面には出しません(
statusタグを付けない)。意識への入力であり、低ければ意識のバーがそう 言っています(9 節) - 脳震盪を怪我のカードとして別に立てません。当たり所によらず衝撃は生じるので、傷の種類の数だけ
意識を奪う傷を用意することになります(
InjurySystem.md4 節)
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}
maxは体格です。 ヒトは体重のおよそ1/13(70kgで5,000mL)で、動物の体重比もほぼ同じ。専用の 戦闘数値ではなく、weight・volumeと並ぶ物理量として読めます。- 段のしきい値は「失った割合」から引きます。 20%までは何も起きず、20〜30%で表に出はじめ、
30〜40%で意識が落ちはじめ、40%を超えると危機——臨床の出血性ショックの分類(ATLS)そのままです。
しきい値を決めるのに「ゲームらしさ」を持ち込む必要がありません。最初の境目が20%なのは、
Characters.mdの「maxの80%で安全域を外れる」と重なるためです ——臨床の刻みと画面の規約が、たまたま同じ位置で一致しました。 - 意識を奪う量は、深い段ほど大きくします。 段の寄与は今居る段のものだけが立つので、最も深い段に 寄与を書き忘れると、瀕死の相手が中等症より意識がはっきりするという裏返りが起きます。
- 血は自分で戻ります(tick で増えます)。速さの非対称が効き目のすべて で、削るのは一瞬(大血管なら数分)なのに戻るのは日の単位——牙の傷1つが 奪う600mLに3.1日かかります(3.3 節)。「気をつけていれば治る」と「一度の失敗が何日も響く」が 同じ1本で両立します。
- 戻るのに条件が付きます(3.1 節)。水と食べ物が足りていない間は戻りません。
- 動物に配るときは
on_minへspawnを並べ、同じ枠での置き換えとして死体を出します (destroyをspawnより先に書く、GameElementDefinition.md9.4節)。 ここが死体になる唯一の道で、仕留めの一撃(HuntingSystem.md1.4 節)も 血を空にすることで合流します。だから死体の名前は動物ごとに1度だけ書けば済みます。
3.1 血が戻るのは、水と食べ物が足りている間だけ【確定】
blood の戻りに、水分と体脂肪のゲートを付けます。 どちらかが安全域を外れている間、血は
戻りません。
- 削る速さと戻る速さの非対称が、さらに開きます(3 節)。深手から戻り切るまでにかかる日数は そのままで、その日数は水と食べ物を切らさずに過ごした日数でなければなりません。深手を負った 後に狩りへ出ず水を汲みに行くのは、そのほうが速く治るからになります。
- 同じ形のまま人にも獣にも配れます。 獣も
hydration・body_fatを持ち、閉じ込められている 間だけ減る(TrapSystem.md5.4 節)ので、人と獣で別々の条件を持たずに済みます。 野生の個体では減らないので、条件は常に満たされます——1 つの宣言のまま、罠の中の獣にだけ効きます。 出どころ: #656(閉じ込めた獣だけが渇く)
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
です。
- 人が 1 つの傷で失う最大は 600mL です(牙の傷。
-150/tickが固まるまで流れた合計。4 節)。戻るのに 3.1 日かかります。槍が残す刺し傷は、人には刺さりません——湧く先は殴られた獣 (src/assets/world-codex/animals.yaml)と、串を打った落とし穴へ落ちた獣 (src/assets/world-codex/traps.yaml)だけです。 - 罠で回す暮らしは、その 3.1 日を持っています。 落とし穴が返すイノシシは
1 日 0.24頭
=4.2 日に 1 頭なので、深手を負っても次の 1 頭が掛かるまでに戻り切ります。足りなくなるのは
立ち合ったとき——イノシシは 4 撃を要し(5 節)、その間の 1 手ごとに牙の傷が残りうるので
(
stats/balance.yamlのsupply、wild_boarのturn)、傷 1 つでは 済みません。 - だから「仕掛けて待つ」と「正面から殴る」の差が、この 1 本の速さに出ます。 罠は時間で払い、 立ち合いは血で払う——どちらも数日ぶんです。戻りを速くすると、その選択ごと消えます。
戻らなくなる境目(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}}
- 止まる仕組みを傷の側に持たせないと、掠り傷でも必ず死にます。
severityの段をゲートにすると、 傷が治りきるまで何日も流れ続けます。血が固まるのは数分、傷が塞がるのは数日で、これらは別の時間 で動きます。 - 勢いは桁で書き分けます。
-15は尖った石で裂けた傷の桁です (潰れた血管は縮んで塞がるので、切れる刃で切った傷ほどは出ません)。槍が残す刺し傷は-250——固まるまでに、400mL のサルは尽き、4,600mL のイノシシでも数突きで 危機に届きます。大血管を切れば-1000の桁で数 tick しか保たず、にじむ程度の擦り傷は-2で実質 何も起きません。同じ1つの量に対するレートの違いだけで、致命傷から掠り傷までが並びます。 - レートは傷が持ち、相手の大きさを知りません。 だから同じ傷が、体格で意味を変えます——固まる までに失う量は、ヒトの5,000mLには響きませんが、サルの400mLでは無視できない割合です。狩る相手が小さいほど 効く、が調整値なしで出ます。
- 治療具の効き方は分かれます。 止血帯(
hemostatic、未実装)はゲートを閉じて止め、包帯はbleedingを余計に引いて固まるのを早めます(失う量は半分になりますが、ゼロにはなりません)。 どちらも「効き目」を持たず、結果は傷の側の宣言から出ます(InjurySystem.md3.1節)。 - 体内に溜まった血も同じ量で表せます。 肝臓や脾臓の破裂は外へ血を出しませんが、循環から失われた 点では外出血と同じです。分けて数える必要はありません。
- 失血が意識を奪う経路は、
bloodの段が持ちます(3 節)。血の量と意識をそれぞれ数える必要はありません。
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 節の基準を満たす最初の例で、
独自の終わり方(凍死)と独自の対策(火・住まい・衣服)を同時に持ち込みます。水を飲んでも食べても
凌げないので、既存の道へ流し込めません。
- 増えて 100% で死ぬ形は採りません(8.2 節)。持つのは残っている熱で、水・脂肪・血と同じ、
減れば死ぬ現実の量です。単位は熱量そのもの(kcal)で、
maxがそのまま体格になるのはbloodと同じです。 - 寒いかどうかは、比較 1 つで決まります。 居る場所の気温と、自分が持つ寒さの境目を比べるだけです。
気温にはあらゆる場所が持つ土地ごとの差と、季節・日射・据えた炉の暖が既に積み上がっています
(
ClimateSystem.md1 節、FireSystem.md9.2 節)。 新しい寒さの概念は要りません。 - 守る側は、境目を押し下げます。 衣服は身につけている間、寝床は寝ている間、境目を下げます。 火だけは境目ではなく気温の側を上げますが、効き方が違うだけで、 合流先は同じ 1 つの比較です。着込むほど寒さの入口が遠のき、焚けばその場が暖まる——という違いが、 どちらを押すかの違いとしてそのまま出ます。
- 雨は速さに効きます。 屋根も蓋も無い所で雨に打たれている間
(
ContainerSystem.md6 節)は、熱を削る速さが上がります。 雨で気温の側を下げる形は採りません——濡れた体から熱が抜けるのは空気の温度の話では ないうえ、気温を動かすと炉の暖も焚き火の値打ちも雨の日だけ別の意味を持ってしまいます。削る側の ブロックを分ければ、濡れることと寒いことが別々のまま 1 つの値へ合流します。 - 戻るのは、境目より上に居る間だけです。血とは逆で、熱は取り返せます——だから凍死は「一度の 失敗が何日も響く」ではなく、「一晩をどう越すか」の死に方になります。
- 死因は
frozenで、名乗るのはon_minのdestroyです(6 節)。既存のものと同じ形なので、 画面は名前から文言を引くだけです。
出どころ: #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 節)——
バーが下がっても、落ち着いていない相手は手を出してきます。
未決事項・今後の検討課題
- 値に比例した効きが書けない。「
severityが重いほど意識が下がる・速く出血する」はmodify/addの量がリテラルのため、段ごとのブロックで階段状に刻む。量の側を豊かにする道は無い (src/domain/PassiveAmount.ts。寄与として登録される量に積を使えるのはエンジンだけで、YAMLが書ける のは定数。輸送は寄与ではないのでlinked_addは積を書けるが、比例の元にしたいseverityを移し元に 据えると、その値自身が毎 tick 出ていってしまううえ、出した分を受け取るプロパティも無い)ので、傷の 種類が増えたときに見るのは、その刻みの粗さで足りるか - 傷ごとの出血レート(4 節)。裂傷の
-15と刺し傷の-250が並んだので桁は決まったが、大血管を 切る傷はまだ無い。血が固まるまでの長さも、今は傷の種類で変えていない shockの配分(2.1 節)は、武器と獲物が並んだ時点の釣り合いで置いてある。倒れた当人に手番が 回らないことは決まった(6 節)ので、残るのは下の「倒れている間に周りが何をするか」——それが 決まれば、覚めるまでの長さを見直すことになる- 感染が上がる速さと、膿んだ傷が全身の菌量を押し上げる量(
InjurySystem.md6.2・6.3 節)。8.1 節の削りはそれらと対で効くので、押し上げ方が仮決めのうちは、こちらの配分 (-1/-2/-40)も仮のまま warmthの配分(8.4 節)——chill_pointの素の 16℃、削る-2/-6、戻る+8。押し下げる側は 衣服も寝床も決まった(SurvivalItems.md5.1 節・Bedding.md4.2 節)が、削り戻しの速さそのものは測り直していない ——素の入口を動かすならこの 3 つを一緒に測ることになる- 熱中症を、凍死と対称の位置に置くか(8.3 節)。灼熱(
ClimateSystem.md4.3 節)は 今のところ天気の値が変わるだけで、暑さで死ぬ道は無い。置くならwarmthの反対側ではなく、 別の「増えるほど悪い」量になる(StatusArea.md8 節) - 倒れたプレイヤーの画面で何 tick 進めるか。倒れている間に周りが何をするか——同じ土地の動物が 襲い続けるのか、興味を失うのか(倒れた当人が何もしないことは 6 節で決まっている)