荒天の押し流しを入れた航海のレポートの読み方
数値は stats/voyage_storm.yaml にあります。
tests/diagnostics/voyageStormStatsReport.test.ts が、海区と筏を実体化した世界で
出航地点から本土まで実際に渡らせて測ったものです。海区の網・荒天の押し流し方・天気と風向きの
引き方を変更したら再生成します。
npm run stats:voyage-storm
この文書は手書きで、再生成しても書き換わりません。 持つのは読み方——何を測ったか、どこに線を 引いたか、何を数えていないか——だけです。数値そのものは1行も書きません(書けば、再生成した YAMLとずれます)。
静的に解いた側との分かれ目
VoyageStats.md が読む stats/voyage.yaml は、定義だけ
から解いた値で、実行を通していません。押し流しだけはそこに乗せられません——何区間ぶん動くかが
実行時にしか決まらないからで(Voyage.md 3.8 節)、こちらは世界を回して測ります。
stats/voyage.yaml |
stats/voyage_storm.yaml |
|
|---|---|---|
| 測り方 | 定義だけから解く | 海区と筏を実体化して時計を進める |
| 押し流し | 数えない(起きなかった場合の下限) | 数える |
| 針路 | 出航地点ごとに近道と遠回りの両方 | 出航地点ごとに、区間の最も少ない1本だけ |
押し流された先から先へ進む道は、残り区間の最も少ない辺を採ります。 遠回りを選ぶ理由は実り
(Voyage.md 3.3 節)であって、押し流しの測りに要るのは最短で渡り切る形だけ
なので、遠回りを最初から選ぶ針路はこの表に現れません。
YAMLの節
| 節 | 中身 |
|---|---|
meta |
何本の世界を、1本の世界と出航地点につき何回渡らせたか |
input_fingerprint |
シミュレーションの入力ファイルと、その中身のハッシュ |
baseline |
押し流しを数えない側の、出航地点×季節ごとの区間数と日数 |
course_storm |
押し流しを入れた実日数の分布(出航地点×季節) |
course_crossings |
漕ぎ出した回数の分布。空振りになった渡りも数える |
sweeps |
1回の航海あたり、何回押し流され、何回の渡りが空振りになったか |
storm_cost |
押し流しが足した分——baseline との差 |
この表とYAMLが食い違うと npm test が赤くなります。 表に挙げた節がYAMLに在って空でないことと、
表に無い節がYAMLに無いことの両方を、生成元のテストが見ます。
指紋が見るもの
input_fingerprint が見るのは core.yaml と voyage.yaml だけです。世界を回す側が読むのはこの2つ
——天気と風向きの引き方(前者)と、海区の網・押し流しの卓(後者)——で、ここが変われば再生成しないと
npm test が赤くなります。
日数の分母(1日ぶんの自由時間)は指紋の外です。 島の献立を触れば動きますが、そこまで含めると
YAMLを1行直すたびに再生成を要求することになります。外れたぶんは baseline 節の再計算で
突き合わせます——あの節は押し流しを数えずに出る値なので、世界を回さずに作り直して比べられます。
どちらも見ないのは、シミュレーションのコードを変えて古くなったぶんです。 そこは
regenerate-stats.yml が main で丸ごと作り直して
拾います。
押し流しはエンジンが起こす
海区も本土も筏も実体化して時計を進めるだけで、押し流しは src/assets/world-codex/voyage.yaml の宣言が
起こします——さらされた時間の溜まり方も、風下がどちら側かも、分かれ道でどちらへ流されるかもです。
シミュレーションが書いているのは乗り手の振る舞いだけで、どの辺を選び、いつ見張り、いつ漕ぎ出すかを
決めます。
島は作りません。 押し流しに要るのは world(天気と風向き)と海区と筏だけで、島の地形まで実体化すると 1 tick の仕事が数十倍になります。
日数の物差し
days は出航から到達までの実日数で、VoyageStats.md の days と同じ物差しに
なるよう、航海の仕事は1日ぶんの自由時間しか進みません。残りの時間は筏が漂ったまま過ぎます。
この線は押し流しの量そのものに効きます。 押し流しは筏が浮かんでいる限り進む(乗り手が何を していようと関係ない)ので、実日数を詰めると嵐にさらされる時間が実際より短く出ます。
押し流しの起きない季節では、course_storm は baseline へ戻ります——同じ物差しであることは、
そこで確かめられます。
何を乗せて、何を乗せていないか
- 渡るのに要る時間は、静的に解いた側から採っています(
stats/voyage.yamlのwind_legsと同じ 出どころ)。漕ぎ出すときの風向きでその1区間ぶんを引くので、季節ごとの風の重みはbaselineと 同じように効きます。筏の側の事情(sail_speed)はどちらにも乗っていません。 - 見張りが明るく穏やかなうちだけであること(
Voyage.md3.10 節)は見ていません。 静的に解く側と同じ線で、1日のどこに時間が入るかは要る時間の量とは別の問いです。嵐で見張りが閉じる 分も同じ——押し流しが進むのはまさにその時間なので、ここが出す日数は短めに出ます。 1航海ぶんの 見張りが嵐を引いた明るい時間に収まる根拠は同 3.10 節です。 - 引き返しは数えていません。 押し流されても乗り手は本土へ向かい続けます——引き返すかどうかは
残りの水と、戻り・進みの海区の数を秤にかける話(
GameEndings.md12.5 節)で、この表は渡り切るのに何区間かかるかだけを出します。 - 釣りも積荷も乗り手の体も測っていません。 食料と水が保つかは
Voyage.md3.9 節が持ちます。 - 季節は、漕ぎ出したときのものです。渡っている間に季節が変われば、その先はもう別の季節の海に なるので、窓の値打ちは季節の差そのものよりいくらか薄く出ます。
押し流された向きの読み方
sweeps の backwards・forwards は、本土までの残り海区数が増えたか減ったかで分けています。
宣言の側の「本土の側/島の側」とは分かれ目が違い、分かれ道から遠回りの側(沖の潮目)へ流された回は、
宣言では本土の側でも残り海区数は増えるので backwards に入ります
(Voyage.md 3.8 節)。
鎖の端で風下の隣を持たない回は、どちらにも入りません——筏が動かないので、押し流しそのものが 起きなかった回と区別しません。
このレポートは判定を出さない
季節の窓が期限として働くかは、ここの数字を読んで Voyage.md が決めます。
ここが出すのは、その判断に要る差だけです。