火システム設計
概要
炉を組み、燃料をくべ、火を保ち、その熱を他の物へ渡す仕組みの設計ドキュメントです。「どんな加熱方法が どう組み立てられ、何に使えるか」までを決めます。
個別の料理レシピは決めません。 料理の大半は、既存の recipes(RecipeSystem.md)で
未加熱の物を組み立て、最後に火で加熱して完成します。本書が決めるのはその最後の一手の受け渡し口
(7 節)だけで、何と何を組み合わせると何になるかは扱いません。火起こし具・燃料になる物の一覧は
SurvivalItems.md、火スキルの段は Skills.md が持ちます。
天気・気温は ClimateSystem.md が、雨から守る sheltered は
ContainerSystem.md 6 節が持ちます。
新設する文法はありません。 火は炉のプロパティ(1 節)、くべる操作は transfer(2 節)、火の育ちと
衰え・燃焼・加熱は add(2.2 節・7 節)、炉の段上げは on_max(5 節)で、いずれも
GameElementDefinition.md の既存語彙です。本書が導入するのは語彙の名前
だけです。
| 種別 | 名前 |
|---|---|
| タグ | hearth(炉)・fuel(燃料)・tinder(火口)・lightable(炎を受け取りも渡しもする明かり)・roastable(直火に入れられる物)・cookware(火にかける器)・firewood(割った薪。生木も乾いたものも) |
| スロット | fire(火にかけているもの)・woodpile(薪棚に積んである薪) |
| プロパティ | fuel(くべた薪。燃料の側では「くべると増える量」)・heat(火力。一番下の段が種火)・lit(明かりが灯っているか)・stones(積んだ石)・heat_soak(石の蓄熱。湯の側では残っている熱)・cooking_progress(加熱の進み)・moisture(火口が吸った水。名前は素焼き前の壺(pottery.yaml)と共有します)・seasoning_remaining(割った薪が乾き切るまでの残り) |
| 型 | campfire(焚き火)・three_stone_hearth(三石のかまど)・stone_hearth(石囲いの炉)・fire_drill(火起こし具)・burning_tinder(火種)・hot_stone(焼け石)・hot_water_liquid(湯)・green_firewood(割ったばかりの薪)・seasoned_firewood(乾いた薪)・firewood_rack(薪棚) |
定義は src/assets/world-codex/fire.yaml と、薪の3型が firewood.yaml(2.5 節)です。上の表のタグが1つ
増えるだけの物は、その物が元から定義されているファイルの側にあります——産する土地・草木・生き物の定義に
タグが付くので、在り処は上の表のタグと型の名前で引きます。検証は
tests/world-codex/fireYaml.test.ts と tests/world-codex/firewoodYaml.test.ts です。
本ドキュメントは検討結果であり、確定仕様書ではありません。【未実装】 の印が付いた節を除いて、本書の設計は実装済みです。数値は
いずれも目安で、1 tick(15 分)(DurabilitySystem.md 1 節)を
前提とします。未決事項は 11 節に整理しています。
1. 火は炉のプロパティで、「火」という物は作らない
燃えていることは炉のプロパティで表し、火そのものを表すオブジェクトは置きません。 単独では存在
できない物は、抱えている側のプロパティにするのが既定です——液体が容器の変種になっている
(LiquidContainerSystem.md 1 節)のと同じで、火は炉から取り出せず、
分けられず、別の炉へ移せません。独立させても得るものがなく、カードが 1 枚増えるだけです。
炉は hearth タグを持つ設置物(fixture)で、スロットは fire(火にかけているもの)1 つだけです。
直火で焼く物も、焼く石も、火にかけた器も、すべてここへ入ります(枠が受け入れる型は 1.1 節)。
燃料はここへ入りません。 くべた薪は物として炉の中に居続けるのではなく、fuel(くべた薪の量)へ
溶けて消えます(2 節)。
1.1 器の場所は、スロットではなく枠で分ける
器を置ける炉と置けない炉の差は、cells(GameElementDefinition.md 7.2 節)の並びが持ちます。
# 三石のかまど
slots:
fire:
cells:
- {accept: {tag: roastable}} # 火の中。直火で焼く物・焼く石
- {accept: {tag: roastable}}
- {accept: {tag: cookware}} # 石の上。器だけが載る
焚き火はこの最後の枠を持たず、石囲いの炉は 2 つ持ちます(6 節)。器を支えているのが炎ではなく石だと
いうことは、枠があるかどうかで表せます。枠は宣言順ではなく型の合う枠へ埋まる
(SlotSystem.md 2 節)ので、
焼く物を重ねれば火の中へ、器を重ねれば石の上へ、条件を書かずに入ります。
どの枠がどちらなのかは、空いているうちに枠自身が名乗ります——空き枠へその枠が受け入れる型の
カードを薄く敷く仕組み(CardView.md 11 節)は枠によって受け入れの宣言が
違うスロットで働くので、器を載せる枠を持つ炉だけがこれを出します。器を載せる枠を持たない炉は
どの枠も同じものを受けるので、名乗っても並びが既に言っていることの繰り返しにしかなりません。
石の上の枠は、今は紙のままです——cookware を名乗る型が世界にまだ無く(煮炊きのレシピは 11 節の
未決事項)、敷く絵が無いためです。型が入れば、条件を書き足さずにそのまま出ます。
火の中の枠は roastable を持つ型だけを受け入れます。 持ち物なら何でも投げ込める枠にすると、
炉が「物を捨てる場所」になり、火にかけたものだけが持つはずの cooking_progress(7 節)と枠の意味が
噛み合いません。持つのは丸焼きの鎖(生肉 → 焼けた肉 → 焦げた塊、ネズミの死体 → 丸焼き、
タロイモ・ヤシガニ → 焼いたもの → 焦げた塊)で、鎖の終わりの焦げた塊も、置き換わった先が火の中の
枠に残れるように持ちます(GameElementDefinition.md 7.2 節)。焼け石(9 節)を実装するときは、石が
このタグを得ます。
この鎖は「焼くとおいしい」ではなく「焼かないと食べられない」も表します。 タロイモとヤシガニは
生では食べ物のタグを持たず、焼いて初めて食べられます(src/assets/world-codex/foods.yaml)。
生でも食べられる肉と同じ仕組みに乗るのは、違いが生の側が eat を持つかどうかの 1 点だけだからです。
スロットを 2 つに分けないのは、分けると炉の中身が一度に見えなくなるためです。外から見えると
名乗ったスロットは子ウィンドウのタブになる(GameElementDefinition.md 7.11 節、
Windows.md 1.2 節)ので、2 つ目を足せば火の中と石の上が別のタブへ分かれます。
どちらの枠の物も同じ火から熱を受け続けている(7 節)のに、見えるのは開いているほうのタブだけです
——石の上を覗いている間も火の中の物は進み、目を離せば焦げます(7.2 節)。枠なら 1 つの並びのままで、
受け入れの違いだけが残ります。
炉ごとの差も、枠なら cells の並び 1 つに収まります(6 節の表)。分けると、器を載せられるかは
「スロットを持つか」、いくつ載るかは「枠がいくつか」と、1 本の梯子が 2 つの軸に散ります。
2. 燃料は数える物で、くべると炉の fuel へ溶ける
燃料は塊で数える物です。 小枝も薪も、粘土や石と同じように 1 個・2 個で存在し、量として分割は
しません(中身入りの容器とは違う扱い。LiquidContainerSystem.md 1 節)。
炉へくべると、その物が持つ fuel が炉の fuel へ移り、燃料そのものは残らず消えます。
# 炉の側が宣言する
interactions:
add_fuel:
# 束ねた薪はまとめてくべられる(GameElementDefinition.md 12.4節)
trigger: {drag: {tag: fuel}, allow_multiple: true}
transfer:
# 入るだけ入れる
amount: 999
from: instrument
from_prop: fuel
to_prop: fuel
allow_overflow: true # 入り切らない端数は切り捨てる(GameElementDefinition.md 9.5.1節)
destroy: instrument # くべた薪は物として残らない
何本くべられるかは書きません。 移送先の fuel は range を持つので、その残りから決まります
(同 12.4 節)。上限は range が既に言っているので、束から何本入るかを条件で数え直す必要は
ありません。
満杯を拒む条件だけは書きます。 残りが 0 なら組み合わせは候補にならないので、拒むだけなら容量で
足ります。それでも書くのは、断る理由(reason)を届けるためです——容量で落ちた組み合わせは
落とし先として残らないため、プレイヤーには「重ねても何も起きない」としか見えません
(CardInteraction.md 2.1 節)。罠の餌・囲いの飼葉と同じ形です。
薪の上限は炉ごとに違うので、この条件を持つのは hearth trait ではなく炉の側です。trait が配った
add_fuel へ conditions だけを重ねると、残りは trait 側を引き継ぎます
(GameElementDefinition.md 5 節)。
# 炉ごとが足す(値はその炉のfuelのrange.max)
interactions:
add_fuel:
conditions:
- {reason: hearth_full, prop: fuel, lt: 30} # 三つ石の炉も30<!-- codex: fire.yaml object_defs.three_stone_hearth.interactions.add_fuel.conditions.0.lt -->
# 燃料の側が宣言する
props:
fuel:
# 太い枝1本ぶん
value: 20
transfer(GameElementDefinition.md 9.5 節)を使うのは、add だと炉の種類 × 燃料の種類の数だけ
固定値を書くことになるためです。移す量は燃料の側が 1 箇所で持ち、炉はそれを受けるだけになります。
destroy: instrument を併記して、中途半端に残った薪を作りません。 効果は書いた順に適用される
(GameElementDefinition.md 9.7 節)ので、transfer の後に destroy を書いて、移した後に消します。
これを書かないと「燃料としては僅かしか残っていないが、他の用途には普通に 1 個として使える枝」という
説明のつかない物が生まれます。
入り切らなかった分は切り捨てます(GameElementDefinition.md 9.5.1 節で確定した規則。理由と、
allow_overflow: true として名乗ることは同 9.5.1・9.5.2 節)。捨てるのは高々 1 個ぶんで、それは
1 個も入らない炉では操作が成立しないという規則(同 12.4 節)が保証します——上の満杯を拒む条件が
担っているのは、断る理由を届けることだけです。
2.1 燃料を枠へ置かない理由
くべた薪を fire の枠に置き続ける形も書けますが、採りません。
- 1 つの枠には同じ型しか積めない(枠は 1 つのスタックを持ち、スタックは同種だけを束ねます。
SlotSystem.md1 節・5 節)ので、枠の数がそのまま同時に燃やせる燃料の種類数に なります。小枝と太い枝と皮を一緒にくべる、という当たり前のことが枠の都合で縛られます。 - 燃えている炉から薪を取り出せてしまいます。 半分燃えた薪も型は同じままなので、見た目に区別が つかないうえ、炉から出した瞬間に燃えるのが止まります。
- 枠が燃料に食われます。
fireの枠は焼く物と焼く石のためのもので、薪が入ると小さい炉ほど 何も焼けなくなります。
炉のプロパティへ溶かせば、どれも消えます。くべた薪は炉の中に「在る」ものではなく、火が「食べて しまった」ものだからです。
2.2 火力は、薪を食って育ち、薪が尽きると衰える
炉が持つ数は fuel(薪)と heat(火力)だけで、どちらも add で動く実体値です。
modify は使いません——火は「今の状態から計算される値」ではなく、育ったり衰えたりする量だからです
(ClimateSystem.md 1 節の数値積分と同じ考え方)。
- 薪があれば、火力は育つ。 ただし
heatが種火の段(3 節)以上にあるとき、つまり火がついているときだけです。 - 火力が高いほど、薪を速く食う。 薪が尽きれば、その火力に応じた速さで衰えていく。
# 炉のfuelのstagesが宣言する(薪が火を育てる)
- name: some
min: 10
passives:
- conditions:
# 消えている炉は、薪を積んでも育たない
- {prop: heat, in_stage_or_above: ember}
add:
self:
heat: 6
# 炉のheatのstagesが宣言する(火が薪を食い、薪が尽きたら衰える)
- name: flame
min: 20
passives:
- add:
self: {fuel: -1.5}
# 「尽きた」は0のこと
- conditions: [{prop: fuel, eq: 0}]
add:
self: {heat: -6}
fuel(薪) |
段 | 火力の育ち |
|---|---|---|
| 0 | none |
育たず、衰えていく |
| 0 より上、1 未満 | none |
育たないが、衰えもしない |
| 1〜9 | few |
+2/tick |
| 10〜39 | some |
+6/tick |
| 40〜 | many |
+16/tick |
「薪が尽きた」は fuel が 0 のことで、段 none のことではありません。 くべる量は整数(2.3 節の
表)、減る量は火力ごとの小数なので、0 と 1 の間は必ず通ります。そこを尽きた扱いにすると、薪が
残っているのに火が衰える区間ができます。衰えを呼ぶ条件は段ではなく fuel: 0 を見ます。
その区間では育ちもしません。 燃え残りはあっても、火を大きくするには塊 1 つぶんが要るからです。 育ちも衰えもしない区間になりますが、下の打ち消しは起きません——育ちは 1 以上、衰えは 0 ちょうどで、 重なりません。
育ちと衰えは同時に効かせません。 add は登録順に値を書き換えながら適用されるため、同じ
tick に正負が混ざると、段の境目で「育って次の段へ入り、その段の冷めを即座に払って戻る」が起きて、
火がそこから育たなくなります。育ちは薪がある間、衰えは薪が尽きている間だけにして、打ち消しを断ちます。
この打ち消しは段を細かく刻めば狙った高さの平衡点にもできますが、火には平衡が要りません
(DesignNotes.md tick毎のaddの平衡点節)。
火の大きさを決めるのは、上限と時間の競争です。 薪があるかぎり火力はその炉の上限(heat の
range.max、6 節)まで上がりますが、上がるより先に薪が尽きれば、そこまでしか大きくなりません。
小枝 1 本では熾火のうちに燃え尽き、太い枝を並べて初めて炎になります。上限の中でどこへ届くかは、
別の宣言ではなく薪の量と時間が決めます。
薪を組んだだけの炉は heat が 0 のままです。 育ちが「火がついている」でゲートされているので、
積んだ薪は減りも育ちもせず、着火(3.1 節)した瞬間から食われ始めます。
2.3 火力の段
heat は段(stages、GameElementDefinition.md 6.4 節)を持ち、段が加熱の速さ・薪の減り・薪が尽きた後の衰えを決めます。数値の
境目を条件の側にも書くと、境目が 2 箇所に散るためです。
| 段 | heat |
状態 | 加熱の速さ | fuel の減り |
薪が尽きた後の衰え |
|---|---|---|---|---|---|
out |
0 | 消えている | — | — | — |
ember |
1〜4 | 種火 | できない | -0.1/tick | 炉ごと(3 節) |
coals |
5〜19 | 熾火 | 1/tick | -0.5/tick | -2/tick |
flame |
20〜59 | 炎 | 3/tick | -1.5/tick | -6/tick |
blaze |
60〜 | 高温 | 5/tick | -4/tick | -6/tick |
焼く・煮るに段の下限は設けません。 熾火の上でも湯は沸きます——むしろ煮炊きは熾火のほうが安定
するので、鍋を炎に載せる必要はありません。炎が速いだけで、できることが増えるわけではないためです。
段を下限として要求するものは1つもありません。 土器の焼成(src/assets/world-codex/pottery.yaml)も
下限を持たず、熾火からでも進みます——覆い焼きの炉が blaze まで上がるので、結果として速く焼き上がる
だけです。焼き上がりが成功するかは、heat ではなく焼かれる側が持つ水の残りが決めます——濡れた器を
炎に入れれば割れますが、それは炉が拒むのではなく、器の側の賭けに負けるということです。昇温の途中も
進むことは、現実の「あぶり焚き」(水を抜きながら焼く)にあたります。
燃料 1 つが持つ fuel の目安は次のとおりです。1 つあたりで見るのは、炉が受ける量がこの単位だから
——目方あたりに何が出るか(木の燃料の物差し)は 2.5 節が持ちます。
| 燃料 | fuel |
|---|---|
| 小枝 | 3 |
| ヤシの実の皮 | 2 |
| 太い枝 | 20 |
fuel と heat の上限はどちらも炉が持ちます(6 節)。焚き火にどれだけ薪を積んでも blaze に
届かないのは、開いた焚き火の火力がそこで頭打ちになるからで、段の側に別の禁止を書く必要はありません。
2.4 くべるのに時間は課さない
add_fuel は duration を持ちません。 火の番は毎日何度も来る操作なので、ここへ課した
時間はそのままプレイヤーの 1 日から引かれる定額になります。課せる最小の長さが 1 tick(15 分)
——行動の長さは tick の格子に乗る(ActionSystem.md 6.2 節)ので、それより短い
定額は置けません。0 分にしてよいのは、繰り返しても得をしない操作だけ(同節)で、くべ足しは炉の
fuel の上限が 2 回目以降を止めます。
満タンの薪が保つのは、最も忙しい炉で 5 時間。くべ直すのは 1 日に 4.8 回です
(tests/diagnostics/fireTendingPace.test.ts が、薪の上限を段ごとの減りで割って数え、この 2 つを
突き合わせます)。最も忙しいのは焚き火と三石のかまどを炎で焚いたときで、火力の上限が炎までしか
なく、そのわりに薪を積めないからです。薪を多く積める石囲いの炉は、最も火力を上げてもこれより
間遠になります。
ここへ 1 tick を課すと、火の番だけで、くべ直す回数ぶんの tick が毎日引かれます。生存の採取に要る 1 日
189 分(ContentSkeleton.md
8.2 節)へ、判断を伴わない同じ操作が、その何割にもなる時間を上乗せすることになります。束ねた薪はまとめて
くべられる(2 節の allow_multiple)ので、回数のほうは既に絞り切っています。
取り出しは起こりません。 くべた薪は炉の fuel へ溶けて物として残らない(2 節)ので、燃料について
決めるのは投入だけです。枠へ入れるのにかかる時間(put_in、GameElementDefinition.md 7.10 節)は
枠を通る物——直火で焼く物と器——への宣言で、燃料はそもそも枠を通りません。
2.5 薪は割って乾かすと、木から取り出せる上限まで届く
燃料の率は目方あたりで見ます。 木から取り出せるのは、いちばん良くて 20 fuel/kg——拾った太い枝
(1kg で fuel 20、locations.yaml)と若木の棒(600g で 12、timber.yaml)がこの率です。その半分に
留まる物もあり、理由はどちらも「燃え切らない」です——細すぎる小枝(300g で 3)は一気に燃えて熱を
渡しきる前に終わり、伐ったばかりの丸太(20kg で 200)は水を含んだうえ、丸太のままでは空気が回りません。
割って乾かすと、丸太の側の半分が埋まります。 丸太 1 本は 10 本の割り薪になり(timber.yaml の log
の split)、薪棚に積んで乾き切ると水が抜けて目方が落ち、1 本の fuel は 20
から 30 へ上がります(firewood.yaml)。目方あたりの熱は、上限の率を超えません(tests/world-codex/firewoodYaml.test.ts)。
割るだけでは熱は増えません。 増えるのは形のほうです——炉に入り切ること(火を焚く炉の fuel の
上限は丸太 1 本の 200 を下回るので、丸太をくべると入りきらない分が失われます。2 節・6 節。乾いた薪 1 本の
30 は、いちばん小さい焚き火の上限にもそのまま入ります。受け切れるのは土器を焼く覆い焼きの炉だけで、
そこは土器しか載りません)と、乾かせること(丸太のままでは中まで乾きません)。
乾かすのは棚だけの仕事です。 薪は乾き切るまでの残り(seasoning_remaining)を持つだけで自分では
進まず、棚が積んである薪を 1 tick に 1 つ進めます——炉が火にかけた物を進めるのと同じ向き(7 節)です。
天気も時刻も見ません——屋根が雨を防ぎ、台が地面から離して風を通すので、日差しの当たった tick を
数える干し場(drying.yaml)とはそこが違います。乾き切るのは 576 tickで、現実の 3〜4 週を
4 分の 1 へ縮めた長さです(../concept/DesignPrinciples.md の
「長くかかるものだけ、現実の 4 分の 1 へ縮める」節。tests/world-codex/firewoodYaml.test.ts が見ます)。
燃料 1 点あたりの手間は、割った時点で既に枝より安くなっています。 太い枝は 25.1 分で
20、割り薪は 23.2 分で同じ 20
——枝の線を跨いでいるのは split のほうで、割るのに要るのは既に持っている斧だけです。棚が買うのは
その先で、同じ 23.2 分のまま
燃料が 20 から 30 へ上がるので、1 点あたりの手間はそのぶん落ちます。火の系統の山がこれです
(../world/ContentSkeleton.md 4 節)。
棚 1 基(1.20 日)の元が取れるのは、乾いた薪で
浮いた手間が棚を建てた手間に並んだところです。山が支出を安くする手段だと言えるのはそこからで、
1 周回(約 117 日)のうちに
棚を何度も回せば届きます。率と安さは tests/world-codex/firewoodYaml.test.ts が見張ります。
3. 種火は、火力の一番下の段
種火を別のプロパティにはしません。 heat の ember の段(1〜4)がそれです。料理には使えないが、
薪をくべれば育つ火力——種火とはそういうものだからです。
heat |
意味 |
|---|---|
1 未満(out) |
死んでいる。薪を足しても何も起きず、着火が要る |
1〜4(ember) |
種火。料理はできないが、薪を足せば育つ |
| 5 以上 | 料理ができる |
「料理ができるほど熱い」なら「再着火が要らない」のは自明です。 これらを別のプロパティで持つと、 この当たり前の含意を守るために両者を同期させ続けることになります。1 本の数直線の上下として持てば、 含意は順序そのものになって守る必要が消えます。
生きているかも、この段で見ます。 火を育てる・明かりと暖を出す・着火を断る・明かりへ火を分ける
——どれも heat が ember 以上にあるかを条件にし、0 より大きいかは見ません。種火の衰えは炉ごとに小数
(6 節)なので、段を割っても 0 に着くまで端数が残り、0 を境にすると、絵は消えているのに明かりを
出し続け、着火も断る炉ができるためです。見張るのは tests/world-codex/fireYaml.test.ts。
ember の段だけ、冷める速さが炉ごとに違います。 灰をかぶって空気を絞られた火がどれだけもつかが、
炉の差そのものだからです(6 節)。
heat の上限をこの段の中に置いた炉もあります。 燻し小屋(6 節)は上限が 4 なので、薪を満たしても
種火のままで、料理ができる段へは出られません。表の「薪を足せば育つ」はそのまま効きます——育つ先が
その炉の上限で止まるだけで、段の意味が炉によって変わるわけではありません。
# 焚き火の側が宣言する。段のpassivesではなく炉のpassivesに置くのは、traitが配るstagesを
# 炉ごとに部分的に差し替えられないため。
passives:
- conditions:
- {prop: heat, in_stage: ember}
# 薪が残っていれば、火は衰えない(2.2節)
- {prop: fuel, eq: 0}
add:
# 熾火の段を数 tick で通り抜けて死ぬ。石囲いの炉は-0.03125<!-- codex: fire.yaml object_defs.stone_hearth.passives.0.add.self.heat -->でゆっくり衰える
self: {heat: -2}
種火が残っているあいだに薪を足せば、道具なしで火が戻ります。 火起こし具を使わずに済むことが、 炉を常設する唯一にして最大の利得です。焚き火が「使い捨て」なのは組み方のせいではなく、種火が短時間で 死ぬからで、石で囲った炉が常設になるのは種火が翌朝まで生きるからです。
画面にもこの形がそのまま出ます。 fuel は「あとどれだけ燃え続けられるか」なのでバー
(gauge タグ、CardView.md 8.1 節)、heat は「今この炉で何ができるか」なので
シンボル 1 つです。種火と熾火が排他なのは、同じ数直線の隣り合う段だからで、画面側に排他の規則を書く
必要はありません。
3.1 着火は、火種を炉へ運ぶ
火起こしと着火を分けます。 火起こし具(fire_drill)を火口(tinder)へ重ねて火をつけ、できた
火種(burning_tinder)を炉へ重ねると、炉に種火が立ちます。
火種と種火は別のものです。 火種は持ち運べる物(burning_tinder)で、炉へ運ぶために存在します。
種火は炉に残る最小の火力(heat の ember の段、3 節)で、物ではありません。火種を炉へ落とすことは、
運んできた火を炉の種火へ置き換える操作です。
# 火口の側が宣言する。成功の重みは火口ごとの素の値に起こす人の腕を積み、火口の湿りが
# 押し下げたもの(10 節・3.2.1 節)で、天気は可否を決める(3.1.1 節)
interactions:
light:
trigger: {drag: {object: fire_drill}}
duration: 30
conditions:
- reason: raining
not:
all:
- {subject: ancestor, prop: sheltered, eq: 0}
- {subject: ancestor, prop: weather, in: [light_rain, heavy_rain, storm]}
pick:
# ignition_chanceは火口ごとの素の値に、起こす人の腕を base で積み、湿りの段が
# modify で押し下げたもの(10 節・3.2.1 節)
- weight: {prop: ignition_chance}
destroy: self
spawn: {object: burning_tinder}
signal: lit
# 外した回は火口だけが無駄になる
- weight: 10
destroy: self
signal: not_lit
成否は signal(GameElementDefinition.md 9.8 節)が告げます。 火口はどちらの回も同じように
消えるので、レーンの上では 30 分かけて札が 1 枚減っただけに見え、外した回が「何も起きなかった」と
区別できません。火種が生まれたかどうかを札の増減から読ませず、起きたことを火口の札の上へ出します。
雨で起こせないこと(3.1.1 節)を持つのは conditions で、pick の重みではありません。 条件を
満たさない組み合わせはそもそも候補にならないので、外した回と違って火口は減りません——雨の中で
何度も試して火口を使い切ることにはなりません。条件の葉は 8 節の炉の雨と同じもので、あちらは
火力を削り、こちらは可否を閉じます。
# 炉の側が宣言する
interactions:
ignite:
trigger: {drag: {object: burning_tinder}}
conditions:
# 火が生きている炉には置き直せない
- {reason: already_lit, prop: heat, in_stage: out}
- {reason: no_fuel, prop: fuel, gt: 0}
destroy: instrument
# 種火の段のいちばん下から始まる
set: {self: {heat: 1}}
火が生きている炉は火種を断ります。 置くのは種火 1 つぶんなので、燃えている炉へ重ねると火種を
失ったうえに火力がそこまで落ちます。断る理由を名乗るので、プレイヤーには落とす前に届きます
(CardInteraction.md 2.1 節)。火を大きくするのは薪で、火種ではありません
(2.2 節)。灯っている松明も同じです——torch の light が同じ理由で断ります。
着火が置くのは種火 1 つぶんだけです。 そこから先は薪が育てます(2.2 節)——火種を落としてすぐ煮炊きが できるわけではなく、炎になるまで数十分かかります。着火の強さを炉ごとに書き分ける必要もありません。
火種は短命です。 1 tick で燃え尽きて消えるので、届くのは同じ土地の中までです。洞窟の中で
起こして外の炉へ運ぶことはできますが、土地を移動すれば必ず燃え尽きます——道 1 本には最低 1 tick
かかるからです(TerrainGeneration.md 3.5 節)。火起こしからの火は、その土地で
使い切ります——火を別の土地へ運ぶには、燃え尽きない入れ物、つまり灯した明かりが要ります(3.1.2 節)。
薪の入っていない炉も火種を断ります。 火を育てるのは薪で、種火だけでは残らないからです(2.2 節)。
断る理由を名乗るのは already_lit と同じです(CardInteraction.md 2.1 節)。
だから薪が先です。 断られているあいだも火種は燃え尽きへ向かうので、その場に薪が無ければ、組み直す より先に火種を失います——薪を取りに土地を移れば、上のとおり必ず失います。火起こしからやり直しです。
雨の日に、火を起こして戻すには屋根の下が要ります(3.1.1 節)。浅い洞窟の無い土地では、雨が上がるまで 火を起こせません——火種を作れる場所がないからです。これが洞窟に「火を絶やさないための価値」を 与えます。 石囲いの炉の種火が翌朝まで生きること(6 節)が最も効くのも、雨の日の洞窟の中です ——雨ざらしの種火は炉を問わず消える(8 節)ので、雨の夜を越せる種火は屋根の下にしかありません。
生きている炉から明かりを運んで戻す道(3.1.2 節)も、雨の屋外では閉じます——運ぶ明かりが雨で 消えるからです(8.2 節)。雨の間に火を戻せるのは屋根の下だけで、そこに火が残っていればそこから 分け、残っていなければそこで起こします。
夜の暗さの側は動きません(IlluminationSystem.md 5.1 節)。
あちらが「唯一の戻り道」と呼ぶのは暗がりから手元の明るさを取り戻す道で、明かりを運ぶには
その明かりが既に灯っている——つまり暗がりに落ちていない——必要があるからです。
3.1.1 雨の日は、屋根の下でしか火を起こせない【確定】
雨の降っている屋外では、火が起こせません。 成功率が下がるのではなく、できない側に線を引きます
——雨に打たれた火口は、摩擦で得た熾を受け止められないからです。屋根の下——浅い洞窟
(../world/Dwellings.md 5.1 節)——なら、降っていても起こせます。
濡れることを燃料の側では表しません。 雨ざらしの薪が炉へ運ぶ fuel(2 節)は変わらず、炉も雨で
崩れません(8.1 節)。雨が閉じるのは着火の 1 点だけです。
出どころ: #656(雨の日は屋外で火が起こせない)
3.1.2 炉と明かりの間では、火の在る側から無い側へ移る
炉と持ち歩ける明かり(lightable)を重ねると、火の在るほうから無いほうへ移ります。 どちらの向きも
火種は要りません——火種は火の無いところへ火を立てるための物で、既に在る炎を分けるのに摩擦発火を通す
理由がないからです。どちらの向きでも、火の在る側は何も失いません——分けた炎は薪を余分に食わないので
炉の火力にも薪にも触れず、火を渡した松明も灯ったままです。
# どちらも炉の側が宣言する。炉を灯す向きが置くのは、炉の着火(3.1 節)と同じ種火 1 つ
interactions:
ignite_from_flame:
trigger: {drag: {tag: lightable}}
conditions:
- {reason: no_flame_carried, subject: instrument, prop: lit, gt: 0}
- {reason: already_lit, prop: heat, in_stage: out}
- {reason: no_fuel, prop: fuel, gt: 0}
set: {self: {heat: 1}}
light_from_flame:
trigger: {drag: {tag: lightable}}
conditions:
- {reason: fire_out, prop: heat, in_stage_or_above: ember}
- {reason: already_lit, subject: instrument, prop: lit, eq: 0}
set: {instrument: {lit: 1}}
炉を灯す向きも、薪の入っていない炉は断ります——火を育てるのは薪で、種火だけでは残らないからです (2.2 節)。火種を落とすとき(3.1 節)と同じ条件です。
どちらの向きも断るとき、プレイヤーへ届くのは 1 つだけです——同じ相手を受ける組み合わせが複数
落ちたら、画面は宣言順で先頭の理由を出します(CardInteraction.md 2 節)。
だから炉を灯す向きを先に宣言します。 後ろに置くと、灯った松明を薪の無い炉へ重ねたときに届くのが
「この炉は消えている」になり、火を持って来た側から見て逆向きの説明になります。
この順は選び取ったもので、ただ取りではありません。 先頭を取れるのは片方だけなので、どちらも 火を持っていない場合——灯っていない明かりを消えた炉へ重ねる——に届くのが「この炉は消えている」から 「この明かりは灯っていない」へ入れ替わります。どちらも真で、どちらも相手の側の事実は言いません。 薪の無い炉に火を点けようとする場面のほうが起きやすい(火種でも同じ断りが「薪が先」を教えている、 3.1 節)ので、そちらを取っています。
火起こしをやり直させないのは、そうすると松明が割に合わないからです。 灯すたびに火口と火起こし具を
通すと、松明1本にかかる手間が、その1本が燃える時間を超えます
(ContentSkeleton.md 8.1.1.4節が両方の数を持ちます)。
日暮れ前の段取り(IlluminationSystem.md 5.1節)は、どちらの向きでも
崩れません。 どちらの向きも生きている炉から始まるからです——明かりを灯すにも、その明かりで別の
炉を灯すにも、まず分けてもらえる炎が要り、その炉を明るいうちに立てておくことが要求そのものです。
炉が無い場所で明かりが要るなら、火起こしから通す道(3.1節)が残っています。
炉を灯す向きが開いていることで、火が土地を越えます。 松明は道を何本も渡れるだけもつので、 生きている炉がどこかに在れば、そこから火を運んで別の土地の炉に立てられます。火起こし具と火口を 持ち歩く理由が消えるわけではありません——運べるのは松明が燃え尽きるまでの間だけで、島から火が絶えれば 火起こしへ戻ります。どちらを選ぶかは、生きた炉までの遠さと天気が決めます(3.1.1 節)。
3.2 火口になるのは繊維状のものだけ
枝には直接火をつけられません。 摩擦で得られるのは米粒ほどの熾で、それを受け止めて炎に育てられるのは ほぐした繊維・綿状のものだけです。細い小枝でも太すぎて火は移りません。火口 → 焚き付け → 薪という 順に太くしていくのが、道具のない火起こしの実際です。
| 火口 | 手に入れ方 |
|---|---|
| 枯れ草 | 拾う(道具が要らない) |
| ヤシの実の皮 | 熟した実の皮をほぐす(刃物が要る、coconut.yaml) |
| 植物繊維 | 掻き取る(刃物が要る、fiber.yaml) |
道具の要らない火口を 1 つ残すことが要件です。 火口が刃物を要る物ばかりだと、火が石器の後ろへ回って
しまい、「きりもみ式が道具も紐も要求しない」ことで保証されている火スキルの立ち上がり
(SurvivalItems.md 1.1 節)が崩れます。乾いた土地でだけ拾える枯れ草が
その役です。
火がついた後は、素材の違いを見ません。 どの火口から起こしても burning_tinder 1 種類になります。
火種にできることは炉へ移すことだけで、そこに枯れ草とコイアの差を持たせても、増えるのは型の数だけ
だからです。
火口は燃料にもなります。 ヤシの実の皮は火口にも薪にもなりますが、組み合わせる相手が違うので迷いは 起きません——火起こし具と合わせれば火口、炉と合わせれば燃料です。
3.2.1 火口は湿り、乾かせば戻る
火口は moisture(吸った水)を持ち、その段が着火の重みを押し下げます。 名前を素焼きの壺
(pottery.yaml)と共有するのは、同じ「含んでいる水が抜けていく」を指すからで、効かせ方は違います
——壺は残った水の値そのものが割れる重みになり、火口は段ごとの押し下げになります。乾き切れば押し下げは
無くなります。
# 火口の側(ignitable trait)が宣言する。押し下げ量はどの火口にも同じ
moisture:
value: 0
range:
min: 0
max: 24
gauge: {min: good, max: bad}
stages:
- {name: dry}
- name: damp
min: 8
passives: [{modify: {self: {ignition_chance: -30}}}]
- name: sodden
min: 16
passives: [{modify: {self: {ignition_chance: -50}}}]
濡れるのは、地面に出している火口が野ざらしの雨に打たれたときだけです。 屋根の下
(ContainerSystem.md 6 節の sheltered)でも、鞄や籠の中でも濡れません
——干し場が食べ物へ引いているのと同じ門です(drying.yaml)。持ち歩いている間も濡れることにすると、
雨の中を歩いただけで手持ちの火口が全部湿り、屋根の下へ逃げ込んでもそこには日が差さないので戻せません。
乾かすには、地面に広げて強い日差しに当てます(-3/tick、境目は塩田・干し場と同じ
EV +14——../world/SurvivalItems.md 10 節、EV という尺度は
IlluminationSystem.md 1 節)。そのうえで、どこに在っても
抜けていきます(-1/tick)——これがあるので濡れた火口が詰みになることはありません。雨宿りした
洞窟に日は差しませんが、待てば戻ります。
画面に出るのは湿りのバー 1 本です(CardView.md 8 節の gauge)。火口ごとの
素の値は型ごとに固定で、カードの名前と絵が既に言っている——1 枚ごとに動くのは湿りのほうなので、
読ませるのもそちらだけにします。ignition_chance そのものをバーにする道はありません:ゲージは
range を要求し(GameElementDefinition.md 6.8 節)、range は実効値をクランプする
(同 8.3 節)ので、腕の上乗せ(expert で +120)が頭打ちになります。
火口は束ねられるままです。 束ねた札が映すのは代表 1 つの湿りなので、乾いた束へ濡れた 1 つを
混ぜると、その 1 つは札の上では見えなくなります(CardView.md 8 節)。干して
いる食べ物が既に持っている形と同じ(drying.yaml の drying_remaining)で、1 枚ずつの札に割ると、
束で拾う火口が枠を食い尽くします。
押し下げは、どの火口にも同じ量です。 割合で効かせないのは、腕の上乗せが加算である
(../world/Skills.md 5.2 節)のと同じ器に揃えるためです。同じ量なので、
素の値の小さい火口を足すと重みが 0 以下へ潰れえます——潰れた火口はその段で絶対に付かなくなり、
確率のはずが可否の線になります。tests/world-codex/fireYaml.test.ts が全火口について見張ります。
3.3 火起こしの宣言は、火口の側に置く
ドラッグ型の操作は素材の側に宣言する(GameElementDefinition.md 12.3 節)ので、火起こし具ではなく
火口が light を持ちます。宣言は 1 つで、火起こし具を火口へ重ねても火口を火起こし具へ重ねても同じ
light が実行されます——成否の pick を 2 箇所へ書く必要はありません。
4. 薪の消費を火力の段に置ける理由
heat が温度ではなく火力だからです。 火力とは単位時間あたりに出る熱のことで、それはそのあいだに
食っている薪の量そのものです。これらは同じ現象の表と裏で、「熱いほど速く燃える」のではなく「速く
燃えているから熱い」——因果は後者の向きです。だから消費を heat の段に書くのは別の概念での代用ではなく、
定義をそのまま書いていることになります。
もし heat を温度として定義したら、この置き方は誤りになります。火が消えた直後のまだ熱い炉が薪を食い
続けてしまうためで、そのときは「燃えているか」を別に持つ必要が出ます。
火が生きているかを別に持たないのも、同じ理由です。 火力が種火の段以上にあることがそのまま
「燃えている」です(3 節)。薪の消費・加熱・冷めのすべてを heat の段に並べられるのは、この 1 つの
定義から出ています。
炉ごとの差は、火力と薪の上限、そして種火の衰えだけです(6 節)。薪の減りと加熱の速さはどの炉でも 同じ表(2.3 節)に従い、燃料の側は、くべるとどれだけ増えるか(2 節)だけを持ちます。
5. 石は火の中ではなく、火のまわりに積む
石を炉へ運ぶと stones が 1 増え、必要数に達した瞬間に次の段の炉へ置き換わります。
# 焚き火の側が宣言する
interactions:
add_stone:
trigger: {drag: {object: stone}}
duration: 5
destroy: instrument
add: {self: {stones: 1}}
props:
stones:
value: 0
range:
min: 0
max: 3
on_max:
destroy: self
spawn: {object: three_stone_hearth}
range.max を必要数に置き、そこへ届いた瞬間に反応させるのは、耐久値 0 での自壊と同じ形です
(GameElementDefinition.md 6.3 節)。段上げは箱のレシピにしません。地面に石を運んで積むだけの作業で、材料を箱へ入れて待つ
形にする理由がないためです。
置き換えなので、段を上げると火は消えます(炉を組み直しているため)。
5.1 石は既存の stone をそのまま使い、炉は一人用の大きさになる
専用の大きな石は導入しません。 既存の stone(1kg・手に持てる大きさ、locations.yaml)を運んで積みます。
石囲いの炉まで組むのに要る石を全部担いでも、最も担げない担ぎ手が通れなくなる線
(Characters.md 荷重の効き方節)の半分に収まる(tests/world-codex/fireYaml.test.ts)ので、運搬そのものが
関門にはなりません。
その結果、炉は一般に想起されるかまどよりだいぶ小ぶりな、一人分の器が 1 つ載る大きさになります。 これは制約ではなく、この島に居るのが 1 人だという事実の現れです。
三石が器を持ち上げる高さも 10cm 弱なので、器の下に入るのは炎ではなく熾火です。2 節が焼く・煮るに段の 下限を設けないのは、この寸法とも噛み合っています。
石囲いの炉の種火が翌朝まで生きるのも、この大きさで成立します。種火が長く保つ主因は灰に埋めて空気の 流れを絞ることで、石が担うのは風防と輻射だからです。石の熱容量に頼る設計なら、この大きさでは足りません。
6. 炉の段
| 段 | 炉 | 作り方 | 火の中の枠 | 器の枠 | fuel の上限 |
heat の上限 |
種火の衰え |
|---|---|---|---|---|---|---|---|
| 1 | 焚き火 | 小枝 3 本 | 2 | なし | 30 | 30(炎まで) | -2/tick |
| 2 | 三石のかまど | 焚き火 + 石 3 | 2 | 1 | 30 | 30(炎まで) | -1/tick |
| 3 | 石囲いの炉 | 三石のかまど + 石 8 | 3 | 2 | 120 | 100(高温まで) | -0.03125/tick |
種火が保つ長さは、種火の段へ落ちたときの火力から段の下限(2.3 節)を割るまでを、種火の衰えで割った ものです。
石囲いの炉の「種火が翌朝まで生きる」は、日没に薪が尽きた火が種火のまま日の出を迎えることです。
いちばん弱い燃え方——熾火の段の下限——で薪が尽きても、熾火の衰え(2.3 節)で種火の段へ落ちてから
一晩(48 tick)を越えるだけ遅く衰えます。見張るのは tests/world-codex/fireYaml.test.ts。雨をしのげる
場所か、降らない夜の話です——雨ざらしの炉は種火ごと削られ、炉の差では残りません(8 節)。
どちらの枠も同じ fire スロットの cells に並びます(1.1 節)。枠は焼く物と焼く石のためのもので、
薪は枠を使いません(2.1 節)。
段ごとに増えるものは 1 つずつです。
- 焚き火 → 三石のかまど: 器を載せる場所ができます。三石が支点になって初めて器を火にかけられる、 という現実そのままで、器を持たないうちに作っても何も変わりません。
- 三石のかまど → 石囲いの炉: 種火が翌朝まで生きます。加えて火力の上限が上がって
blazeに届き、 積める薪も増え、火床が広いので熾火を掻き分けて器を 2 つ置けます。
梯子の中で blaze に届くのは石囲いの炉だけですが、それは段に禁止を書いた結果ではなく、
heat の上限が 30 と 100 で違うことの帰結です(2.3 節)。
土器を焼く炉は、この梯子の外にあります。 覆い焼きの炉(src/assets/world-codex/pottery.yaml)は
粘土から直接築く使い捨ての設備で、石囲いの炉と同じ heat の上限を持ちますが、fire スロットが土器
しか受けません。逆に石囲いの炉は土器を受けません。どちらで何が焼けるかは、火力ではなく枠が決めて
います——焚き火が器を載せられず、三石で cookware が増えるのと同じ足し方で、焼成のために新しい
仕組みを持ち込まずに済みます。上位の焼成設備(恒久窯)は足しません
(../world/SurvivalItems.md 4 節)。
燻し小屋も梯子の外にあります。 燻し小屋(src/assets/world-codex/smoking.yaml)は heat の上限を
種火の段の中(4)に置いた炉で、梯子のどの炉よりも低い——熾火へ届かないので、fire スロットへ
吊るした食べ物は焼けません(7 節)。焼けないことを条件で止めてはおらず、上限がそこまでしか無い
という同じ形で分かれます。種火の衰えは覆い焼きの炉と同じ -0.5/tick です。
何のための炉かは ../world/SurvivalItems.md 11 節が持ちます。
器を持たない段階でも煮炊きはできます。 焼け石を水へ落とす方法(9 節)は容器に耐火性を要求しない ので、炉の段ではなく石と時間だけで成立します。三石のかまどが効くのは甕を得てからで、この順序は 仕様ではなく「ヤシの殻を直火にかけると焦げる」という事実から出ています。
7. 加熱の受け渡しは、子のcooking_progressへのadd
炉は、火の中にある子の cooking_progress を毎 tick 進めます。量は heat の段が決めます。
料理側が書くのは「未加熱の物が cooking_progress を持ち、上限に達したら焼き上がりへ置き換わる」だけで、
炉のことも火のことも知りません。
# 炉のheatのstagesが宣言する(4節の薪の減りと同じブロックに並ぶ)
- name: flame
min: 20
passives:
- add:
self:
fuel: -1.5
child:
cooking_progress: 3
# 料理側(本書の対象外)が宣言する
cooking_progress:
value: 0
range:
min: 0
max: 24
on_max:
spawn: {object: roasted_meat}
destroy: self
これが火と料理の境界です。本書は「熱がどこからどれだけ来るか」までを決め、「何分でどうなるか」は
料理側の range.max が持ちます。
焼き上がるまでの残り時間は、火にかかっている間だけ札の上に出ます(CardView.md
15 節)。出すかどうかを決めるのはこの add が今効いているかどうかで、画面側は炉のことを知りません。
器の中身は、器が自分で加熱します。 炉の子は器であって、中身は器の子(炉から見れば孫)です。
炉が孫まで手を伸ばすのではなく、器が「炉の上にいるあいだ、自分の中身を加熱する」を自分で持ちます。
下の宣言は未実装です——cookware を名乗る型がまだ無く(1 節)、器を足すときに書く形を示しています。
# 器の側が宣言する
passives:
- conditions:
- {subject: ancestor, prop: heat, in_stage: coals}
add:
child:
cooking_progress: 1 # <!-- codex: fire.yaml traits.hearth.props.heat.stages.2.passives.0.add.child.cooking_progress -->
- conditions:
- {subject: ancestor, prop: heat, in_stage: flame}
add:
child:
cooking_progress: 3 # <!-- codex: fire.yaml traits.hearth.props.heat.stages.3.passives.0.add.child.cooking_progress -->
器は段ごとに 1 ブロックを並べます(GameElementDefinition.md 8.5 節)。炉の側と同じ速さを 2 箇所に
書くことになるので、値の出所は 2.3 節の表 1 つに保ちます。
祖先に heat が無ければ条件は偽になる(GameElementDefinition.md 14.1 節)ので、器が炉から降りていることを表す条件は要りません。
「炉に載っているか」を別に問うと、載っている場所の名前が器の側にも書かれることになります。
7.1 直火で焼く物は、そのまま火の中へ入れる
串のような、焼くためだけの中間の物は挟みません。 肉はそのまま火の中の枠へ入れます。灰に埋めて 焼くのは実在する最も原始的な焼き方で、道具を何も持たない段階と噛み合います。
串を挟むと、型と工程が 1 つずつ増えるのにプレイヤーの選択は増えません。串の材料になる小枝は いくらでも拾えるので、持っているなら必ず刺すことになるからです。
見張る理由は、串ではなく焼きすぎが作ります。 cooking_progress の上限で焼き上がりへ置き換わった後、
その焼き上がり自身がまた cooking_progress を持てば、放っておくと焦げます。串が担うはずだった「火の
そばに居る理由」は、料理側の型が 2 段重なるだけで出ます。
一度に焼ける量は枠の数が決めます(段ごとの枠は 6 節の表)。薪は枠を 使わない(2.1 節)ので、この数はそのまま「火のそばに並べられる物の数」になります。
串を後から入れるなら、中間素材としてではなく、1 つの枠に何本も刺せる道具として入れます。器と
同じ形(cookware の枠に入り、自分の子を加熱する)で書けるので、この節の構造は変わりません。
7.2 焼き上がりも進行度を持ち、同じ仕組みで焦げる
進行度を持つのは食料自身で、炉は進めるだけです。 生肉は自分の cooking_progress を進め、上限へ
届いたら自分を破棄して焼けた肉を生みます。焼けた肉も同じ形の cooking_progress を持つので、火から
出さずに放っておくと焦げた塊へ変わります。焦げた塊は進行度を持たず、そこで鎖が終わります。
生 → 焼き → 焦げ を成り立たせているのは、spawn の既定の振る舞いです
(GameElementDefinition.md 9.4 節)。
intoを書かないので、同じ枠へ置き換わります。 焼けた肉は火の中に残り、そのまま焼かれ続けます。 置き換わる先も枠の受け入れを通るので、鎖に並ぶ型はすべてroastableを持ちます(1.1 節)。 持たない型が生まれると、その枠には入れずに土地のアイテムへこぼれます。destroyをspawnより先に書くので、位置が空いてから生まれます。- 生まれた側のプロパティは自分の型の初期値から始まります。 進行度は引き継がれないので、焦げるまでの
猶予は焼けた肉自身の
range.maxが持ちます。生から焼きより短くすれば、「目を離すと焦げる」が出ます。
火から出せば進行は止まり、戻りません。 加熱の add が効かなくなるだけなので、半分焼けた肉を
持ち歩き、後で火へ戻せば続きから焼けます。食べ物が冷めて生に戻ることはないので、これが正しい振る舞いです。
進行度が違っても、同じ型は 1 つのスタックにまとまります(SlotSystem.md 5 節。
まとまる条件は型だけで、プロパティの値は見ません)。同じ炉の中では全員が同じ速さで進むので
順序は崩れず、stack_order(同 6 節)に cooking_progress を ascending: false で置けば、一番進んだ
ものがスタックの手前に出ます。焼き上がった 1 個は別の型になるので、そこで自然にスタックが分かれます。
8. 雨は火力を削る
雨天で野ざらしの炉は heat が余分に減ります。 消火を判定する専用の仕組みは持たず、火が死ぬ経路を
3 節と同じ 1 本に保ちます。
# 炉の側が宣言する
passives:
- conditions:
- {subject: ancestor, prop: sheltered, eq: 0}
- {subject: ancestor, prop: weather, in: [light_rain, heavy_rain, storm]}
add:
self:
heat: -4
薪の尽きた雨ざらしの種火は、どの炉でも 1 tick で消えます——雨の削りは種火の段の幅に届き、炉ごとの
種火の衰え(6 節)はその前では差になりません。見張るのは tests/world-codex/fireYaml.test.ts。雨の中で
火を育てるのは炉の段ではなく薪で、育ちが雨の削りを上回る薪の段(2.2 節)が載っている間だけ育ちます。浅い洞窟
の中(../world/Dwellings.md 5.1 節)や将来の屋根の下では sheltered が 1 になり、
雨の効果自体が消えます(ContainerSystem.md 6 節)。雨をしのげるかを見る道はこれだけで、洞窟が天気を
宣言し直すような別の道は持ちません。
炉は風(wind_speed)を読みません。風を切る効果は石囲いの炉の種火の衰え(6 節。石が風防になること、5.1 節)に、嵐の強風はこの節の
heat の減少に畳んであります。
8.1 炉そのものは、雨で崩れない【確定】
雨が削るのは火力だけで、炉は残ります。 組んだ炉は火が消えても崩れず、雨が上がれば火種を運んで また灯せます。炉に耐久値を持たせて雨で削ることはしません。
出どころ: #656(雨の日は屋外で火が起こせない)
8.2 雨ざらしの明かりは消える【確定】
雨の降っている屋外では、灯っている明かりも消えます。 拠点の火を絶やしたら、屋根の下——浅い洞窟
(../world/Dwellings.md 5.1 節)——に火を置いていない限り、雨の間は松明で
戻せません。遠出で持つ松明も雨で消えるので、雨の日は暗い土地へ入れなくなります。
条件は炉の雨(8 節)と同じ葉で、明かり(lightable)の側が lit へ宣言します。火口の湿り(3.2.1 節)と
違って、地面に出しているかは問いません——手に持って歩く松明が消えることが、この節の中身だからです。
消えた明かりは燃え尽きたのではないので物として残り、また灯せます。
# 明かりの側が宣言する
lit:
passives:
- conditions:
- {subject: ancestor, prop: sheltered, eq: 0}
- {subject: ancestor, prop: weather, in: [light_rain, heavy_rain, storm]}
add:
self:
lit: -1
出どころ: #2404(雨ざらしの明かりは消える。2026-09-29に回答)
9. 火が与えるもの
火が与えるものの品揃えは 9.3 節が決めます。
9.1 焼け石は、炉から取り出せる唯一の産物
炉に入れた石は熱を溜め、hot_stone に置き換わります。 石は火の中の枠へ入るために roastable
(1.1 節)を得ます。fire スロットへ入れた石は heat_soak を溜め、上限に達すると hot_stone へ
置き換わります。炉から出した焼け石は heat_soak が減り、0 で普通の石に戻ります。水を張った器へ
落とせば、器に耐火性がなくても中身が沸きます(SurvivalItems.md 4 節)。
熱の受け渡しは料理と同じ 1 本です。 炉は火力の段ごとに、子の cooking_progress と並べて
heat_soak を進めます(7 節)。持たない側では黙って捨てられるので、炉は相手が料理か石かを知りません。
| 値 | 意味 | |
|---|---|---|
heat_soak の上限 |
12 | 溜まる速さは火力の段が決める。炎(3/tick)、熾火(1/tick) |
| 炉の外での減り | -3/tick | 火から離すと常温へ戻っていく |
| 湯を沸かせる下限 | 6 | 炉から出した石が、ここを割るまでが持ち時間 |
| 湯が冷める速さ | -1/tick | 冷め切ると水に戻る |
炉から出したかどうかを、石は問いません。 減るのは「祖先に燃えている炉が居ないとき」で、炉に 入れたまま火が消えた場合も同じ 1 行で冷めます。
器の中と外で減り方は変えません。湯へ落とした石は溜めた熱を一度に使い切り、 その場で普通の石へ戻ります。急に冷めることは、減る速さではなく使い切ることが表しています。
沸かした湯は hot_water_liquid で、水とは別の液体です(liquid_containers.yaml)。湯へさらに
焼け石は落とせず、水と混ぜて薄まることもありません。残っている熱が抜け切れば水へ戻ります。
湯は注ぎ分けられません。 heat_soak が持っているのは量ではなく熱さそのもので、注いだ先が何度から
始まるかを既存の宣言では書けません——量に比例して移す transfer(GameElementDefinition.md
9.5 節)では表せず、注ぎ元の値を読んで代入する術もありません。注げるようにすると、ぬるくなった湯を
移すたびに沸かし直したことになります。
要る熱は器の大きさに依りません。 溜め切った石 1 つで、ヤシの殻(250mL)も甕(4,000mL)も沸きます ——量に応じた熱を要求するには、器ごとに違う「沸くのに要る熱」を持たせることになり、今はその読み手が 居ません。
9.2 暖と明かりは、置かれた場所のプロパティを押し上げる
熱以外に炉が周囲へ与えるものは、いずれも parent への modify(GameElementDefinition.md 8.3 節)
1 つで表します。 条件は「火が生きていること」(heat が ember 以上、3 節)だけで、種火か炎かでは分けません。
- 暖:
ambient_temperatureを +8 上げます。空が最も冷えるとき(涼しい季節 −5 + 夜 −3 = 12℃、ClimateSystem.md1 節)を、ちょうど平年の 20℃ へ戻す量です。土地が持つ 海抜ぶんの差(同 1.1 節)はこの上に乗るので、戻り先は土地で変わります——島でいちばん低い山頂の 夜(9℃)では 17℃ までで、平年には戻りません。どの土地でも素のchill_point(16℃、VitalsSystem.md8.4 節)は上回るので、火のそばに居れば冷えないことは変わり ません。 - 明かり:
hand_brightnessを +11 上げます。夜でも手元の作業ができます。
届き先を決めるのは、炉ではなく置かれた場所です。 場所は世界の値を土台(base)に自分の差を足した
ambient_temperature と hand_brightness を持ち、視界の明るさ(looking_brightness)は持ちません
(core.yaml の location trait。IlluminationSystem.md 2 節・6 節)。
そのため炉のある場所だけが暖まり、隣の土地も世界も動かず、据えた炉の明かりは手元にしか届きません。
炉自身はどこへ効くのかを知りません。
9.3 火が与えるのは、産物と、置かれた場所へ届くもの【確定】
火が与えるものは次のとおりです。 炉から取り出せる産物(焼け石、9.1 節)と、置かれた場所へ届くもの (暖と明かり、9.2 節)で、どちらも火の連鎖(2 節)の外にあります。
出どころ: ユーザーの指示(火が与えるのは、産物と、置かれた場所へ届くもの。#2026)
10. 火スキルとの分担
炉は「今どれだけ燃えているか」を、火スキルは「火を扱えるか」を持ちます(Skills.md 2.2 節)。
どちらも段を持ちますが、見ているものが違います。
| 決めるもの | 表し方 | |
|---|---|---|
炉の heat の段 |
今この炉で何ができるか | 薪が育て、火が冷ます釣り合い(2.2 節) |
| 火スキルの段 | 着火が成功するか | 着火の pick の重み |
スキルの段が効くのは火起こしの pick の重み(3.1 節)だけです。火がついた後の火力にスキルは
効きません——熟練者の焚き火が同じ薪でより熱くなることはないためです。Skills.md 2.2 節が火の担う
こととして挙げている残り——種火を保つことと高温を出すこと——を持つのは炉の側で、保つ長さは
炉ごとの冷める速さ(6 節)、高温は石で囲うこと(5 節)が決めます。どちらも腕を要求しません(石を
運べば誰でも囲えます)。腕が届くのは、その炉に火を入れられるかどうかまでです。
効かせ方は、成功の重みへ積む上乗せです(../world/Skills.md 5 節)。重みが
読む ignition_chance は、火口ごとの素の値(枯れ草 60・植物繊維 80・ヤシの実の皮 100)へ、起こす人の
腕(ignition_ease)が base の土台として積まれ、湿りの段(3.2.1 節)が modify で押し下げたものです。
外れの重みは 10 です。乾いた火口なら、どの火口・どの腕でも 1 回で 85% 以上付きます——2 回続けて 外すことは稀です。
この水準を選んだのは、外した回に失われるのが火口 1 つと 30 分だからです。 1 回程度の失敗なら 段取りに織り込めますが、何回失敗するか分からないと、その先の予定を組めません——「何度も外して 火が付かない」回が珍しくない状態は、火口の消費ではなく時間の読めなさとして効きます。減らし切らずに 稀な失敗を残すのは、火起こしを「押せば必ず進む工程」にしないためです。
残っている失敗のうち、プレイヤーが動かせる幅は湿り(3.2.1 節)が持ちます。 乾いた火口の成功率が 下限で、そこから下げるのは濡らしたときだけ——避ける手段(屋根の下・入れ物・日に広げる)が見えている ことが、確率に関与できる余地そのものです。
火口ごとの差が腕とともに縮むのも狙いどおりで、火口ごとに上乗せを変える調整は入れません
(../world/Skills.md 5.2 節)。上の水準は
tests/world-codex/fireYaml.test.ts が全火口 × 全段で見張ります——外れの重みを緩めても、火口の素の
値を下げても赤くなります。腕の上乗せを削っても、この水準は破れません——縛っているのは上乗せの
無い novice の側なので、そちらは刻みそのものを tests/world-codex/skillsYaml.test.ts が見張ります。
11. 未決事項・今後の検討課題
- 火が燃え移ること(延焼)。炉の火を意図して分ける道はある(3.1.2 節)が、意図せず燃え移る経路は無い
- 雨の屋外でも消えない明かりを、上位の明かりとして置くか。雨ざらしの明かりは消える(8.2 節)ので、 置けば雨の日に暗い土地へ入る道がそれだけになる
- 煙。虫除けと、遠くから見えることのどちらを表すか。燻製による保存は煙を持たずに入りました
——燻し小屋(
smoking.yaml)が読むのは火力そのもので、煙という概念は世界にまだ無い - 沸かした湯の使い道。今は水と同じく飲めるだけで、煮炊きのレシピがまだ無い(9.1 節)
- 段上げで火が消えること(5 節)を、種火だけ引き継ぐ形に変えるかどうか