耐久値システム設計

概要

本ドキュメントは、単一の durability プロパティで、素材の屋外劣化(天候)と食料の腐敗(保存温度)の両方を 表すときの、具体的な減少量(add の量)をまとめたものです。両者は同じ durability を減らす 独立した add として扱い、対象条件が同時に満たされれば加算的に重なります(GameElementDefinition.md 8.4 節)。1 tick(15分)というこのゲーム固有の対応づけ(core.yaml)を前提とします。

実際のレートは各定義の add が持ち、本書はその目安の出所です。素材の屋外劣化(2 節)も食料の腐敗 (3 節)も投入済みで、前者は src/assets/world-codex/weathering.yaml の trait、後者は foods.yaml の trait が配ります。罠(traps.yaml)はどちらの trait も名乗りません——傷むのは 仕掛けている間で、もがかれた量が乗る別の軸(TrapSystem.md 6.1 節)だからです。 それでも上限は同じです(1 節)。

本ドキュメントは検討結果であり、確定仕様書ではありません。未決事項は 5 節に整理しています。

1. スケールの規約

durability の最大値は、素材・アイテムの種類によらず 960 に統一します。基準レートを「短命な素材が すり減る速さ」(-1/tick)に置いた値で、短命な素材の寿命(10 日)にあたります (GameElementDefinition.md 6.0 節の時間を数えるクラス)。

この規約のもとでは、次の式で「寿命 L 日」を実現する tick あたりの減少量が決まります。

tick あたりの減少量 = 10 ÷ L(寿命の日数)

(960 ÷ 96 tick/日 = 10 が、この規約における「1日あたりの基準単位」。基準より長持ちする素材は 小数のレートになります)

素材の trait(2 節)を名乗らない物も、この規約の内側です。 食べ物(foods.yaml)も罠 (traps.yaml)も 960 から始まり、違うのは減らす軸と速さだけです——落とし穴が空のまま 30 日もつのは 上限を積んだからではなく、-0.3333(上の式へその日数を入れて丸めた値)で減るからです。長持ちを上限で作ると、同じレートが 物ごとに違う日数を意味することになり、上の式が読めなくなります。

同梱の定義がこの上限を破ると tests/world-codex/durabilitySystem.test.ts が落ちます——durability を持つ型を全部見て、上限が 960 でない宣言を名指しします。

2. 素材の屋外劣化速度(天候)

晴れの列は「寿命(tickあたりの減少量)」、雨の列は晴れのぶんに雨の上乗せが重なった寿命だけを書きます。寿命は代表の物(長持ちは石の斧、短命は編んだ葉)の stats/durations.yaml の値です。

分類 素材 晴れ 雨
傷まない素材 石材・金属 — —
長持ちする素材 木材・なめし革・獣骨・綯った紐 100日(-0.1) 20日
短命な素材 葉・草・植物繊維・生皮 10日(-1) 5日

石材・金属は時間では1も減りません。 石は雨で痩せるのではなく、打ち合わせて欠けます——減らすのは 使った側(animals.yaml の instrument)だけで、置いておくだけの日数には現れません。それでも 分類の1つとして持つのは、耐久値そのものをどこから受け取るかを物ごとに分けないためです。

屋根も蓋も無い所に在る間だけ減ります(sheltered、ContainerSystem.md 6 節)。しまい込めば止まるので、守られた場所へ置くことに値打ちが出ます。今その場所は浅い洞窟だけ です——sheltered を名乗っているのは locations.yaml の岩屋根1つで、蓋つきの入れ物は同じ口に乗る はずですが、物としてはまだありません(../world/Containers.md 2節)。 雨のぶんは晴れのぶんと加算的に重なる別の add として書きます (GameElementDefinition.md 8.4 節)——晴れの行を打ち消して 書き直すのではないので、行が増えても晴れの側は1箇所のままです。

どの分類を名乗るかは、その物の形の大半を占める素材で決まります。 石斧は頭部が石ですが、目方の 大半は柄の太い枝なので長持ちする素材です——柄付けの紐が緩んでも縛り直せば済み、作り直しになるのは 柄が朽ちたときだからです。どの物がどれを名乗るかは tests/world-codex/weatheringYaml.test.ts の表が 見張ります。

同じ素材でも、綯った先・なめした先は長持ちする側です。 生皮となめし革が別の行に居るのと同じ 理由で、繊維も綯えば移ります——1本の繊維は傷めば終わりですが、何十本を綯った紐は表面が傷んでも 残りが担うので、使えなくなるまでの日数が桁で変わります。ハンモック(bedding.yaml の hammock)が紐だけでできていながら長持ちする素材なのはこのためです。

名乗るのは、手に持って使う物・身につける物・入れ物・寝床と、積んである短命な素材(繊維・編んだ葉) です(2.2 節)。丸太の在庫と、据えた大物(筏・炉・畑)は名乗りません。畑はまだ決めていません (5 節)。

2.1 尽きた道具は残らないので、線はその仕事が食う量の手前に引く

durability が 0 へ届いた物は消えます(weathering.yaml の on_min)。「余力0の斧」という札は 在れないので、道具の余力を見る条件(too_worn)を gt: 0 と書くと、一度も成立しない条件に なります。

線を引くのは、その道具にもっと安く済む使い道が残っている工程だけです。 石斧のように1本で何通りにも 使える道具では、高くつく使い道(倒す・玉切る)に線が在ります。いちばん安い使い道には引きません ——引くと、何にも使えないのに消えもしない札が盤面に残り、この節の冒頭(「余力0の斧は在れない」)を 自分で破ることになります。獣への一撃(animals.yaml の strike)はどの武器にとっても最も安い使い道 なので、余力が一撃ぶんに満たない槍でも殴れます。

使ったぶんの摩耗で、その工程の成果が消えることはありません。 摩耗は効果の一部で、効果はかかる 時間を進めきってから一度に入る(InteractionDef.tryExecute)ので、刃が折れるのは一撃が当たった後・ 木が倒れた後です。線が守るのは、その工程の成果ではなく、その道具に残っていた安い使い道のほう です。(時間で朽ちる側は別です——経過中に参加者が世界から消えれば、その操作は成立しなかったものと して打ち切られます。src/domain/actionTime.ts)

線はその工程が食う量と同じところへ引きます。 流木の玉切りは1回30を食うので gte: 30 (timber.yaml)。どの手に引けるかは下のとおりです。

刃を食うのは、物を返す手だけです。 進みや腕しか返さない手——1つの仕事が何回かの手に分かれた とき(1回の行動は1時間を超えられない、ActionSystem.md 6.3節)の、途中の手 ——は刃を食わず、そこへ引く線は仕事1つぶんになります。立ち木は受け口を刻む間は刃を食わず、断ち切る 1回が120をまとめて食う——刻む手にも120の線が在るので、倒し切れない斧では刻み始められません。流木の 玉切りは1回ごとに丸太が1本返るので、手ごとに30を食い、線も30です。

線を問えるのは、断っても何も取り残さない手だけです。 余力は待つ間にも減る(2 節)ので、線が言える のは「今この手を始められるか」までで、後の手が成り立つことは約束できません。 何も返さない手を挟んだ 先で線を引き直すと、そこまでに払った時間が相手に取り残されたまま断られます——受け口だけの幹が残り、 そこまでの手間が丸太に変わらないまま消えます。だから立ち木の余力を見るのは、まだ刃を入れていない木に 対してだけで(timber.yaml の chop が trunk_integrity の初期値と一緒に見る枝)、刻み始めた木を 倒す一撃は余力を見ません。流木の玉切りは、手ごとに問います——1回ごとに丸太が1本返るので、次の手を 断っても取り残すものがありません。

こうすると次が同時に成り立ちます。

刃を食う手がどれも物を返すことも、何も返さない手を挟んだ先で線が断る側へ回らないことも、 tests/world-codex/durabilitySystem.test.ts が同梱の定義すべてに当てます——型を1つも名指しせず、線をどう書いたかも見ません。 進みの値ごとに 「余力が届いていなければ断るか」を引き比べるので、条件を分けても any で包んでも、取り残しの起きる 値が1つでもあれば、その値を名指して落ちます。 立ち木が実際に倒し切れることは tests/world-codex/timberYaml.test.ts が見張ります——ちょうど1本ぶんの斧で最後まで打つので、線を 引き直せば途中で断られて落ちます。

どの道具についても線の引き方が上のとおりであることは tests/world-codex/durabilitySystem.test.ts が見張ります——道具ごとに使い道を食う量の順に並べ、いちばん安いものに線が無いこと・それより高い もの(始まっている仕事の続きを除く)に食う量ちょうどの線が在ることを当てるので、一撃に線を足しても、 玉切りから線を外しても落ちます。 余力の足りない武器で実際に殴れて、当たってから折れることは tests/world-codex/animalsYaml.test.ts が確かめます。

2.2 積んだ短命な素材は傷み、年単位で保つ物は傷まない【確定】

繊維・編んだ葉のような短命な素材は、積んであるだけでも屋外で傷みます。 積んだ分が同時に減るので、 屋根のある置き場ができるまでは溜め込めません。積んである素材と据えた大物のうち、現実で傷むのに 年単位でかかるものは傷ませません——丸太と筏は、屋外に置いたままでも傷みません。

積んだ繊維・編んだ葉が屋外でだけ揃って傷み、丸太と筏が傷まないことは tests/world-codex/weatheringYaml.test.ts が確かめます。

出どころ: #2404(積んだ繊維・編んだ葉は傷み、筏・丸太は傷まない。2026-09-29に回答)

3. 食料の腐敗速度(保存温度・屋外放置)

食料の屋外劣化速度は、すべて「短命な素材(葉っぱなど)」と同じ(晴れ-1/tick)を前提とします。「屋外(晴れ)+ 通常温度」の列は、腐敗(保存温度由来)と屋外劣化の両方の add が同時に対象となり加算的に重なった場合 (GameElementDefinition.md 8.4 節)の複合寿命です。屋内保管(通常温度・保冷)よりも必ず短くなり、「屋外に置きっぱなしにすると腐敗が早まる」 という直感と整合します。通常温度の列は「寿命(tickあたりの減少量)」、屋外の列は両方が重なった寿命だけを書きます。寿命は代表の物(生肉・バナナ・タロイモ)の stats/durations.yaml の値です。保冷の列は、通常温度の減少量を半分に置いた目安です。

分類 通常温度 保冷 屋外(晴れ)+通常温度
調理済み料理・生魚など 2.5日(-4) 5日(-2) 2日
野菜など 5日(-2) 10日(-1) 3.3日
芋など 20日(-0.5) 40日(-0.25) 6.7日

入っているのは「通常温度」と「屋外(晴れ)」の2列だけです。保冷の列は投入していません——涼しい 置き場(穴・洞窟の奥)がまだ無く、置き場の側から作ることになるためです。

レートは src/assets/world-codex/foods.yaml の trait が持ちます。分類の違いは通常温度で減る速さ 1つだけなので、そこだけを spoils_fast/spoils_normal/spoils_slow に分け、durability 本体と屋外の上乗せ(分類によらず -1)は perishable が持ちます。食べ物は両方を名乗ります (traits: [perishable, spoils_fast])。屋外かどうかを見るのは sheltered(0/1)1つで、蓋つきの 入れ物・浅い洞窟に入れれば上乗せだけが止まります(ContainerSystem.md 6 節)。

4. 所感

1プレイ100〜200日という前提に対し、種類間の相対的な序列(芋 > 野菜 > 調理済み料理・生魚)が一貫しており、 現実の食材の性質とも大きくは矛盾しません。

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